commit a60f1c89826e9ee29d4087248e8199f85e764c40 Author: Abhishek Mali Date: Wed Nov 5 10:06:53 2025 +0530 ionic project code diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..88b4d85 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 3 Safari major versions +last 3 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..112a9ec --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,79 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "tsconfig.json", + "e2e/tsconfig.json" + ], + "createDefaultProgram": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/component-class-suffix": [ + "error", + { + "suffixes": [ + "Page", + "Component" + ] + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": [ + "app" + ], + "style": "kebab-case" + } + ], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": [ + "app" + ], + "style": "camelCase" + } + ], + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "objectLiteralProperty", + "format": null, + "types": [ + "string", + "number" + ] + } + ], + "@typescript-eslint/no-explicit-any": "off", + "no-async-promise-executor": "off" + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended" + ], + "rules": {} + } + ] +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c385424 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pack filter=lfs diff=lfs merge=lfs -text diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..80058f7 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,44 @@ +## Links +- [Ticket Link] +- [Design Link] +- [Images / Working Video Ref.] + +## Describe changes in PR. + +## PR Checklist +Please check if your PR fulfills the following requirements: +- [ ] Tests for the changes have been added (for bug fixes/features) +- [ ] Docs have been added/updated (for bug fixes/features) + +## PR Type +What kind of change does this PR introduce? + + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update (formatting, local variables) +- [ ] Refactoring (no. functional changes, no. API changes) +- [ ] Build related changes +- [ ] Documentation content changes +- [ ] Other... Please describe: + +## What is the current behavior? + +Issue Number: N/A + +## What is the new behavior? + +## Does this PR introduce a breaking change? +- [ ] Yes +- [ ] No + +## Reviewer(s) Notes + > **Known Issues/Limitations** + > > If there are known limitations/issues with the changes can be mentioned here. + > > Note: These are optional points if the raiser found it good to have then can consider it + + > **Dependencies** + > > In such cases we are dividing PR(s) into chunks then it would be good if we add parent / dependent PR so the reviewer would have more idea and also during merging it is known. + > > Note: These are optional points if the raiser found it good to have then can consider it + + > **Additional notes for reviewer** diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..211ee4d --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +*~ +*.sw[mnpcod] +.tmp +*.tmp +*.tmp.* +*.sublime-project +*.sublime-workspace +.DS_Store +Thumbs.db +UserInterfaceState.xcuserstate +$RECYCLE.BIN/ + +*.log +log.txt +npm-debug.log* + +/.idea +/.ionic +/.sass-cache +/.sourcemaps +/.versions +/coverage +/dist +/node_modules +/platforms +/plugins +/www +/.angular diff --git a/.gradle/6.0.1/executionHistory/executionHistory.lock b/.gradle/6.0.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000..c21af03 Binary files /dev/null and b/.gradle/6.0.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/6.0.1/fileChanges/last-build.bin b/.gradle/6.0.1/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/.gradle/6.0.1/fileChanges/last-build.bin differ diff --git a/.gradle/6.0.1/fileHashes/fileHashes.lock b/.gradle/6.0.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000..cb148d9 Binary files /dev/null and b/.gradle/6.0.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/6.0.1/gc.properties b/.gradle/6.0.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..7ec058c Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..968f3f1 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Jan 03 13:08:06 IST 2022 +gradle.version=6.0.1 diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..c160a77 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..d24fdfc --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..baa9e26 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,43 @@ +{ + "[html]": { + "editor.defaultFormatter": "vscode.html-language-features" + }, + "html.format.wrapLineLength": 120, + "[javascript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[json][jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[css][scss][less]": { + "editor.defaultFormatter": "vscode.css-language-features" + }, + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features", + }, + "editor.bracketPairColorization.enabled": true, + "editor.guides.bracketPairs": "active", + "workbench.colorCustomizations": { + "editorUnnecessaryCode.border": "#ff0000" + }, + "typescript.updateImportsOnFileMove.enabled": "always", + "editor.inlineSuggest.enabled": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "cSpell.words": [ + "Anumodana", + "Chaturmas", + "karmā", + "Sampraday", + "Sant", + "shravak", + "Vihaar" + ], + "editor.formatOnSave": true, + "docwriter.style": "Auto-detect", + "files.trimTrailingWhitespace": true, + "tabnine.experimentalAutoImports": true, + "editor.stickyScroll.enabled": true +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..c220c33 --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +# Ionic Project README + +## Prerequisites + +Ensure you have the following installed: + +- [Node.js](https://nodejs.org/) (LTS recommended) +- [Ionic CLI](https://ionicframework.com/docs/cli) - Install via: + ```sh + npm install -g @ionic/cli + ``` +- [Capacitor](https://capacitorjs.com/) (if using native features) + +## Installation + +Clone the repository and install dependencies: + +```sh +# Clone the project +git clone + +# Navigate to the project directory +cd + +# Install dependencies +npm install +``` + +## Running the App + +To serve the app in a browser with live reload: + +```sh +npm run start OR ng serve +``` + +## Building the App + +### Staging + +#### Android Build + +Ensure you have the Android SDK and Gradle installed. Then run: + +```sh +ionic build --configuration=staging && npx cap sync android && npx cap copy android && npx cap open android +``` + +### iOS Build + +Ensure you have Xcode installed (macOS required). Then run: + +```sh +ionic build --configuration=staging && npx cap sync ios && npx cap copy ios && npx cap open ios +``` + +### Production + +#### Android Build + +Ensure you have the Android SDK and Gradle installed. Then run: + +```sh +ionic build --prod && npx cap sync android && npx cap copy android && npx cap open android +``` + +### iOS Build + +Ensure you have Xcode installed (macOS required). Then run: + +```sh +ionic build --prod && npx cap sync ios && npx cap copy ios && npx cap open ios +``` + +## Additional Commands + +To sync native changes: + +```sh +ionic capacitor sync +``` + +To open the native project in Android Studio or Xcode: + +```sh +ionic capacitor open android +ionic capacitor open ios +``` + +Ensure your Ionic CLI and Capacitor are up to date: + +```sh +npm update -g @ionic/cli +npm update @capacitor/core @capacitor/cli +``` diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..fbfdaa9 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,100 @@ +# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml diff --git a/android/.idea/.gitignore b/android/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/android/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/android/.idea/AndroidProjectSystem.xml b/android/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/android/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml new file mode 100644 index 0000000..749a823 --- /dev/null +++ b/android/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/deploymentTargetDropDown.xml b/android/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..282d83f --- /dev/null +++ b/android/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/deploymentTargetSelector.xml b/android/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..8e37224 --- /dev/null +++ b/android/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/encodings.xml b/android/.idea/encodings.xml new file mode 100644 index 0000000..5ab53de --- /dev/null +++ b/android/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/.idea/gradle.properties b/android/.idea/gradle.properties new file mode 100644 index 0000000..e69de29 diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml new file mode 100644 index 0000000..e34606c --- /dev/null +++ b/android/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/migrations.xml b/android/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/android/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/android/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/runConfigurations.xml b/android/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/android/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 0000000..043df80 --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..46e6fcc --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,79 @@ +apply plugin: 'com.android.application' + +apply plugin: 'com.google.gms.google-services' +// apply plugin: 'com.google.firebase.crashlytics' + +android { + namespace 'com.globaljain.android' + compileSdk rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "com.globaljain.android" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode rootProject.ext.versionCode + versionName rootProject.ext.versionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + aaptOptions { + // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. + // 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:!*~' + } + } + + signingConfigs { + release { + storeFile file('../../globaljain-release-key.keystore') + storePassword 'Global_jain1' + keyAlias 'globaljain-key-alias' + keyPassword 'Global_jain1' + } + } + + buildTypes { +// release { +// minifyEnabled false +// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' +// } + release { + signingConfig signingConfigs.release + minifyEnabled false + shrinkResources false + debuggable false + } + } + packagingOptions { + resources { + excludes += ['META-INF/DEPENDENCIES.txt', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt', 'META-INF/NOTICE', 'META-INF/LICENSE', 'META-INF/DEPENDENCIES', 'META-INF/notice.txt', 'META-INF/license.txt', 'META-INF/dependencies.txt', 'META-INF/LGPL2.1'] + } + } + +} + +repositories { + flatDir { + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation project(':capacitor-android') + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch (Exception e) { + logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle new file mode 100644 index 0000000..f34f5f9 --- /dev/null +++ b/android/app/capacitor.build.gradle @@ -0,0 +1,32 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + implementation project(':capacitor-firebase-authentication') + implementation project(':capacitor-app') + implementation project(':capacitor-browser') + implementation project(':capacitor-camera') + implementation project(':capacitor-device') + implementation project(':capacitor-filesystem') + implementation project(':capacitor-keyboard') + implementation project(':capacitor-network') + implementation project(':capacitor-push-notifications') + implementation project(':capacitor-share') + implementation project(':capacitor-splash-screen') + implementation project(':capacitor-status-bar') + implementation project(':capacitor-share-extension') + implementation "com.soundcloud.android:android-crop:1.0.0@aar" + implementation "androidx.legacy:legacy-support-v4:1.0.0" +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/android/app/debug/output-metadata.json b/android/app/debug/output-metadata.json new file mode 100644 index 0000000..9b2b92e --- /dev/null +++ b/android/app/debug/output-metadata.json @@ -0,0 +1,21 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.globaljain.android", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0.0", + "outputFile": "app-debug.apk" + } + ], + "elementType": "File", + "minSdkVersionForDexing": 22 +} \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..5b7fb27 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "738197080970", + "project_id": "global-jain-dev", + "storage_bucket": "global-jain-dev.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:738197080970:android:a8b0389f84047fab141673", + "android_client_info": { + "package_name": "com.globaljain.android" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyDqYUv665UwfORjM0r_vQpIQyuJU4fKtQI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:738197080970:android:7e4c375636bd29f5141673", + "android_client_info": { + "package_name": "com.globaljain.social" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyDqYUv665UwfORjM0r_vQpIQyuJU4fKtQI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..faf9e4e --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,74 @@ +# ===================================== +# GlobalJain - ProGuard / R8 Configuration +# ===================================== + +# 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 + +# ------------------------------------- +# WebView support (uncomment if needed) +# ------------------------------------- +# -keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +# } + +# Preserve line numbers for crash stack traces +# -keepattributes SourceFile,LineNumberTable +# -renamesourcefileattribute SourceFile + + +# ===================================== +# 🚀 Firebase & Google Play Services +# ===================================== +-keep class com.google.firebase.** { *; } +-dontwarn com.google.firebase.** +-keep class com.google.android.gms.** { *; } +-dontwarn com.google.android.gms.** + +# Keep analytics and measurement classes +-keep class com.google.android.gms.measurement.** { *; } +-keep class com.google.firebase.analytics.** { *; } + +# Keep Firebase Auth, Database, and Messaging models +-keepclassmembers class * { + @com.google.firebase.database.PropertyName ; +} + +# ===================================== +#⚙️ Facebook & Google Auth SDK (from your missing_rules.txt) +# ===================================== +-dontwarn com.facebook.CallbackManager$Factory +-dontwarn com.facebook.CallbackManager +-dontwarn com.facebook.FacebookCallback +-dontwarn com.facebook.login.LoginManager +-dontwarn com.facebook.login.widget.LoginButton +-dontwarn com.google.android.gms.auth.GoogleAuthException +-dontwarn com.google.android.gms.auth.GoogleAuthUtil +-dontwarn com.google.android.gms.auth.api.signin.GoogleSignIn +-dontwarn com.google.android.gms.auth.api.signin.GoogleSignInClient + +# ===================================== +# ⚡ Ionic / Capacitor (keep core native bridge) +# ===================================== +-keep class com.getcapacitor.** { *; } +-dontwarn com.getcapacitor.** + +# Keep capacitor plugins (prevents R8 from stripping plugin classes) +-keep class * extends com.getcapacitor.Plugin + +# ===================================== +# ✅ General Safe Defaults +# ===================================== +# Keep annotations +-keepattributes *Annotation* + +# Keep enum values +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + diff --git a/android/app/release/baselineProfiles/0/app-release.dm b/android/app/release/baselineProfiles/0/app-release.dm new file mode 100644 index 0000000..5f16d33 Binary files /dev/null and b/android/app/release/baselineProfiles/0/app-release.dm differ diff --git a/android/app/release/baselineProfiles/1/app-release.dm b/android/app/release/baselineProfiles/1/app-release.dm new file mode 100644 index 0000000..67d88c9 Binary files /dev/null and b/android/app/release/baselineProfiles/1/app-release.dm differ diff --git a/android/app/release/output-metadata.json b/android/app/release/output-metadata.json new file mode 100644 index 0000000..87262c5 --- /dev/null +++ b/android/app/release/output-metadata.json @@ -0,0 +1,37 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.globaljain.android", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 10, + "versionName": "1.2.4", + "outputFile": "app-release.apk" + } + ], + "elementType": "File", + "baselineProfiles": [ + { + "minApi": 28, + "maxApi": 30, + "baselineProfiles": [ + "baselineProfiles/1/app-release.dm" + ] + }, + { + "minApi": 31, + "maxApi": 2147483647, + "baselineProfiles": [ + "baselineProfiles/0/app-release.dm" + ] + } + ], + "minSdkVersionForDexing": 22 +} \ No newline at end of file diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f2c2217 --- /dev/null +++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import android.content.Context; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..06392cc --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/com/globaljain/android/MainActivity.java b/android/app/src/main/java/com/globaljain/android/MainActivity.java new file mode 100644 index 0000000..2d9d8bc --- /dev/null +++ b/android/app/src/main/java/com/globaljain/android/MainActivity.java @@ -0,0 +1,22 @@ +package com.globaljain.android; +import com.getcapacitor.BridgeActivity; + +import android.content.Intent; +import android.webkit.ValueCallback; + +public class MainActivity extends BridgeActivity { + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + String action = intent.getAction(); + String type = intent.getType(); + if ((Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) && type != null) { + bridge.getActivity().setIntent(intent); + bridge.eval("window.dispatchEvent(new Event('sendIntentReceived'))", new ValueCallback() { + @Override + public void onReceiveValue(String s) { + } + }); + } + } +} diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 0000000..3543f3b Binary files /dev/null and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 0000000..d77a648 Binary files /dev/null and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 0000000..76af857 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 0000000..995eb3a Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 0000000..905f569 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png new file mode 100644 index 0000000..4c9e5a0 Binary files /dev/null and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png new file mode 100644 index 0000000..ec50f6a Binary files /dev/null and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png new file mode 100644 index 0000000..26cbb38 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 0000000..19032f7 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 0000000..e4f0a1e Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000..d77a648 Binary files /dev/null and b/android/app/src/main/res/drawable/splash.png differ diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b5ad138 --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..570f84a Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000..2a58127 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2a58127 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..5695deb Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..7a96ad4 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 0000000..7780c69 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7780c69 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..0b46643 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a113abd Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000..c2fb560 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c2fb560 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..dc75bda Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..08586fc Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..882d473 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..546e8d5 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..60554f4 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..a8ac9a2 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..d2ca997 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d2ca997 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..9cbb30c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/bool.xml b/android/app/src/main/res/values/bool.xml new file mode 100644 index 0000000..0682ef7 --- /dev/null +++ b/android/app/src/main/res/values/bool.xml @@ -0,0 +1,5 @@ + + + true + true + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..224114d --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,3 @@ + + #FF00FFFF + diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..cf69bc0 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,10 @@ + + + Global Jain + Global Jain + com.globaljain.android + com.globaljain.android + 2772955929664973 + Global Jain + fb2772955929664973 + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..165d484 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..bd0c4d8 --- /dev/null +++ b/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 0000000..0297327 --- /dev/null +++ b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,18 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..a0837cd --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,30 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.4.1' + classpath 'com.google.gms:google-services:4.4.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + // classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} + diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle new file mode 100644 index 0000000..eb1c4f8 --- /dev/null +++ b/android/capacitor.settings.gradle @@ -0,0 +1,42 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') + +include ':capacitor-firebase-authentication' +project(':capacitor-firebase-authentication').projectDir = new File('../node_modules/@capacitor-firebase/authentication/android') + +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-camera' +project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/camera/android') + +include ':capacitor-device' +project(':capacitor-device').projectDir = new File('../node_modules/@capacitor/device/android') + +include ':capacitor-filesystem' +project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') + +include ':capacitor-keyboard' +project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') + +include ':capacitor-network' +project(':capacitor-network').projectDir = new File('../node_modules/@capacitor/network/android') + +include ':capacitor-push-notifications' +project(':capacitor-push-notifications').projectDir = new File('../node_modules/@capacitor/push-notifications/android') + +include ':capacitor-share' +project(':capacitor-share').projectDir = new File('../node_modules/@capacitor/share/android') + +include ':capacitor-splash-screen' +project(':capacitor-splash-screen').projectDir = new File('../node_modules/@capacitor/splash-screen/android') + +include ':capacitor-status-bar' +project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') + +include ':capacitor-share-extension' +project(':capacitor-share-extension').projectDir = new File('../node_modules/capacitor-share-extension/android/capacitor-share-extension') diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..09f976a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,24 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +org.gradle.unsafe.configuration-cache=true + diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..41d9927 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..68ec69d --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Jul 05 14:45:12 IST 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..3b4431d --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/android/variables.gradle b/android/variables.gradle new file mode 100644 index 0000000..d438f7f --- /dev/null +++ b/android/variables.gradle @@ -0,0 +1,23 @@ +ext { + versionCode = 10 + versionName = "1.2.4" + minSdkVersion = 22 + compileSdkVersion = 34 + targetSdkVersion = 34 + androidxActivityVersion = '1.8.0' + androidxAppCompatVersion = '1.6.1' + androidxCoordinatorLayoutVersion = '1.2.0' + androidxCoreVersion = '1.12.0' + androidxFragmentVersion = '1.6.2' + junitVersion = '4.13.2' + androidxJunitVersion = '1.1.5' + androidxEspressoCoreVersion = '3.5.1' + cordovaAndroidVersion = '10.1.1' + coreSplashScreenVersion = '1.0.1' + androidxWebkitVersion = '1.9.0' + androidxMaterialVersion='1.8.0' + androidxBrowserVersion='1.5.0' + firebaseMessagingVersion='23.1.2' + playServicesLocationVersion='21.0.1' + androidxExifInterfaceVersion='1.3.6' +} diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..3dc3139 --- /dev/null +++ b/angular.json @@ -0,0 +1,212 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "app": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "www", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "src/assets", + "output": "assets" + }, + { + "glob": "**/*.svg", + "input": "node_modules/ionicons/dist/ionicons/svg", + "output": "./svg" + } + ], + "styles": [ + "src/theme/variables.scss", + "src/global.scss" + ], + "scripts": [], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true + }, + "configurations": { + "staging": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.stg.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + }, + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + }, + "ci": { + "progress": false + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "app:build", + "proxyConfig": "src/proxy.conf.json" + }, + "configurations": { + "production": { + "browserTarget": "app:build:production" + }, + "ci": { + "progress": false + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "app:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "styles": [], + "scripts": [], + "assets": [ + { + "glob": "favicon.ico", + "input": "src/", + "output": "/" + }, + { + "glob": "**/*", + "input": "src/assets", + "output": "/assets" + } + ] + }, + "configurations": { + "ci": { + "progress": false, + "watch": false + } + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "app:serve" + }, + "configurations": { + "production": { + "devServerTarget": "app:serve:production" + }, + "ci": { + "devServerTarget": "app:serve:ci" + } + } + }, + "ionic-cordova-build": { + "builder": "@ionic/angular-toolkit:cordova-build", + "options": { + "browserTarget": "app:build" + }, + "configurations": { + "production": { + "browserTarget": "app:build:production" + } + } + }, + "ionic-cordova-serve": { + "builder": "@ionic/angular-toolkit:cordova-serve", + "options": { + "cordovaBuildTarget": "app:ionic-cordova-build", + "devServerTarget": "app:serve" + }, + "configurations": { + "production": { + "cordovaBuildTarget": "app:ionic-cordova-build:production", + "devServerTarget": "app:serve:production" + } + } + } + } + } + }, + "cli": { + "analytics": false, + "schematicCollections": [ + "@ionic/angular-toolkit" + ] + }, + "schematics": { + "@ionic/angular-toolkit:component": { + "styleext": "scss" + }, + "@ionic/angular-toolkit:page": { + "styleext": "scss" + } + } +} \ No newline at end of file diff --git a/capacitor.config.json b/capacitor.config.json new file mode 100644 index 0000000..9b9ac60 --- /dev/null +++ b/capacitor.config.json @@ -0,0 +1,38 @@ +{ + "appId": "com.globaljain.social", + "appName": "Global Jain", + "webDir": "www", + "bundledWebRuntime": true, + "plugins": { + "splashScreen": { + "launchShowDuration": 4000, + "launchAutoHide": false, + "androidSplashResourceName": "splash", + "androidScaleType": "CENTER_CROP", + "showSpinner": false, + "androidSpinnerStyle": "small", + "iosSpinnerStyle": "small", + "spinnerColor": "#999999", + "splashFullScreen": true, + "splashImmersive": false, + "layoutName": "launch_screen", + "useDialog": false, + "backgroundColor": "#4D4D4D" + }, + "PushNotifications": { + "presentationOptions": [ + "sound", + "alert" + ] + }, + "FirebaseAuthentication": { + "skipNativeAuth": false, + "providers": [ + "phone" + ] + } + }, + "server": { + "cleartext": true + } +} \ No newline at end of file diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..3347cb9 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = {extends: ['@commitlint/config-conventional']}; diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 0000000..22bd9d9 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,37 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + SELENIUM_PROMISE_MANAGER: false, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayStacktrace: StacktraceOption.PRETTY + } + })); + } +}; diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..33efa08 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('new App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should be blank', () => { + page.navigateTo(); + expect(page.getParagraphText()).toContain('Start with Ionic UI Components'); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 0000000..c121fd9 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.deepCss('app-root ion-content')).getText(); + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..a82df00 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": [ + "jasmine", + "node" + ] + } +} diff --git a/globaljain-release-key.keystore b/globaljain-release-key.keystore new file mode 100644 index 0000000..d1d0d76 Binary files /dev/null and b/globaljain-release-key.keystore differ diff --git a/ionic.config.json b/ionic.config.json new file mode 100644 index 0000000..5c7ebff --- /dev/null +++ b/ionic.config.json @@ -0,0 +1,7 @@ +{ + "name": "Global Jain", + "integrations": { + "capacitor": {} + }, + "type": "angular" +} diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..ac4f3ee --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,13 @@ +App/build +App/Pods +App/output +App/App/public +DerivedData +xcuserdata + +# Cordova plugins for Capacitor +capacitor-cordova-ios-plugins +# Generated Config files +App/App/capacitor.config.json +App/App/config.xml + diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2b19ee9 --- /dev/null +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -0,0 +1,628 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; + 3FA34237283795E800A2F7AD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3FA34236283795E800A2F7AD /* GoogleService-Info.plist */; }; + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; + 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; + 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + 5C1414E8293A204F00989882 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1414E7293A204F00989882 /* ShareViewController.swift */; }; + 5C1414EB293A204F00989882 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5C1414E9293A204F00989882 /* MainInterface.storyboard */; }; + 5C1414EF293A204F00989882 /* shareextension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 5C1414E5293A204F00989882 /* shareextension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5C1414ED293A204F00989882 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 504EC2FC1FED79650016851F /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C1414E4293A204F00989882; + remoteInfo = shareextension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 5C1414F0293A204F00989882 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 5C1414EF293A204F00989882 /* shareextension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; + 3FA34236283795E800A2F7AD /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 3FC1C2DF28364B08001A998B /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = ""; }; + 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; + 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + 5C10B801293A24D100088785 /* shareextension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = shareextension.entitlements; sourceTree = ""; }; + 5C1414E5293A204F00989882 /* shareextension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = shareextension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 5C1414E7293A204F00989882 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; + 5C1414EA293A204F00989882 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 5C1414EC293A204F00989882 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5C677DCD28FE6C5700C8C07A /* FBSDKCoreKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit.xcframework; path = Pods/FBSDKCoreKit/XCFrameworks/FBSDKCoreKit.xcframework; sourceTree = ""; }; + 5CFA39E12900344000C16F51 /* FBSDKCoreKit_Basics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit_Basics.xcframework; path = Pods/FBSDKCoreKit_Basics/XCFrameworks/FBSDKCoreKit_Basics.xcframework; sourceTree = ""; }; + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 504EC3011FED79650016851F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5C1414E2293A204F00989882 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5CFA39E12900344000C16F51 /* FBSDKCoreKit_Basics.xcframework */, + 5C677DCD28FE6C5700C8C07A /* FBSDKCoreKit.xcframework */, + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 504EC2FB1FED79650016851F = { + isa = PBXGroup; + children = ( + 504EC3061FED79650016851F /* App */, + 5C1414E6293A204F00989882 /* shareextension */, + 504EC3051FED79650016851F /* Products */, + 7F8756D8B27F46E3366F6CEA /* Pods */, + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, + ); + sourceTree = ""; + }; + 504EC3051FED79650016851F /* Products */ = { + isa = PBXGroup; + children = ( + 504EC3041FED79650016851F /* App.app */, + 5C1414E5293A204F00989882 /* shareextension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 504EC3061FED79650016851F /* App */ = { + isa = PBXGroup; + children = ( + 3FA34236283795E800A2F7AD /* GoogleService-Info.plist */, + 3FC1C2DF28364B08001A998B /* App.entitlements */, + 50379B222058CBB4000EE86E /* capacitor.config.json */, + 504EC3071FED79650016851F /* AppDelegate.swift */, + 504EC30B1FED79650016851F /* Main.storyboard */, + 504EC30E1FED79650016851F /* Assets.xcassets */, + 504EC3101FED79650016851F /* LaunchScreen.storyboard */, + 504EC3131FED79650016851F /* Info.plist */, + 2FAD9762203C412B000D30F8 /* config.xml */, + 50B271D01FEDC1A000F3C39B /* public */, + ); + path = App; + sourceTree = ""; + }; + 5C1414E6293A204F00989882 /* shareextension */ = { + isa = PBXGroup; + children = ( + 5C10B801293A24D100088785 /* shareextension.entitlements */, + 5C1414E7293A204F00989882 /* ShareViewController.swift */, + 5C1414E9293A204F00989882 /* MainInterface.storyboard */, + 5C1414EC293A204F00989882 /* Info.plist */, + ); + path = shareextension; + sourceTree = ""; + }; + 7F8756D8B27F46E3366F6CEA /* Pods */ = { + isa = PBXGroup; + children = ( + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 504EC3031FED79650016851F /* App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; + buildPhases = ( + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, + 504EC3001FED79650016851F /* Sources */, + 504EC3011FED79650016851F /* Frameworks */, + 504EC3021FED79650016851F /* Resources */, + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, + DA40B276A01A871B5D5B2E1A /* [CP] Copy Pods Resources */, + 5C1414F0293A204F00989882 /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 5C1414EE293A204F00989882 /* PBXTargetDependency */, + ); + name = App; + productName = App; + productReference = 504EC3041FED79650016851F /* App.app */; + productType = "com.apple.product-type.application"; + }; + 5C1414E4293A204F00989882 /* shareextension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5C1414F3293A204F00989882 /* Build configuration list for PBXNativeTarget "shareextension" */; + buildPhases = ( + 5C1414E1293A204F00989882 /* Sources */, + 5C1414E2293A204F00989882 /* Frameworks */, + 5C1414E3293A204F00989882 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = shareextension; + productName = shareextension; + productReference = 5C1414E5293A204F00989882 /* shareextension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 504EC2FC1FED79650016851F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1410; + LastUpgradeCheck = 920; + TargetAttributes = { + 504EC3031FED79650016851F = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + }; + 5C1414E4293A204F00989882 = { + CreatedOnToolsVersion = 14.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 504EC2FB1FED79650016851F; + productRefGroup = 504EC3051FED79650016851F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 504EC3031FED79650016851F /* App */, + 5C1414E4293A204F00989882 /* shareextension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 504EC3021FED79650016851F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, + 50B271D11FEDC1A000F3C39B /* public in Resources */, + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, + 504EC30D1FED79650016851F /* Main.storyboard in Resources */, + 2FAD9763203C412B000D30F8 /* config.xml in Resources */, + 3FA34237283795E800A2F7AD /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5C1414E3293A204F00989882 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5C1414EB293A204F00989882 /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + DA40B276A01A871B5D5B2E1A /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 504EC3001FED79650016851F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5C1414E1293A204F00989882 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5C1414E8293A204F00989882 /* ShareViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 5C1414EE293A204F00989882 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5C1414E4293A204F00989882 /* shareextension */; + targetProxy = 5C1414ED293A204F00989882 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 504EC30B1FED79650016851F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC30C1FED79650016851F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC3111FED79650016851F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 5C1414E9293A204F00989882 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5C1414EA293A204F00989882 /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 504EC3141FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 504EC3151FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 504EC3171FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App/App.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 38; + DEVELOPMENT_TEAM = JL89UUB4WQ; + INFOPLIST_FILE = App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Global Jain"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.2.3; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; + PRODUCT_BUNDLE_IDENTIFIER = com.globaljain.social; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 504EC3181FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App/App.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 38; + DEVELOPMENT_TEAM = JL89UUB4WQ; + INFOPLIST_FILE = App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Global Jain"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.2.3; + PRODUCT_BUNDLE_IDENTIFIER = com.globaljain.social; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 5C1414F1293A204F00989882 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CODE_SIGN_ENTITLEMENTS = shareextension/shareextension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 35; + DEVELOPMENT_TEAM = JL89UUB4WQ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = shareextension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = shareextension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MARKETING_VERSION = 1.0.31; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.globaljain.social.shareextension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5C1414F2293A204F00989882 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CODE_SIGN_ENTITLEMENTS = shareextension/shareextension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 35; + DEVELOPMENT_TEAM = JL89UUB4WQ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = shareextension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = shareextension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MARKETING_VERSION = 1.0.31; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.globaljain.social.shareextension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3141FED79650016851F /* Debug */, + 504EC3151FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3171FED79650016851F /* Debug */, + 504EC3181FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5C1414F3293A204F00989882 /* Build configuration list for PBXNativeTarget "shareextension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5C1414F1293A204F00989882 /* Debug */, + 5C1414F2293A204F00989882 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 504EC2FC1FED79650016851F /* Project object */; +} diff --git a/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..42daef8 --- /dev/null +++ b/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme b/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme new file mode 100644 index 0000000..ebba468 --- /dev/null +++ b/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App.xcworkspace/contents.xcworkspacedata b/ios/App/App.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b301e82 --- /dev/null +++ b/ios/App/App.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/App/App/App.entitlements b/ios/App/App/App.entitlements new file mode 100644 index 0000000..5a36186 --- /dev/null +++ b/ios/App/App/App.entitlements @@ -0,0 +1,17 @@ + + + + + aps-environment + development + com.apple.developer.associated-domains + + applinks:globaljain.net + applinks:globaljain.app + + com.apple.security.application-groups + + group.com.globaljain.social.shareextension + + + diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift new file mode 100644 index 0000000..34d1fd0 --- /dev/null +++ b/ios/App/App/AppDelegate.swift @@ -0,0 +1,107 @@ +import UIKit +import Capacitor +import Firebase +import CapacitorShareExtension + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + let store = ShareStore.store + + // func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // // Override point for customization after application launch. + // return true + // } + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + FirebaseApp.configure() + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. Feel free to add additional processing here, + // but if you want the App API to support tracking app url opens, make sure to keep this call + var success = true + if CAPBridge.handleOpenUrl(url, options) { + success = ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } + + guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true), + let params = components.queryItems else { + return false + } + let titles = params.filter { $0.name == "title" } + let descriptions = params.filter { $0.name == "description" } + let types = params.filter { $0.name == "type" } + let urls = params.filter { $0.name == "url" } + let webPaths = params.filter { $0.name == "webPath" } + + store.shareItems.removeAll() + + if (titles.count > 0){ + for index in 0...titles.count-1 { + var shareItem: JSObject = JSObject() + shareItem["title"] = titles[index].value! + shareItem["description"] = descriptions[index].value! + shareItem["type"] = types[index].value! + shareItem["url"] = urls[index].value! + shareItem["webPath"] = webPaths[index].value! + store.shareItems.append(shareItem) + } + } + + store.processed = false + let nc = NotificationCenter.default + nc.post(name: Notification.Name("triggerSendIntent"), object: nil ) + + return success + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + // Called when the app was launched with an activity, including Universal Links. + // Feel free to add additional processing here, but if you want the App API to support + // tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + + + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + Messaging.messaging().apnsToken = deviceToken + Messaging.messaging().token(completion: { (token, error) in + if let error = error { + NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error) + } else if let token = token { + NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: token) + } + }) + } + + func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error) + } + +} diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 0000000..eb18fb0 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..905798d --- /dev/null +++ b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon-512@2x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Contents.json b/ios/App/App/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ios/App/App/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json new file mode 100644 index 0000000..d7d96a6 --- /dev/null +++ b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "splash-2732x2732-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png new file mode 100644 index 0000000..1aa68af Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png new file mode 100644 index 0000000..1aa68af Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png new file mode 100644 index 0000000..1aa68af Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png differ diff --git a/ios/App/App/Base.lproj/LaunchScreen.storyboard b/ios/App/App/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e7ae5d7 --- /dev/null +++ b/ios/App/App/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/Base.lproj/Main.storyboard b/ios/App/App/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b44df7b --- /dev/null +++ b/ios/App/App/Base.lproj/Main.storyboard @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/GoogleService-Info.plist b/ios/App/App/GoogleService-Info.plist new file mode 100644 index 0000000..3899eae --- /dev/null +++ b/ios/App/App/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 738197080970-8oh08pb9bsm92ciko322hi630q38f97q.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.738197080970-8oh08pb9bsm92ciko322hi630q38f97q + ANDROID_CLIENT_ID + 738197080970-4er86cle9k431b3jltk7ubrouq3qlrfr.apps.googleusercontent.com + API_KEY + AIzaSyARu5kpUZ61UkkEk0qUtr56c_dwxX_XD9I + GCM_SENDER_ID + 738197080970 + PLIST_VERSION + 1 + BUNDLE_ID + com.globaljain.social + PROJECT_ID + global-jain-dev + STORAGE_BUCKET + global-jain-dev.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:738197080970:ios:f75c031175109ec6141673 + + diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist new file mode 100644 index 0000000..fcdbb41 --- /dev/null +++ b/ios/App/App/Info.plist @@ -0,0 +1,82 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Global Jain + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + REVERSED_CLIENT_ID + CFBundleURLSchemes + + com.googleusercontent.apps.738197080970-8oh08pb9bsm92ciko322hi630q38f97q + + + + CFBundleURLSchemes + + globaljain.net + gjain.app.link + globaljain + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSCameraUsageDescription + Enable camera access so that you can click and upload photos + NSPhotoLibraryAddUsageDescription + Enable access to photo library to choose your photos from your photo library + NSPhotoLibraryUsageDescription + Global Jain need photo library access to save pictures there + PHPhotoLibraryPreventAutomaticLimitedAccessAlert + + UIBackgroundModes + + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/App/Podfile b/ios/App/Podfile new file mode 100644 index 0000000..ca0c304 --- /dev/null +++ b/ios/App/Podfile @@ -0,0 +1,45 @@ +require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' + +platform :ios, '13.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorFirebaseAuthentication', :path => '../../node_modules/@capacitor-firebase/authentication' + pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' + pod 'CapacitorBrowser', :path => '../../node_modules/@capacitor/browser' + pod 'CapacitorCamera', :path => '../../node_modules/@capacitor/camera' + pod 'CapacitorDevice', :path => '../../node_modules/@capacitor/device' + pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem' + pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' + pod 'CapacitorNetwork', :path => '../../node_modules/@capacitor/network' + pod 'CapacitorPushNotifications', :path => '../../node_modules/@capacitor/push-notifications' + pod 'CapacitorShare', :path => '../../node_modules/@capacitor/share' + pod 'CapacitorSplashScreen', :path => '../../node_modules/@capacitor/splash-screen' + pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' + pod 'CapacitorShareExtension', :path => '../../node_modules/capacitor-share-extension' + pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins' + pod 'CordovaPluginsResources', :path => '../capacitor-cordova-ios-plugins' +end + +target 'App' do + capacitor_pods + # Add your Pods here + # pod 'Firebase/Auth', '~> 8.8.0' + pod 'Firebase/Core', '10.8.0' + pod 'Firebase/Auth', '10.8.0' + pod 'Firebase/Messaging', '10.8.0' + # pod 'Firebase/CoreOnly', '~> 8.1.1' + pod 'GoogleSignIn', '6.2.4' +end + + +post_install do |installer| + assertDeploymentTarget(installer) +end diff --git a/ios/App/Podfile.lock b/ios/App/Podfile.lock new file mode 100644 index 0000000..717e0b4 --- /dev/null +++ b/ios/App/Podfile.lock @@ -0,0 +1,285 @@ +PODS: + - AppAuth (1.7.5): + - AppAuth/Core (= 1.7.5) + - AppAuth/ExternalUserAgent (= 1.7.5) + - AppAuth/Core (1.7.5) + - AppAuth/ExternalUserAgent (1.7.5): + - AppAuth/Core + - Capacitor (6.1.0): + - CapacitorCordova + - CapacitorApp (6.0.0): + - Capacitor + - CapacitorBrowser (6.0.1): + - Capacitor + - CapacitorCamera (6.0.1): + - Capacitor + - CapacitorCordova (6.1.0) + - CapacitorDevice (6.0.0): + - Capacitor + - CapacitorFilesystem (6.0.0): + - Capacitor + - CapacitorFirebaseAuthentication (5.4.1): + - Capacitor + - CapacitorFirebaseAuthentication/Lite (= 5.4.1) + - FirebaseAuth (~> 10.8) + - CapacitorFirebaseAuthentication/Lite (5.4.1): + - Capacitor + - FirebaseAuth (~> 10.8) + - CapacitorKeyboard (6.0.1): + - Capacitor + - CapacitorNetwork (6.0.1): + - Capacitor + - CapacitorPushNotifications (6.0.1): + - Capacitor + - CapacitorShare (6.0.1): + - Capacitor + - CapacitorShareExtension (0.0.1): + - Capacitor + - CapacitorSplashScreen (6.0.1): + - Capacitor + - CapacitorStatusBar (6.0.0): + - Capacitor + - CordovaPlugins (6.1.0): + - CapacitorCordova + - CordovaPluginsResources (0.0.105) + - Firebase/Auth (10.8.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 10.8.0) + - Firebase/Core (10.8.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.8.0) + - Firebase/CoreOnly (10.8.0): + - FirebaseCore (= 10.8.0) + - Firebase/Messaging (10.8.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.8.0) + - FirebaseAnalytics (10.8.0): + - FirebaseAnalytics/AdIdSupport (= 10.8.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.8.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAppCheckInterop (10.28.0) + - FirebaseAuth (10.8.0): + - FirebaseAppCheckInterop (~> 10.0) + - FirebaseCore (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GTMSessionFetcher/Core (< 4.0, >= 2.1) + - FirebaseCore (10.8.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.28.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.28.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.8.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement (10.8.0): + - GoogleAppMeasurement/AdIdSupport (= 10.8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.8.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.8.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleDataTransport (9.4.1): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30911.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleSignIn (6.2.4): + - AppAuth (~> 1.5) + - GTMAppAuth (~> 1.3) + - GTMSessionFetcher/Core (< 3.0, >= 1.1) + - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Privacy + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.13.3)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.3) + - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (1.3.1): + - AppAuth/Core (~> 1.6) + - GTMSessionFetcher/Core (< 3.0, >= 1.5) + - GTMSessionFetcher/Core (2.3.0) + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) + - PromisesObjC (2.4.0) + +DEPENDENCIES: + - "Capacitor (from `../../node_modules/@capacitor/ios`)" + - "CapacitorApp (from `../../node_modules/@capacitor/app`)" + - "CapacitorBrowser (from `../../node_modules/@capacitor/browser`)" + - "CapacitorCamera (from `../../node_modules/@capacitor/camera`)" + - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)" + - "CapacitorDevice (from `../../node_modules/@capacitor/device`)" + - "CapacitorFilesystem (from `../../node_modules/@capacitor/filesystem`)" + - "CapacitorFirebaseAuthentication (from `../../node_modules/@capacitor-firebase/authentication`)" + - "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)" + - "CapacitorNetwork (from `../../node_modules/@capacitor/network`)" + - "CapacitorPushNotifications (from `../../node_modules/@capacitor/push-notifications`)" + - "CapacitorShare (from `../../node_modules/@capacitor/share`)" + - CapacitorShareExtension (from `../../node_modules/capacitor-share-extension`) + - "CapacitorSplashScreen (from `../../node_modules/@capacitor/splash-screen`)" + - "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)" + - CordovaPlugins (from `../capacitor-cordova-ios-plugins`) + - CordovaPluginsResources (from `../capacitor-cordova-ios-plugins`) + - Firebase/Auth (= 10.8.0) + - Firebase/Core (= 10.8.0) + - Firebase/Messaging (= 10.8.0) + - GoogleSignIn (= 6.2.4) + +SPEC REPOS: + trunk: + - AppAuth + - Firebase + - FirebaseAnalytics + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + Capacitor: + :path: "../../node_modules/@capacitor/ios" + CapacitorApp: + :path: "../../node_modules/@capacitor/app" + CapacitorBrowser: + :path: "../../node_modules/@capacitor/browser" + CapacitorCamera: + :path: "../../node_modules/@capacitor/camera" + CapacitorCordova: + :path: "../../node_modules/@capacitor/ios" + CapacitorDevice: + :path: "../../node_modules/@capacitor/device" + CapacitorFilesystem: + :path: "../../node_modules/@capacitor/filesystem" + CapacitorFirebaseAuthentication: + :path: "../../node_modules/@capacitor-firebase/authentication" + CapacitorKeyboard: + :path: "../../node_modules/@capacitor/keyboard" + CapacitorNetwork: + :path: "../../node_modules/@capacitor/network" + CapacitorPushNotifications: + :path: "../../node_modules/@capacitor/push-notifications" + CapacitorShare: + :path: "../../node_modules/@capacitor/share" + CapacitorShareExtension: + :path: "../../node_modules/capacitor-share-extension" + CapacitorSplashScreen: + :path: "../../node_modules/@capacitor/splash-screen" + CapacitorStatusBar: + :path: "../../node_modules/@capacitor/status-bar" + CordovaPlugins: + :path: "../capacitor-cordova-ios-plugins" + CordovaPluginsResources: + :path: "../capacitor-cordova-ios-plugins" + +SPEC CHECKSUMS: + AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa + Capacitor: 187bd7847b6f71467015a20200a1a071be3e5f14 + CapacitorApp: 9d53aec7101f7b030a950c5bdc4df8612576b279 + CapacitorBrowser: 473c7fd70ddbe541608ff09ec1be14da0078279e + CapacitorCamera: 3b77b3e8311b98220de65e63445c0e4d0b30ce3a + CapacitorCordova: be703980ca797f847c3356f78fa175d21c8330c2 + CapacitorDevice: f8fd88f9edd1261c55a109f32015b09bbbfdc4a0 + CapacitorFilesystem: 60e59ba274c234a979e7a3be2552feaadcee4263 + CapacitorFirebaseAuthentication: 4b5146252052345d7c0cd8147dd4f1372a65e99b + CapacitorKeyboard: 5f32a712adf41e07a61caafb82cf29fb6d8ba123 + CapacitorNetwork: 5c94acfdddc22043f2ffaff224ce9b4aa5a179f0 + CapacitorPushNotifications: 293fabe42c7229756078e81f2d3a60394ba4e5d8 + CapacitorShare: 02222f2457ff003e642370a9c1ecd101baaa27c8 + CapacitorShareExtension: 8e3d1ac2fd9baccf0b1ebd7857a006140501981e + CapacitorSplashScreen: 61645214e8f955ff2b80f16a6a3648960fe4c89f + CapacitorStatusBar: 2e4369f99166125435641b1908d05f561eaba6f6 + CordovaPlugins: 51b32272b143be41c2744c425b3103d80160ea01 + CordovaPluginsResources: 0c211f770ed91763a179ebcd9b9346e120b70662 + Firebase: b49ef44e5ec9a3d0c1f6450f410337e97872279c + FirebaseAnalytics: e1fc758bd5d71823bba970c076abee4b2450a5f4 + FirebaseAppCheckInterop: 5315f40293191bfec04b2cfab0215760e441540a + FirebaseAuth: 28e6fff787467cd15ab51c8c7aa904003b2f57aa + FirebaseCore: e78636a990b54be427ce300aa09a0e359f4e0e87 + FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698 + FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e + FirebaseMessaging: 16c395d01ecd269357c5b86abe662851fff98236 + GoogleAppMeasurement: 0ba93018e916f7badf915c2337d43cc1fa96b3f9 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a + GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd + GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + +PODFILE CHECKSUM: 4d01f123efceaf2e553f0f75e67b39a03a8d4015 + +COCOAPODS: 1.15.2 diff --git a/ios/App/shareextension/Base.lproj/MainInterface.storyboard b/ios/App/shareextension/Base.lproj/MainInterface.storyboard new file mode 100644 index 0000000..286a508 --- /dev/null +++ b/ios/App/shareextension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/shareextension/Info.plist b/ios/App/shareextension/Info.plist new file mode 100644 index 0000000..1145fde --- /dev/null +++ b/ios/App/shareextension/Info.plist @@ -0,0 +1,33 @@ + + + + + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + SUBQUERY ( + extensionItems, + $extensionItem, + SUBQUERY ( + $extensionItem.attachments, + $attachment, + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" + ).@count == $extensionItem.attachments.@count + ).@count == 1 + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/ios/App/shareextension/ShareViewController.swift b/ios/App/shareextension/ShareViewController.swift new file mode 100644 index 0000000..a79e6f5 --- /dev/null +++ b/ios/App/shareextension/ShareViewController.swift @@ -0,0 +1,183 @@ +import UIKit +import Social +import MobileCoreServices +import Foundation.NSURLSession + +class ShareItem { + public var title: String? + public var type: String? + public var url: String? + public var webPath: String? +} + +class ShareViewController: UIViewController { + private var shareItems: [ShareItem] = [] + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) + } + + override public func viewDidLoad() { + super.viewDidLoad() + shareItems.removeAll() + let extensionItem = extensionContext?.inputItems[0] as! NSExtensionItem + Task { + try await withThrowingTaskGroup( + of: ShareItem.self, + body: { taskGroup in + for attachment in extensionItem.attachments! { + if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { + taskGroup.addTask { + return try await self.handleTypeUrl(attachment) + } + } else if attachment.hasItemConformingToTypeIdentifier(kUTTypeText as String) { + taskGroup.addTask { + return try await self.handleTypeText(attachment) + } + } else if attachment.hasItemConformingToTypeIdentifier(kUTTypeMovie as String) { + taskGroup.addTask { + return try await self.handleTypeMovie(attachment) + } + } else if attachment.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { + taskGroup.addTask { + return try await self.handleTypeImage(attachment) + } + } + } + for try await item in taskGroup { + self.shareItems.append(item) + } + }) + self.sendData() + } + } + + private func sendData() { + let queryItems = shareItems.map { + [ + URLQueryItem( + name: "title", + value: $0.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? ""), + URLQueryItem(name: "description", value: ""), + URLQueryItem( + name: "type", + value: $0.type?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? ""), + URLQueryItem( + name: "url", + value: $0.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? ""), + URLQueryItem( + name: "webPath", + value: $0.webPath?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "") + ] + }.flatMap({ $0 }) + var urlComps = URLComponents(string: "globaljain://;")! + urlComps.queryItems = queryItems + openURL(urlComps.url!) + } + + fileprivate func createSharedFileUrl(_ url: URL?) -> String { + let fileManager = FileManager.default + print("share url: " + url!.absoluteString) + let copyFileUrl = + fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.globaljain.social.shareextension")! + .absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! + url! + .lastPathComponent.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! + try? Data(contentsOf: url!).write(to: URL(string: copyFileUrl)!) + + return copyFileUrl + } + + func saveScreenshot(_ image: UIImage) -> String { + let fileManager = FileManager.default + + let copyFileUrl = + fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.globaljain.social.shareextension")! + .absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! + + "/screenshot.png" + do { + try image.pngData()?.write(to: URL(string: copyFileUrl)!) + return copyFileUrl + } catch { + print(error.localizedDescription) + return "" + } + } + + fileprivate func handleTypeUrl(_ attachment: NSItemProvider) + async throws -> ShareItem + { + let results = try await attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) + let url = results as! URL? + let shareItem: ShareItem = ShareItem() + + if url!.isFileURL { + shareItem.title = url!.lastPathComponent + shareItem.type = "application/" + url!.pathExtension.lowercased() + shareItem.url = createSharedFileUrl(url) + shareItem.webPath = "capacitor://localhost/_capacitor_file_" + URL(string: shareItem.url ?? "")!.path + } else { + shareItem.title = url!.absoluteString + shareItem.url = url!.absoluteString + shareItem.webPath = url!.absoluteString + shareItem.type = "text/plain" + } + return shareItem + } + + fileprivate func handleTypeText(_ attachment: NSItemProvider) + async throws -> ShareItem + { + let results = try await attachment.loadItem(forTypeIdentifier: kUTTypeText as String, options: nil) + let shareItem: ShareItem = ShareItem() + let text = results as! String + shareItem.title = text + shareItem.type = "text/plain" + return shareItem + } + + fileprivate func handleTypeMovie(_ attachment: NSItemProvider) + async throws -> ShareItem + { + let results = try await attachment.loadItem(forTypeIdentifier: kUTTypeMovie as String, options: nil) + let shareItem: ShareItem = ShareItem() + let url = results as! URL? + shareItem.title = url!.lastPathComponent + shareItem.type = "video/" + url!.pathExtension.lowercased() + shareItem.url = createSharedFileUrl(url) + shareItem.webPath = "capacitor://localhost/_capacitor_file_" + URL(string: shareItem.url ?? "")!.path + return shareItem + } + + fileprivate func handleTypeImage(_ attachment: NSItemProvider) + async throws -> ShareItem + { + let data = try await attachment.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) + let shareItem: ShareItem = ShareItem() + switch data { + case let image as UIImage: + shareItem.title = "screenshot" + shareItem.type = "image/png" + shareItem.url = self.saveScreenshot(image) + shareItem.webPath = "capacitor://localhost/_capacitor_file_" + URL(string: shareItem.url ?? "")!.path + case let url as URL: + shareItem.title = url.lastPathComponent + shareItem.type = "image/" + url.pathExtension.lowercased() + shareItem.url = self.createSharedFileUrl(url) + shareItem.webPath = "capacitor://localhost/_capacitor_file_" + URL(string: shareItem.url ?? "")!.path + default: + print("Unexpected image data:", type(of: data)) + } + return shareItem + } + + @objc func openURL(_ url: URL) -> Bool { + var responder: UIResponder? = self + while responder != nil { + if let application = responder as? UIApplication { + return application.perform(#selector(openURL(_:)), with: url) != nil + } + responder = responder?.next + } + return false + } +} \ No newline at end of file diff --git a/ios/App/shareextension/shareextension.entitlements b/ios/App/shareextension/shareextension.entitlements new file mode 100644 index 0000000..99e6b75 --- /dev/null +++ b/ios/App/shareextension/shareextension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.globaljain.social.shareextension + + + diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..49eb12f --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/ngv'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/npm b/npm new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..95aa52a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20826 @@ +{ + "name": "global-jain-app", + "version": "1.0.30", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "global-jain-app", + "version": "1.0.30", + "dependencies": { + "@angular/common": "^16.1.7", + "@angular/core": "^16.1.7", + "@angular/forms": "^16.1.7", + "@angular/platform-browser": "^16.1.7", + "@angular/platform-browser-dynamic": "^16.1.7", + "@angular/router": "^16.1.7", + "@awesome-cordova-plugins/core": "^8.1.0", + "@awesome-cordova-plugins/file": "^6.7.0", + "@awesome-cordova-plugins/file-transfer": "^6.7.0", + "@awesome-cordova-plugins/social-sharing": "^6.8.0", + "@capacitor-firebase/authentication": "^5.0.1", + "@capacitor/android": "^6.0.0", + "@capacitor/app": "^6.0.0", + "@capacitor/browser": "^6.0.0", + "@capacitor/camera": "^6.0.0", + "@capacitor/core": "^6.0.0", + "@capacitor/device": "^6.0.0", + "@capacitor/filesystem": "^6.0.0", + "@capacitor/ios": "^6.0.0", + "@capacitor/keyboard": "^6.0.0", + "@capacitor/network": "^6.0.0", + "@capacitor/push-notifications": "^6.0.0", + "@capacitor/share": "^6.0.0", + "@capacitor/splash-screen": "^6.0.0", + "@capacitor/status-bar": "^6.0.0", + "@ionic-native/core": "^5.36.0", + "@ionic-native/crop": "^5.36.0", + "@ionic/angular": "^7.2.0", + "@ionic/storage": "^3.0.6", + "capacitor-share-extension": "^2.0.0", + "cordova-plugin-crop": "github:vc-rakesh/cordova-plugin-crop", + "cordova-plugin-x-socialsharing": "^6.0.4", + "date-fns": "^2.28.0", + "es6-promise-plugin": "^4.2.2", + "firebase": "^9.14.0", + "jetifier": "^2.0.0", + "rxjs": "^7.5.7", + "swiper": "^10.0.4", + "tslib": "^2.2.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.1.6", + "@angular-eslint/builder": "16.1.0", + "@angular-eslint/eslint-plugin": "16.1.0", + "@angular-eslint/eslint-plugin-template": "16.1.0", + "@angular-eslint/schematics": "16.1.0", + "@angular-eslint/template-parser": "16.1.0", + "@angular/cli": "^16.1.6", + "@angular/compiler": "^16.1.7", + "@angular/compiler-cli": "^16.1.7", + "@angular/language-service": "^16.1.7", + "@capacitor/cli": "^6.0.0", + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "@ionic/angular-toolkit": "^9.0.0", + "@ionic/cli": "^7.2.0", + "@types/jasmine": "~3.6.11", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^12.20.55", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "eslint": "^8.44.0", + "eslint-plugin-jsdoc": "40.0.0", + "eslint-plugin-prefer-arrow": "1.2.3", + "husky": "^8.0.3", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.2", + "karma": "^6.3.17", + "karma-chrome-launcher": "~3.1.1", + "karma-coverage": "~2.0.3", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.2", + "karma-jasmine-html-reporter": "^1.7.0", + "lint-staged": "^13.2.3", + "ts-node": "~8.3.0", + "typescript": "^4.9.5", + "zone.js": "^0.13.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", + "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/build-webpack": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "16.2.14", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.19.2", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.6.1", + "vite": "4.5.3", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.18.17" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^16.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", + "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1602.14", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.14", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.1.0.tgz", + "integrity": "sha512-KIkE2SI1twFKoCiF/k2VR3ojOcc7TD1xPyY4kbUrx/Gxp+XEzar7O29I/ztzL4eHPBM+Uh3/NwS/jvjjBxjgAg==", + "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1", + "nx": "16.5.1" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.1.0.tgz", + "integrity": "sha512-5EFAWXuFJADr3imo/ZYshY8s0K7U7wyysnE2LXnpT9PAi5rmkzt70UNZNRuamCbXr4tdIiu+fXWOj7tUuJKnnw==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.1.0.tgz", + "integrity": "sha512-BFzzJJlgQgWc8avdSBkaDWAzNSUqcwWy0L1iZSBdXGoIOxj72kLbwe99emb8M+rUfCveljQkeM2pcYu8XLbJIA==", + "dev": true, + "dependencies": { + "@angular-eslint/utils": "16.1.0", + "@typescript-eslint/utils": "5.62.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.1.0.tgz", + "integrity": "sha512-wQHWR5vqWGgO7mqoG5ixXeplIlz/OmxBJE9QMLPTZE8GdaTx8+F/5J37OWh84zCpD3mOa/FHYZxBDm2MfUmA1Q==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "16.1.0", + "@angular-eslint/utils": "16.1.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "3.1.1" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.1.0.tgz", + "integrity": "sha512-L1tmP3R2krHyveaRXAvn/SeDoBFNpS1VtPPrzZm1NYr1qPcAxf3NtG2nnoyVFu6WZGt59ZGHNQ/dZxnXvm0UGg==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "16.1.0", + "@angular-eslint/eslint-plugin-template": "16.1.0", + "@nx/devkit": "16.5.1", + "ignore": "5.2.4", + "nx": "16.5.1", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 16.0.0 < 17.0.0" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.1.0.tgz", + "integrity": "sha512-DOQtzVehtbO7+BQ+FMOXRsxGRjHb3ve6M+S4qASKTiI+twtONjRODcHezD3N4PDkjpKPbOnk7YnFsHur5csUNw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "16.1.0", + "eslint-scope": "^7.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.1.0.tgz", + "integrity": "sha512-u5XscYUq1F/7RuwyVIV2a280QL27lyQz434VYR+Np/oO21NGj5jxoRKb55xhXT9EFVs5Sy4JYeEUp6S75J/cUw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "16.1.0", + "@typescript-eslint/utils": "5.62.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/cli": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.2.12" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "dev": true, + "dependencies": { + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.2.12", + "typescript": ">=4.9.3 <5.2" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/core": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.10.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "16.2.12", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.12", + "@angular/compiler": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12" + } + }, + "node_modules/@angular/router": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@awesome-cordova-plugins/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/core/-/core-8.1.0.tgz", + "integrity": "sha512-7NkUC2FcXSlIuIH2xc1miIdN8/by2uewrIg5JBWauN1KCzCXLhCwZ39C8nBsWxCloAxCvec+MMU5SzJGGWfjTg==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@awesome-cordova-plugins/file": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/file/-/file-6.7.0.tgz", + "integrity": "sha512-f4XYWQfLovbvgZCr4uK+ppiPq1IXoezDbc4ZF35G7pb9/Or1lp0GAv8dkOLT/F0X5imaWMPuwe/zQDDe40bVHA==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@awesome-cordova-plugins/core": "^6.0.1", + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@awesome-cordova-plugins/file-transfer": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/file-transfer/-/file-transfer-6.7.0.tgz", + "integrity": "sha512-hCNAlAUhYP0kEnQ2ZlYLngJnwTcPCjJOq56Vlg/ZtJVCAk8ndQoYV3xuasmbtBHF8fA5+aKHyIRdfn74TlU2Bw==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@awesome-cordova-plugins/core": "^6.0.1", + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@awesome-cordova-plugins/social-sharing": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/social-sharing/-/social-sharing-6.8.0.tgz", + "integrity": "sha512-pUaR7fx537T6n7ZU+ydQ4scwoFGA1hirZkvXNfx6FGMMoskvsOJMtZb3OYu5AbNop1wtvjH8FhsXz+9trxq3Fg==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@awesome-cordova-plugins/core": "^6.0.1", + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capacitor-firebase/authentication": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@capacitor-firebase/authentication/-/authentication-5.4.1.tgz", + "integrity": "sha512-6jcPjwm3xeKBCopr8i2Od9tlN/xVBs9rKB8noW9wYDDCeGZqiDBsOrRU9jmgvuRFYnWv6mbss1H+fVxM6CWRKg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/capawesome-team/" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/capawesome" + } + ], + "peerDependencies": { + "@capacitor/core": "^5.0.0", + "firebase": "^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "firebase": { + "optional": true + } + } + }, + "node_modules/@capacitor/android": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.1.0.tgz", + "integrity": "sha512-S4PW4N5xtKHTrICjG7bkBhI70jdXbb+8nbm1pJpuXChCD0gkCcofJhPaw4bCoO0egcugBN1U7DkegNw5jWpHcw==", + "peerDependencies": { + "@capacitor/core": "^6.1.0" + } + }, + "node_modules/@capacitor/app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-6.0.0.tgz", + "integrity": "sha512-X5UGd90Jh5p9rmoPyMqFyFWqOypdJgVJhYcM5X1YyDVJJGzmJ5MuYv1+ajj5DW9Qyh+5a3th9WYptdGby8jidA==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/browser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/browser/-/browser-6.0.1.tgz", + "integrity": "sha512-KBK0PKfmUj0if+gYWEh0+LG70l1gcLGbDCWJt2Ig3naXHGlrLoWBqVArCgbwBzwJZL+VlwW7iEhAzGOWpg2jhw==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/camera": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-6.0.1.tgz", + "integrity": "sha512-KGfjv8q0Q9OEcpBGqSSZD2yb1KeDe12mlzOOPp4wr6GvcOY0EIvZ0o3KiPXegLVuRZeemz71/lCxPHAQ/5gAiA==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.0.tgz", + "integrity": "sha512-HEKDh3+FuNZKFHmSDZ7nAnaX3bzhtznYk9GsZBMac1y4CTAxIykPX9wzZ3DzLeM/EbMBGFClUbefkIkimAyfYg==", + "dev": true, + "dependencies": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-process": "^2.1.11", + "@ionic/utils-subprocess": "2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^2.0.0", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.1.0.tgz", + "integrity": "sha512-Kt4ONm0X9xxJXn9Q73oBaKdzep5B/VJw3VjXa2eGul4cD2k37mJwgjpXSMRnLH0Aju5bCiRL8J/hMAfTlokO6A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/device": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/device/-/device-6.0.0.tgz", + "integrity": "sha512-3cV4XcH9pTWcstecyr8rNBQvFCsxYugJdPetk898airCbV1bqZSGF2YLSoPQj4BiDITSlNgwABNwNYMCNzs/gw==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/filesystem": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-6.0.0.tgz", + "integrity": "sha512-GnC4CBfky7fvG9zSV/aQnZaGs6ZJ90AaQorr53z81ArTCqcrSUeBMuCxWmvti9HrdXLhBavyA1UOjvRGObOFjg==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/ios": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-6.1.0.tgz", + "integrity": "sha512-ex2q0LAyDDgfJj4fKDQuSNUYSpic3939/8A/sIIIxslwuRBF5i5fuhAngu6BhCt/pQSfEETcHtg2j2vD+YEZ2w==", + "peerDependencies": { + "@capacitor/core": "^6.1.0" + } + }, + "node_modules/@capacitor/keyboard": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-6.0.1.tgz", + "integrity": "sha512-fBjqQaMc5uhFj6ycLnLa2hzQsR77pj/iuLLATkWihMUze3dD+IkwqFnEyOLsyk+52uoOYM7WkziSpNTquU1sZA==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/network": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/network/-/network-6.0.1.tgz", + "integrity": "sha512-j+C1khUchNVol3HQGOhHKRAQ3Sc4DumzF8YVJqbkAkfOMHLWr/9g2H/P61yzqEr5kcidpOgWbBwQugHRv7o+7g==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/push-notifications": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/push-notifications/-/push-notifications-6.0.1.tgz", + "integrity": "sha512-NFVAnmBsyuTFScTMUrgOr3EKnCl9etGeXignC2Y5QsOoqjT+fhVhIUco9BR7Bi48JGdvK/evqzwt36LMF82bBw==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/share": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/share/-/share-6.0.1.tgz", + "integrity": "sha512-KQev3omYZ5hgjoZA+NdFZTuFyu1dd/ZIYkE0RnLBB11ZmFEmGRSCYdYtOyqkVxGU1n6FDDqgPPy13CvAZKWNPQ==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/splash-screen": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-6.0.1.tgz", + "integrity": "sha512-ndsqq335Mb6NxDrcXsT0PVwomo/UrDN4ykqpu8wY8F3HT4vbr8Hojh5PLqtlTy6TCIIIen58fkEgIoyGPsPSaw==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-6.0.0.tgz", + "integrity": "sha512-Wo0ILugYlmENegKDgTzVCPjbvP8h1ObgHslLdgeVG643ViMS/diausHIq8e104WIKCXtKIELmQeYVp9mX7932g==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.1.tgz", + "integrity": "sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.8.1", + "@commitlint/lint": "^17.8.1", + "@commitlint/load": "^17.8.1", + "@commitlint/read": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz", + "integrity": "sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^6.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz", + "integrity": "sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.8.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz", + "integrity": "sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.8.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz", + "integrity": "sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz", + "integrity": "sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.8.1", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/format/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/format/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz", + "integrity": "sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.8.1", + "semver": "7.5.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz", + "integrity": "sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.8.1", + "@commitlint/parse": "^17.8.1", + "@commitlint/rules": "^17.8.1", + "@commitlint/types": "^17.8.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz", + "integrity": "sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.8.1", + "@commitlint/execute-rule": "^17.8.1", + "@commitlint/resolve-extends": "^17.8.1", + "@commitlint/types": "^17.8.1", + "@types/node": "20.5.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "dev": true, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/@commitlint/message": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz", + "integrity": "sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz", + "integrity": "sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.8.1", + "conventional-changelog-angular": "^6.0.0", + "conventional-commits-parser": "^4.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz", + "integrity": "sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.8.1", + "@commitlint/types": "^17.8.1", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz", + "integrity": "sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.8.1", + "@commitlint/types": "^17.8.1", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz", + "integrity": "sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.8.1", + "@commitlint/message": "^17.8.1", + "@commitlint/to-lines": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz", + "integrity": "sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz", + "integrity": "sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz", + "integrity": "sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", + "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", + "dev": true, + "dependencies": { + "comment-parser": "1.3.1", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~3.1.0" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.13.tgz", + "integrity": "sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", + "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", + "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", + "dependencies": { + "@firebase/app-check": "0.8.0", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.13.tgz", + "integrity": "sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg==", + "dependencies": { + "@firebase/app": "0.9.13", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.23.2.tgz", + "integrity": "sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.2.tgz", + "integrity": "sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A==", + "dependencies": { + "@firebase/auth": "0.23.2", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", + "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", + "dependencies": { + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", + "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "0.14.4", + "@firebase/database-types": "0.10.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", + "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.13.0.tgz", + "integrity": "sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.1", + "@grpc/grpc-js": "~1.7.0", + "@grpc/proto-loader": "^0.6.13", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.12.tgz", + "integrity": "sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-types": "2.5.1", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", + "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", + "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", + "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/functions": "0.10.0", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", + "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", + "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/messaging/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.4", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", + "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", + "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz", + "integrity": "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@grpc/grpc-js/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@ionic-native/core": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.36.0.tgz", + "integrity": "sha512-lOrkktadlKYbYf1LrDyAtsu1JnQ0oCCdkOU7iHQ8oXnNOkMwobFfD2m62F1CoOr0u9LIkpYnZSPjng8lZbmbNw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/crop": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/crop/-/crop-5.36.0.tgz", + "integrity": "sha512-wRO8J9oSHl4klvPMti7MTYjFCl6dYHYlbe56gzImf1pwfKQ7gmusskeedABfZggPV1NHruMBKUNALdatJf603A==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic/angular": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.8.6.tgz", + "integrity": "sha512-3Qe53hXpyjtx6fFcxt/NTAlauIawsGmCZJPauV5sAnSKVuX8C82C1zMAZTeJt6m2dnd71wythc98BXUXsx/UxQ==", + "dependencies": { + "@ionic/core": "7.8.6", + "ionicons": "^7.0.0", + "jsonc-parser": "^3.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=14.0.0", + "@angular/forms": ">=14.0.0", + "@angular/router": ">=14.0.0", + "rxjs": ">=7.5.0", + "zone.js": ">=0.11.0" + } + }, + "node_modules/@ionic/angular-toolkit": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-9.0.0.tgz", + "integrity": "sha512-Rh8z+XGQiyEzJ2nMKTAa3nmejgabxY6f/2q+9Jm/B/VnXjpyeSe8bgP008c0EZYBvrKs7MjP1ZrNi+4FM0W3fg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "^15.0.0", + "@angular-devkit/schematics": "^15.0.0", + "@schematics/angular": "^15.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { + "version": "15.2.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.11.tgz", + "integrity": "sha512-zd6QelJ8pOPvz6TsehR0JqixjDjzgEOkKywBJBuwNXY+Nw3MJGayJeWS0UgC+Gk+LoTkpI21RoyaYELkAmD/tw==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { + "version": "15.2.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.11.tgz", + "integrity": "sha512-Wfj0FO8lcGqOkg7GTYOGUsAHqTS9GMfGXTAGsM/8g0SZI4kaPy/luZSPFtevpFE5PSR6dyWSIC0GgzfavjhJMg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.11", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { + "version": "15.2.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.11.tgz", + "integrity": "sha512-z38f9abwfzUGe9TEIggf3igpVf/ylmSlHy1jydAxXbeKv24ejg8m5dYBPH2/MvgUFP6tjHdxjKD56DnOdyKl3g==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.11", + "@angular-devkit/schematics": "15.2.11", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@ionic/cli": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-7.2.0.tgz", + "integrity": "sha512-IEms9Df8mJOoWPqgvZEXmqKztttHDFAz+9ewDPZGYv8Xx66Cj7zSen13O2Vf4FuLXhl+U95HXT9sAs4lDwFmcQ==", + "dev": true, + "dependencies": { + "@ionic/cli-framework": "6.0.1", + "@ionic/cli-framework-output": "2.2.8", + "@ionic/cli-framework-prompts": "2.1.13", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-network": "2.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-subprocess": "3.0.1", + "@ionic/utils-terminal": "2.3.5", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "diff": "^4.0.1", + "elementtree": "^0.1.7", + "leek": "0.0.24", + "lodash": "^4.17.5", + "open": "^7.0.4", + "os-name": "^4.0.0", + "proxy-agent": "^6.3.0", + "semver": "^7.1.1", + "split2": "^3.0.0", + "ssh-config": "^1.1.1", + "stream-combiner2": "^1.1.1", + "superagent": "^8.0.9", + "tar": "^6.0.1", + "tslib": "^2.0.1" + }, + "bin": { + "ionic": "bin/ionic" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-6.0.1.tgz", + "integrity": "sha512-Fyix4eQt2HKTV+GoeoiziQGZyqIA8RfoMqjGyAS5XgNXLOYW0P27Ph348hQZh9Mphjf+m0lOYa6dWQTEPzUHiQ==", + "dev": true, + "dependencies": { + "@ionic/cli-framework-output": "2.2.8", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-object": "2.1.6", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-subprocess": "3.0.1", + "@ionic/utils-terminal": "2.3.5", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "lodash": "^4.17.5", + "minimist": "^1.2.0", + "rimraf": "^3.0.0", + "tslib": "^2.0.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.13.tgz", + "integrity": "sha512-Yj1fz6p7OehreQ8C70bd9+M6tYP/rvzLw5JVj8pT/N9s0kQSjqEFRbs96LKr3lfd3TADZaS8OlZrQIqenFIUpg==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "inquirer": "^7.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework/node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@ionic/cli-framework/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@ionic/cli-framework/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ionic/cli-framework/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli/node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@ionic/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@ionic/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/core": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.8.6.tgz", + "integrity": "sha512-HAYZdEmeJgOdo2kDlZkcCGHb+zs/vjU6iv4skbVBL7y+OnSv/oC2u83Yee8S3/aY0YAxkyBgu7hLTYH13Zc2Aw==", + "dependencies": { + "@stencil/core": "^4.12.2", + "ionicons": "^7.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/storage": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-3.0.6.tgz", + "integrity": "sha512-sw+zSJINIpbQCGZR9mEtb9N0WmZLuhcMVqOZJBqLuDACAMdXqG39zmp5nSVqhGI1/9X3nd0K5gVn6icyVfUnUg==", + "dependencies": { + "localforage": "^1.9.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-network": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.7.tgz", + "integrity": "sha512-5Q3NdZtSLiLs7ufuX9X293BvAwo8CxaD93Hkp3ODPgctLYErv3nFibhq3j+eguEqUh2um9WNXEUOuQ8x+Sd1fw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.3", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-fs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@ngtools/webpack": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", + "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "dependencies": { + "nx": "16.5.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 15 <= 17" + } + }, + "node_modules/@nx/devkit/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/devkit/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@schematics/angular": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sigstore/sign/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@stencil/core": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.19.1.tgz", + "integrity": "sha512-fjSBctHrobeSL2+XcuX7GVk/eaUhZ/lvIu21RJmzHAPcNyueuSAEv7J/Isn4UlYNk70o+yOK72H0FTlNkUibvw==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cordova": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", + "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.11.tgz", + "integrity": "sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ==", + "dev": true + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.13.tgz", + "integrity": "sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==", + "dev": true, + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001638", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", + "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capacitor-share-extension": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capacitor-share-extension/-/capacitor-share-extension-2.0.0.tgz", + "integrity": "sha512-sOxfRKe9Gu7hq1zqRa8F6tmaSUnG5Efi7XG0MshbZ4Y6zCy9coiOd4LQObwHa0ym1ASZ21quUTOEylxnzueTiA==" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", + "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz", + "integrity": "sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-plugin-crop": { + "version": "0.4.0", + "resolved": "git+ssh://git@github.com/vc-rakesh/cordova-plugin-crop.git#cb643b09d1dd859e6212fdd4d5f8381a9e1fb396", + "license": "MIT" + }, + "node_modules/cordova-plugin-x-socialsharing": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-x-socialsharing/-/cordova-plugin-x-socialsharing-6.0.4.tgz", + "integrity": "sha512-+ak6rN9i2xf/PARA/T3Hss09s0QhpFrOWvrYowy+PkCjGWx/ZVt9RkW+7yKemfyTXSgTp0YkyAAR4r6hPAfBGQ==", + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ] + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/critters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.814", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.814.tgz", + "integrity": "sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==", + "dev": true + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/es6-promise-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz", + "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==" + }, + "node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.0.0.tgz", + "integrity": "sha512-LOPyIu1vAVvGPkye3ci0moj0iNf3f8bmin6do2DYDj+77NRXWnkmhKRy8swWsatUs3mB5jYPWPUsFg9pyfEiyA==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.36.1", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "semver": "^7.3.8", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18 || ^19" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firebase": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", + "integrity": "sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.13", + "@firebase/app-check": "0.8.0", + "@firebase/app-check-compat": "0.3.7", + "@firebase/app-compat": "0.2.13", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "0.23.2", + "@firebase/auth-compat": "0.4.2", + "@firebase/database": "0.14.4", + "@firebase/database-compat": "0.3.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-compat": "0.3.12", + "@firebase/functions": "0.10.0", + "@firebase/functions-compat": "0.3.5", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.4", + "@firebase/messaging-compat": "0.2.4", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-compat": "0.3.2", + "@firebase/util": "1.9.3" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ionicons": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", + "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", + "dependencies": { + "@stencil/core": "^4.0.3" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jetifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-2.0.0.tgz", + "integrity": "sha512-J4Au9KuT74te+PCCCHKgAjyLlEa+2VyIAEPNCdE5aNkAJ6FAJcAqcdzEkSnzNksIa9NkGmC4tPiClk2e7tCJuQ==", + "bin": { + "jetifier": "bin/jetify", + "jetifier-standalone": "bin/jetifier-standalone", + "jetify": "bin/jetify" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", + "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", + "dev": true, + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", + "dev": true, + "dependencies": { + "debug": "^2.1.0", + "lodash.assign": "^3.2.0", + "rsvp": "^3.0.21" + } + }, + "node_modules/leek/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/leek/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lint-staged": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", + "lilconfig": "2.1.0", + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/lint-staged/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true + }, + "node_modules/lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "dev": true, + "dependencies": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "node_modules/lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", + "dev": true, + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-run": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", + "dev": true, + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/native-run/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/needle/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "dev": true + }, + "node_modules/nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/nx/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true, + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sigstore/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssh-config": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", + "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swiper": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.3.1.tgz", + "integrity": "sha512-24Wk3YUdZHxjc9faID97GTu6xnLNia+adMt6qMTZG/HgdSUt4fS0REsGUXJOgpTED0Amh/j+gRGQxsLayJUlBQ==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + }, + "peerDependencies": { + "typescript": ">=2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tuf-js/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6641670 --- /dev/null +++ b/package.json @@ -0,0 +1,105 @@ +{ + "name": "global-jain-app", + "version": "1.0.30", + "author": "Ionic Framework", + "homepage": "https://ionicframework.com/", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint --fix", + "e2e": "ng e2e", + "prodBuild": "ionic build --prod && npx cap sync android && npx cap copy android && npx cap open android", + "prodBuildIos": "ionic build --prod && npx cap sync ios && npx cap copy ios && npx cap open ios", + "stagingBuild": "ionic build --configuration=staging && npx cap sync android && npx cap copy android && npx cap open android", + "stagingBuildIos": "ionic build --configuration=staging && npx cap sync ios && npx cap copy ios && npx cap open ios", + "prepare": "husky install" + }, + "private": true, + "dependencies": { + "@angular/common": "^16.1.7", + "@angular/core": "^16.1.7", + "@angular/forms": "^16.1.7", + "@angular/platform-browser": "^16.1.7", + "@angular/platform-browser-dynamic": "^16.1.7", + "@angular/router": "^16.1.7", + "@awesome-cordova-plugins/core": "^8.1.0", + "@awesome-cordova-plugins/file": "^6.7.0", + "@awesome-cordova-plugins/file-transfer": "^6.7.0", + "@awesome-cordova-plugins/social-sharing": "^6.8.0", + "@capacitor-firebase/authentication": "^5.0.1", + "@capacitor/android": "^6.0.0", + "@capacitor/app": "^6.0.0", + "@capacitor/browser": "^6.0.0", + "@capacitor/camera": "^6.0.0", + "@capacitor/core": "^6.0.0", + "@capacitor/device": "^6.0.0", + "@capacitor/filesystem": "^6.0.0", + "@capacitor/ios": "^6.0.0", + "@capacitor/keyboard": "^6.0.0", + "@capacitor/network": "^6.0.0", + "@capacitor/push-notifications": "^6.0.0", + "@capacitor/share": "^6.0.0", + "@capacitor/splash-screen": "^6.0.0", + "@capacitor/status-bar": "^6.0.0", + "@ionic-native/core": "^5.36.0", + "@ionic-native/crop": "^5.36.0", + "@ionic/angular": "^7.2.0", + "@ionic/storage": "^3.0.6", + "capacitor-share-extension": "^2.0.0", + "cordova-plugin-crop": "github:vc-rakesh/cordova-plugin-crop", + "cordova-plugin-x-socialsharing": "^6.0.4", + "date-fns": "^2.28.0", + "es6-promise-plugin": "^4.2.2", + "firebase": "^9.14.0", + "jetifier": "^2.0.0", + "rxjs": "^7.5.7", + "swiper": "^10.0.4", + "tslib": "^2.2.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.1.6", + "@angular-eslint/builder": "16.1.0", + "@angular-eslint/eslint-plugin": "16.1.0", + "@angular-eslint/eslint-plugin-template": "16.1.0", + "@angular-eslint/schematics": "16.1.0", + "@angular-eslint/template-parser": "16.1.0", + "@angular/cli": "^16.1.6", + "@angular/compiler": "^16.1.7", + "@angular/compiler-cli": "^16.1.7", + "@angular/language-service": "^16.1.7", + "@capacitor/cli": "^6.0.0", + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "@ionic/angular-toolkit": "^9.0.0", + "@ionic/cli": "^7.2.0", + "@types/jasmine": "~3.6.11", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^12.20.55", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "eslint": "^8.44.0", + "eslint-plugin-jsdoc": "40.0.0", + "eslint-plugin-prefer-arrow": "1.2.3", + "husky": "^8.0.3", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.2", + "karma": "^6.3.17", + "karma-chrome-launcher": "~3.1.1", + "karma-coverage": "~2.0.3", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.2", + "karma-jasmine-html-reporter": "^1.7.0", + "lint-staged": "^13.2.3", + "ts-node": "~8.3.0", + "typescript": "^4.9.5", + "zone.js": "^0.13.1" + }, + "description": "WORLD'S FIRST and LARGEST Religious Social Networking Platform FOR JAINS", + "lint-staged": { + "src/**/*.{js,ts,html}": [ + "eslint --fix" + ] + } +} diff --git a/resources/android/icon-background.png b/resources/android/icon-background.png new file mode 100644 index 0000000..c865b2a Binary files /dev/null and b/resources/android/icon-background.png differ diff --git a/resources/android/icon-foreground.png b/resources/android/icon-foreground.png new file mode 100644 index 0000000..b371d95 Binary files /dev/null and b/resources/android/icon-foreground.png differ diff --git a/resources/android/icon/drawable-hdpi-icon.png b/resources/android/icon/drawable-hdpi-icon.png new file mode 100644 index 0000000..4c1ea4e Binary files /dev/null and b/resources/android/icon/drawable-hdpi-icon.png differ diff --git a/resources/android/icon/drawable-ldpi-icon.png b/resources/android/icon/drawable-ldpi-icon.png new file mode 100644 index 0000000..29e9210 Binary files /dev/null and b/resources/android/icon/drawable-ldpi-icon.png differ diff --git a/resources/android/icon/drawable-mdpi-icon.png b/resources/android/icon/drawable-mdpi-icon.png new file mode 100644 index 0000000..55f4f3f Binary files /dev/null and b/resources/android/icon/drawable-mdpi-icon.png differ diff --git a/resources/android/icon/drawable-xhdpi-icon.png b/resources/android/icon/drawable-xhdpi-icon.png new file mode 100644 index 0000000..5958410 Binary files /dev/null and b/resources/android/icon/drawable-xhdpi-icon.png differ diff --git a/resources/android/icon/drawable-xxhdpi-icon.png b/resources/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 0000000..d5d3340 Binary files /dev/null and b/resources/android/icon/drawable-xxhdpi-icon.png differ diff --git a/resources/android/icon/drawable-xxxhdpi-icon.png b/resources/android/icon/drawable-xxxhdpi-icon.png new file mode 100644 index 0000000..5c2fc9f Binary files /dev/null and b/resources/android/icon/drawable-xxxhdpi-icon.png differ diff --git a/resources/android/icon/hdpi-background.png b/resources/android/icon/hdpi-background.png new file mode 100644 index 0000000..77d09c9 Binary files /dev/null and b/resources/android/icon/hdpi-background.png differ diff --git a/resources/android/icon/hdpi-foreground.png b/resources/android/icon/hdpi-foreground.png new file mode 100644 index 0000000..77d09c9 Binary files /dev/null and b/resources/android/icon/hdpi-foreground.png differ diff --git a/resources/android/icon/ldpi-background.png b/resources/android/icon/ldpi-background.png new file mode 100644 index 0000000..8d91020 Binary files /dev/null and b/resources/android/icon/ldpi-background.png differ diff --git a/resources/android/icon/ldpi-foreground.png b/resources/android/icon/ldpi-foreground.png new file mode 100644 index 0000000..8d91020 Binary files /dev/null and b/resources/android/icon/ldpi-foreground.png differ diff --git a/resources/android/icon/mdpi-background.png b/resources/android/icon/mdpi-background.png new file mode 100644 index 0000000..163e1b4 Binary files /dev/null and b/resources/android/icon/mdpi-background.png differ diff --git a/resources/android/icon/mdpi-foreground.png b/resources/android/icon/mdpi-foreground.png new file mode 100644 index 0000000..163e1b4 Binary files /dev/null and b/resources/android/icon/mdpi-foreground.png differ diff --git a/resources/android/icon/xhdpi-background.png b/resources/android/icon/xhdpi-background.png new file mode 100644 index 0000000..d5e869d Binary files /dev/null and b/resources/android/icon/xhdpi-background.png differ diff --git a/resources/android/icon/xhdpi-foreground.png b/resources/android/icon/xhdpi-foreground.png new file mode 100644 index 0000000..0a3cf7e Binary files /dev/null and b/resources/android/icon/xhdpi-foreground.png differ diff --git a/resources/android/icon/xxhdpi-background.png b/resources/android/icon/xxhdpi-background.png new file mode 100644 index 0000000..6913e2c Binary files /dev/null and b/resources/android/icon/xxhdpi-background.png differ diff --git a/resources/android/icon/xxhdpi-foreground.png b/resources/android/icon/xxhdpi-foreground.png new file mode 100644 index 0000000..ce425f0 Binary files /dev/null and b/resources/android/icon/xxhdpi-foreground.png differ diff --git a/resources/android/icon/xxxhdpi-background.png b/resources/android/icon/xxxhdpi-background.png new file mode 100644 index 0000000..c865b2a Binary files /dev/null and b/resources/android/icon/xxxhdpi-background.png differ diff --git a/resources/android/icon/xxxhdpi-foreground.png b/resources/android/icon/xxxhdpi-foreground.png new file mode 100644 index 0000000..b371d95 Binary files /dev/null and b/resources/android/icon/xxxhdpi-foreground.png differ diff --git a/resources/android/splash/drawable-land-hdpi-screen.png b/resources/android/splash/drawable-land-hdpi-screen.png new file mode 100644 index 0000000..3543f3b Binary files /dev/null and b/resources/android/splash/drawable-land-hdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-ldpi-screen.png b/resources/android/splash/drawable-land-ldpi-screen.png new file mode 100644 index 0000000..e9a0c15 Binary files /dev/null and b/resources/android/splash/drawable-land-ldpi-screen.png differ diff --git a/resources/android/splash/drawable-land-mdpi-screen.png b/resources/android/splash/drawable-land-mdpi-screen.png new file mode 100644 index 0000000..d77a648 Binary files /dev/null and b/resources/android/splash/drawable-land-mdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xhdpi-screen.png b/resources/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 0000000..76af857 Binary files /dev/null and b/resources/android/splash/drawable-land-xhdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xxhdpi-screen.png b/resources/android/splash/drawable-land-xxhdpi-screen.png new file mode 100644 index 0000000..995eb3a Binary files /dev/null and b/resources/android/splash/drawable-land-xxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xxxhdpi-screen.png b/resources/android/splash/drawable-land-xxxhdpi-screen.png new file mode 100644 index 0000000..905f569 Binary files /dev/null and b/resources/android/splash/drawable-land-xxxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-hdpi-screen.png b/resources/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 0000000..4c9e5a0 Binary files /dev/null and b/resources/android/splash/drawable-port-hdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-ldpi-screen.png b/resources/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 0000000..d79f435 Binary files /dev/null and b/resources/android/splash/drawable-port-ldpi-screen.png differ diff --git a/resources/android/splash/drawable-port-mdpi-screen.png b/resources/android/splash/drawable-port-mdpi-screen.png new file mode 100644 index 0000000..ec50f6a Binary files /dev/null and b/resources/android/splash/drawable-port-mdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xhdpi-screen.png b/resources/android/splash/drawable-port-xhdpi-screen.png new file mode 100644 index 0000000..26cbb38 Binary files /dev/null and b/resources/android/splash/drawable-port-xhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xxhdpi-screen.png b/resources/android/splash/drawable-port-xxhdpi-screen.png new file mode 100644 index 0000000..19032f7 Binary files /dev/null and b/resources/android/splash/drawable-port-xxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xxxhdpi-screen.png b/resources/android/splash/drawable-port-xxxhdpi-screen.png new file mode 100644 index 0000000..e4f0a1e Binary files /dev/null and b/resources/android/splash/drawable-port-xxxhdpi-screen.png differ diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000..a42f2ba Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/ios/icon/icon-1024.png b/resources/ios/icon/icon-1024.png new file mode 100644 index 0000000..eb18fb0 Binary files /dev/null and b/resources/ios/icon/icon-1024.png differ diff --git a/resources/ios/icon/icon-108@2x.png b/resources/ios/icon/icon-108@2x.png new file mode 100644 index 0000000..de351f8 Binary files /dev/null and b/resources/ios/icon/icon-108@2x.png differ diff --git a/resources/ios/icon/icon-20.png b/resources/ios/icon/icon-20.png new file mode 100644 index 0000000..23aa0cf Binary files /dev/null and b/resources/ios/icon/icon-20.png differ diff --git a/resources/ios/icon/icon-20@2x.png b/resources/ios/icon/icon-20@2x.png new file mode 100644 index 0000000..c137ea3 Binary files /dev/null and b/resources/ios/icon/icon-20@2x.png differ diff --git a/resources/ios/icon/icon-20@3x.png b/resources/ios/icon/icon-20@3x.png new file mode 100644 index 0000000..d9a0cc9 Binary files /dev/null and b/resources/ios/icon/icon-20@3x.png differ diff --git a/resources/ios/icon/icon-24@2x.png b/resources/ios/icon/icon-24@2x.png new file mode 100644 index 0000000..23f16da Binary files /dev/null and b/resources/ios/icon/icon-24@2x.png differ diff --git a/resources/ios/icon/icon-27.5@2x.png b/resources/ios/icon/icon-27.5@2x.png new file mode 100644 index 0000000..6c1cd31 Binary files /dev/null and b/resources/ios/icon/icon-27.5@2x.png differ diff --git a/resources/ios/icon/icon-29.png b/resources/ios/icon/icon-29.png new file mode 100644 index 0000000..f74066c Binary files /dev/null and b/resources/ios/icon/icon-29.png differ diff --git a/resources/ios/icon/icon-29@2x.png b/resources/ios/icon/icon-29@2x.png new file mode 100644 index 0000000..d095d46 Binary files /dev/null and b/resources/ios/icon/icon-29@2x.png differ diff --git a/resources/ios/icon/icon-29@3x.png b/resources/ios/icon/icon-29@3x.png new file mode 100644 index 0000000..7bac78b Binary files /dev/null and b/resources/ios/icon/icon-29@3x.png differ diff --git a/resources/ios/icon/icon-40.png b/resources/ios/icon/icon-40.png new file mode 100644 index 0000000..c137ea3 Binary files /dev/null and b/resources/ios/icon/icon-40.png differ diff --git a/resources/ios/icon/icon-40@2x.png b/resources/ios/icon/icon-40@2x.png new file mode 100644 index 0000000..63bc88d Binary files /dev/null and b/resources/ios/icon/icon-40@2x.png differ diff --git a/resources/ios/icon/icon-40@3x.png b/resources/ios/icon/icon-40@3x.png new file mode 100644 index 0000000..f66d89e Binary files /dev/null and b/resources/ios/icon/icon-40@3x.png differ diff --git a/resources/ios/icon/icon-44@2x.png b/resources/ios/icon/icon-44@2x.png new file mode 100644 index 0000000..8182688 Binary files /dev/null and b/resources/ios/icon/icon-44@2x.png differ diff --git a/resources/ios/icon/icon-50.png b/resources/ios/icon/icon-50.png new file mode 100644 index 0000000..da49a3d Binary files /dev/null and b/resources/ios/icon/icon-50.png differ diff --git a/resources/ios/icon/icon-50@2x.png b/resources/ios/icon/icon-50@2x.png new file mode 100644 index 0000000..93854ce Binary files /dev/null and b/resources/ios/icon/icon-50@2x.png differ diff --git a/resources/ios/icon/icon-60.png b/resources/ios/icon/icon-60.png new file mode 100644 index 0000000..d9a0cc9 Binary files /dev/null and b/resources/ios/icon/icon-60.png differ diff --git a/resources/ios/icon/icon-60@2x.png b/resources/ios/icon/icon-60@2x.png new file mode 100644 index 0000000..f66d89e Binary files /dev/null and b/resources/ios/icon/icon-60@2x.png differ diff --git a/resources/ios/icon/icon-60@3x.png b/resources/ios/icon/icon-60@3x.png new file mode 100644 index 0000000..b8bb6dc Binary files /dev/null and b/resources/ios/icon/icon-60@3x.png differ diff --git a/resources/ios/icon/icon-72.png b/resources/ios/icon/icon-72.png new file mode 100644 index 0000000..3a4a26c Binary files /dev/null and b/resources/ios/icon/icon-72.png differ diff --git a/resources/ios/icon/icon-72@2x.png b/resources/ios/icon/icon-72@2x.png new file mode 100644 index 0000000..192438d Binary files /dev/null and b/resources/ios/icon/icon-72@2x.png differ diff --git a/resources/ios/icon/icon-76.png b/resources/ios/icon/icon-76.png new file mode 100644 index 0000000..1829b5c Binary files /dev/null and b/resources/ios/icon/icon-76.png differ diff --git a/resources/ios/icon/icon-76@2x.png b/resources/ios/icon/icon-76@2x.png new file mode 100644 index 0000000..59f3078 Binary files /dev/null and b/resources/ios/icon/icon-76@2x.png differ diff --git a/resources/ios/icon/icon-83.5@2x.png b/resources/ios/icon/icon-83.5@2x.png new file mode 100644 index 0000000..e709486 Binary files /dev/null and b/resources/ios/icon/icon-83.5@2x.png differ diff --git a/resources/ios/icon/icon-86@2x.png b/resources/ios/icon/icon-86@2x.png new file mode 100644 index 0000000..1d015d7 Binary files /dev/null and b/resources/ios/icon/icon-86@2x.png differ diff --git a/resources/ios/icon/icon-98@2x.png b/resources/ios/icon/icon-98@2x.png new file mode 100644 index 0000000..d743522 Binary files /dev/null and b/resources/ios/icon/icon-98@2x.png differ diff --git a/resources/ios/icon/icon.png b/resources/ios/icon/icon.png new file mode 100644 index 0000000..182160f Binary files /dev/null and b/resources/ios/icon/icon.png differ diff --git a/resources/ios/icon/icon@2x.png b/resources/ios/icon/icon@2x.png new file mode 100644 index 0000000..88d28c7 Binary files /dev/null and b/resources/ios/icon/icon@2x.png differ diff --git a/resources/ios/splash/Default-1792h~iphone.png b/resources/ios/splash/Default-1792h~iphone.png new file mode 100644 index 0000000..8305dc6 Binary files /dev/null and b/resources/ios/splash/Default-1792h~iphone.png differ diff --git a/resources/ios/splash/Default-2436h.png b/resources/ios/splash/Default-2436h.png new file mode 100644 index 0000000..b2d1d0e Binary files /dev/null and b/resources/ios/splash/Default-2436h.png differ diff --git a/resources/ios/splash/Default-2688h~iphone.png b/resources/ios/splash/Default-2688h~iphone.png new file mode 100644 index 0000000..5835406 Binary files /dev/null and b/resources/ios/splash/Default-2688h~iphone.png differ diff --git a/resources/ios/splash/Default-568h@2x~iphone.png b/resources/ios/splash/Default-568h@2x~iphone.png new file mode 100644 index 0000000..eca15db Binary files /dev/null and b/resources/ios/splash/Default-568h@2x~iphone.png differ diff --git a/resources/ios/splash/Default-667h.png b/resources/ios/splash/Default-667h.png new file mode 100644 index 0000000..54304a5 Binary files /dev/null and b/resources/ios/splash/Default-667h.png differ diff --git a/resources/ios/splash/Default-736h.png b/resources/ios/splash/Default-736h.png new file mode 100644 index 0000000..c82759e Binary files /dev/null and b/resources/ios/splash/Default-736h.png differ diff --git a/resources/ios/splash/Default-Landscape-1792h~iphone.png b/resources/ios/splash/Default-Landscape-1792h~iphone.png new file mode 100644 index 0000000..a74905b Binary files /dev/null and b/resources/ios/splash/Default-Landscape-1792h~iphone.png differ diff --git a/resources/ios/splash/Default-Landscape-2436h.png b/resources/ios/splash/Default-Landscape-2436h.png new file mode 100644 index 0000000..26ae80a Binary files /dev/null and b/resources/ios/splash/Default-Landscape-2436h.png differ diff --git a/resources/ios/splash/Default-Landscape-2688h~iphone.png b/resources/ios/splash/Default-Landscape-2688h~iphone.png new file mode 100644 index 0000000..b86926b Binary files /dev/null and b/resources/ios/splash/Default-Landscape-2688h~iphone.png differ diff --git a/resources/ios/splash/Default-Landscape-736h.png b/resources/ios/splash/Default-Landscape-736h.png new file mode 100644 index 0000000..09a79a3 Binary files /dev/null and b/resources/ios/splash/Default-Landscape-736h.png differ diff --git a/resources/ios/splash/Default-Landscape@2x~ipad.png b/resources/ios/splash/Default-Landscape@2x~ipad.png new file mode 100644 index 0000000..797ea28 Binary files /dev/null and b/resources/ios/splash/Default-Landscape@2x~ipad.png differ diff --git a/resources/ios/splash/Default-Landscape@~ipadpro.png b/resources/ios/splash/Default-Landscape@~ipadpro.png new file mode 100644 index 0000000..ed4e4ee Binary files /dev/null and b/resources/ios/splash/Default-Landscape@~ipadpro.png differ diff --git a/resources/ios/splash/Default-Landscape~ipad.png b/resources/ios/splash/Default-Landscape~ipad.png new file mode 100644 index 0000000..2a7c461 Binary files /dev/null and b/resources/ios/splash/Default-Landscape~ipad.png differ diff --git a/resources/ios/splash/Default-Portrait@2x~ipad.png b/resources/ios/splash/Default-Portrait@2x~ipad.png new file mode 100644 index 0000000..f529714 Binary files /dev/null and b/resources/ios/splash/Default-Portrait@2x~ipad.png differ diff --git a/resources/ios/splash/Default-Portrait@~ipadpro.png b/resources/ios/splash/Default-Portrait@~ipadpro.png new file mode 100644 index 0000000..be549f3 Binary files /dev/null and b/resources/ios/splash/Default-Portrait@~ipadpro.png differ diff --git a/resources/ios/splash/Default-Portrait~ipad.png b/resources/ios/splash/Default-Portrait~ipad.png new file mode 100644 index 0000000..055fb19 Binary files /dev/null and b/resources/ios/splash/Default-Portrait~ipad.png differ diff --git a/resources/ios/splash/Default@2x~iphone.png b/resources/ios/splash/Default@2x~iphone.png new file mode 100644 index 0000000..08462a6 Binary files /dev/null and b/resources/ios/splash/Default@2x~iphone.png differ diff --git a/resources/ios/splash/Default@2x~universal~anyany.png b/resources/ios/splash/Default@2x~universal~anyany.png new file mode 100644 index 0000000..1aa68af Binary files /dev/null and b/resources/ios/splash/Default@2x~universal~anyany.png differ diff --git a/resources/ios/splash/Default~iphone.png b/resources/ios/splash/Default~iphone.png new file mode 100644 index 0000000..53a1caa Binary files /dev/null and b/resources/ios/splash/Default~iphone.png differ diff --git a/resources/splash.png b/resources/splash.png new file mode 100644 index 0000000..84c66fe Binary files /dev/null and b/resources/splash.png differ diff --git a/resources/splash0.png b/resources/splash0.png new file mode 100644 index 0000000..bcc8137 Binary files /dev/null and b/resources/splash0.png differ diff --git a/resources/splash1.png b/resources/splash1.png new file mode 100644 index 0000000..d3da1eb Binary files /dev/null and b/resources/splash1.png differ diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..13b9677 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,3 @@ + + + diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..73a13e3 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,146 @@ +import { Component, NgZone } from '@angular/core'; +import { App, URLOpenListenerEvent } from '@capacitor/app'; +import { Capacitor } from '@capacitor/core'; +import { SplashScreen } from '@capacitor/splash-screen'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { IonicModule, NavController, Platform } from '@ionic/angular'; +import { PushService } from '@services//push.service'; +import { FirebaseService } from '@services/firebase.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { ShareExtension } from 'capacitor-share-extension'; + +@Component({ + selector: 'app-root', + templateUrl: 'app.component.html', + standalone: true, + imports: [IonicModule] +}) +export class AppComponent { + constructor( + private platform: Platform, + private zone: NgZone, + private navCtrl: NavController, + private pushService: PushService, + private readonly firebaseService: FirebaseService, + private stateManagementService: StateManagementService, + private utilityService: UtilityService, + private httpRequestService: HttpRequestService, + ) { + this.insertScript(); + this.initializeApp(); + this.getCommonData(); + } + + insertScript() { + const url = `https://maps.googleapis.com/maps/api/js?key=${environment.mapKey}&libraries=places&callback=cb`; + const x: any = document.createElement('SCRIPT'); + x.src = url; + document.body.appendChild(x); + } + + initializeApp() { + this.firebaseService.initialize(); + this.platform.ready().then(() => { + this.stateManagementService.fetchNotificationCounts(); + this.utilityService.handleInternetStatus(); + App.addListener('resume', () => { + this.stateManagementService.fetchNotificationCounts(); + }); + setTimeout(() => { + SplashScreen.hide(); + }, 4000); + this.handleDeepLinking(); + this.handleMentionsClick(); + if (Capacitor.isPluginAvailable('PushNotifications')) { + this.pushService.init(); + } + if (Capacitor.isPluginAvailable('ShareExtension')) { + window.addEventListener('sendIntentReceived', () => { + this.checkIntent(); + }); + this.checkIntent(); + } + }); + } + + handleMentionsClick() { + document.addEventListener('click', async (e: any) => { + e.stopPropagation(); + this.zone.run(() => { + if (e.target.classList.contains('mention-user') && +e.target.getAttribute('data-id')) { + this.navCtrl.navigateForward( + Roots.page + '/' + Roots.shravakOtherProfile.replace(':id', e.target.getAttribute('data-id')) + ); + } else if (e.target.classList.contains('mention-sant') && +e.target.getAttribute('data-id')) { + this.navCtrl.navigateForward( + Roots.page + '/' + Roots.santViewProfile.replace(':santId', e.target.getAttribute('data-id')) + ); + } else if (e.target.classList.contains('mention-sangh') && +e.target.getAttribute('data-id')) { + this.navCtrl.navigateForward( + Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', e.target.getAttribute('data-id')) + ); + } + }, false); + }); + } + + async handleDeepLinking() { + App.addListener('appUrlOpen', (event: URLOpenListenerEvent) => { + this.zone.run(async () => { + const { hostname } = new URL(event.url); + const pathArray = event.url.split(hostname); + const appPath = pathArray.pop(); + if (appPath) { + if (appPath.includes('user/invitation')) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakFeeds); + } else { + this.navCtrl.navigateForward(appPath); + } + } + }); + }); + } + + async checkIntent() { + try { + const result: any = await ShareExtension.checkSendIntentReceived(); + if (result?.payload?.length) { + this.stateManagementService.shareData = result.payload; + this.zone.run(() => { + setTimeout(async () => { + const userData = await this.stateManagementService.storage.get(GJainStorage.userData); + const navOption = { + state: { + isUpdate: false, + fromFeed: true, + redirectTo: 'page/shravak-feeds', + type: 1, + type_id: userData.id, + userAvatar: userData?.avatar, + userName: userData?.name, + send: 1 + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + }, 500); + }); + } else { + this.stateManagementService.shareData = null; + } + } catch (error) { + console.log({ error }); + } + } + + getCommonData(): void { + this.httpRequestService.get(api.commonDropdown).then((res: any) => { + this.stateManagementService.common = res; + }); + } + +} diff --git a/src/app/components/avatar-percentage/avatar-percentage.component.html b/src/app/components/avatar-percentage/avatar-percentage.component.html new file mode 100644 index 0000000..2e6bf85 --- /dev/null +++ b/src/app/components/avatar-percentage/avatar-percentage.component.html @@ -0,0 +1,4 @@ +
+ +
diff --git a/src/app/components/avatar-percentage/avatar-percentage.component.scss b/src/app/components/avatar-percentage/avatar-percentage.component.scss new file mode 100644 index 0000000..eeed480 --- /dev/null +++ b/src/app/components/avatar-percentage/avatar-percentage.component.scss @@ -0,0 +1,20 @@ +.complete-progress { + border: 0.1rem solid #a3c5d3; + border-radius: var(--ion-border-radius-100); + padding: 2px; + background: conic-gradient(var(--ion-color) var(--progress), var(--ion-background-button) 0deg); + overflow: hidden; + display: inline-block; + + &.sant { + background: conic-gradient(var(--ion-color-sant) var(--progress), var(--ion-background-content-sant) 0deg); + } + + >img { + border-radius: var(--ion-border-radius-100); + padding: 1px; + background: var(--ion-color-white); + width: 100% !important; + height: 100% !important; + } +} \ No newline at end of file diff --git a/src/app/components/avatar-percentage/avatar-percentage.component.ts b/src/app/components/avatar-percentage/avatar-percentage.component.ts new file mode 100644 index 0000000..bb0594b --- /dev/null +++ b/src/app/components/avatar-percentage/avatar-percentage.component.ts @@ -0,0 +1,24 @@ +import { NgStyle } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; + +@Component({ + selector: 'app-avatar-percentage', + templateUrl: './avatar-percentage.component.html', + styleUrls: ['./avatar-percentage.component.scss'], + standalone: true, + imports: [NgStyle, SafeUrlPipe] +}) +export class AvatarPercentageComponent { + @Input() url: string; + @Input() percentage: number; + @Input() width = 40; + @Input() height = 40; + @Input() type: string; + @Output() evClick = new EventEmitter(); + + onClick() { + this.evClick.emit(true); + } + +} diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html new file mode 100644 index 0000000..dfd6028 --- /dev/null +++ b/src/app/components/footer/footer.component.html @@ -0,0 +1,29 @@ + + + + + + Home + + + + Sant + + + + Sangh + + + + Shravak + + + + Menu + + + + \ No newline at end of file diff --git a/src/app/components/footer/footer.component.scss b/src/app/components/footer/footer.component.scss new file mode 100644 index 0000000..9e17d78 --- /dev/null +++ b/src/app/components/footer/footer.component.scss @@ -0,0 +1,11 @@ +ion-footer { + height: 50px; + height: calc(env(safe-area-inset-bottom) + 60px); + + ion-tab-bar { + &.ios { + padding: 0; + padding-bottom: calc(env(safe-area-inset-bottom) + 10px); + } + } +} \ No newline at end of file diff --git a/src/app/components/footer/footer.component.ts b/src/app/components/footer/footer.component.ts new file mode 100644 index 0000000..6885634 --- /dev/null +++ b/src/app/components/footer/footer.component.ts @@ -0,0 +1,74 @@ +import { NgClass, NgIf } from '@angular/common'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { Roots } from '@enums/root.enum'; +import { GeneralData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'], + standalone: true, + imports: [IonicModule, NgClass, NgIf] +}) +export class FooterComponent implements OnInit, OnDestroy { + activeTab: string; + $subscription: Subscription; + data: GeneralData; + iconBasePath = '/assets/images/'; + + constructor( + private navCtrl: NavController, + private router: Router, + private stateManagementService: StateManagementService, + private change: ChangeDetectorRef + ) { } + + ngOnInit() { + if (this.router.url.startsWith('/page/shravak-feeds')) { + this.activeTab = 'feed'; + } else if (this.router.url.startsWith('/page/create-new-sant')) { + this.activeTab = 'sant'; + } else if (this.router.url.startsWith('/page/create-new-sangh')) { + this.activeTab = 'sangh'; + } else if (this.router.url.startsWith('/page/friend-request')) { + this.activeTab = 'friendRequest'; + } else if (this.router.url.startsWith('/page/menu')) { + this.activeTab = 'menu'; + } + + this.$subscription = this.stateManagementService.pushNotyObservable.subscribe(res => { + this.data = res; + this.change.detectChanges(); + }); + } + + redirect(type: string) { + this.activeTab = type; + if (type === 'feed') { + this.navCtrl.navigateRoot([Roots.page + '/' + Roots.shravakFeeds]); + } else if (type === 'sangh') { + this.stateManagementService.generalData.sangh_menu = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.navCtrl.navigateRoot([Roots.page + '/' + Roots.createNewSangh]); + } else if (type === 'sant') { + this.stateManagementService.generalData.sant_menu = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.navCtrl.navigateRoot([Roots.page + '/' + Roots.createNewSant]); + } else if (type === 'menu') { + this.navCtrl.navigateRoot([Roots.page + '/' + Roots.menu]); + } else if (type === 'friendRequest') { + this.stateManagementService.generalData.shravak_menu = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.navCtrl.navigateRoot([Roots.page + '/' + Roots.friendRequest]); + } + } + + ngOnDestroy() { + this.$subscription?.unsubscribe(); + } + +} diff --git a/src/app/components/image-modal/image-modal.component.html b/src/app/components/image-modal/image-modal.component.html new file mode 100644 index 0000000..429915b --- /dev/null +++ b/src/app/components/image-modal/image-modal.component.html @@ -0,0 +1,14 @@ + +
+ + +
+ +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/components/image-modal/image-modal.component.scss b/src/app/components/image-modal/image-modal.component.scss new file mode 100644 index 0000000..687d33d --- /dev/null +++ b/src/app/components/image-modal/image-modal.component.scss @@ -0,0 +1,34 @@ +.close-icon { + position: absolute; + right: 0; + top: env(safe-area-inset-top); + padding: 5px; + font-size: 30px; + background-image: url(/assets/images/close-with-shadow.svg); + background-repeat: no-repeat; + width: 35px; + height: 35px; + transform: scale(0.7); + z-index: 1; +} + +ion-content { + div { + swiper-container { + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + left: 50%; + width: 100%; + } + + swiper-slide { + div { + img { + width: 100%; + max-height: 100%; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/components/image-modal/image-modal.component.ts b/src/app/components/image-modal/image-modal.component.ts new file mode 100644 index 0000000..9e5bbf0 --- /dev/null +++ b/src/app/components/image-modal/image-modal.component.ts @@ -0,0 +1,34 @@ +import { NgIf } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, Component, Input } from '@angular/core'; +import { IonicModule, ModalController } from '@ionic/angular'; +import { Swiper } from 'swiper'; +import { register } from 'swiper/element/bundle'; + +register(); + +@Component({ + selector: 'app-image-modal', + templateUrl: './image-modal.component.html', + styleUrls: ['./image-modal.component.scss'], + standalone: true, + imports: [IonicModule, NgIf], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class ImageModalComponent { + @Input() imgUrl: string; + @Input() slider: Swiper; + + constructor( + private modalController: ModalController + ) { + } + + closeModal() { + this.modalController.dismiss().then(() => { + if (this.slider) { + this.slider.isLocked = false; + } + }); + } + +} diff --git a/src/app/components/ionic-selectable/ionic-selectable-add-item-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-add-item-template.directive.ts new file mode 100644 index 0000000..37cc27d --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-add-item-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableAddItemTemplate]', + standalone: true +}) +export class IonicSelectableAddItemTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-close-button-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-close-button-template.directive.ts new file mode 100644 index 0000000..db1ab25 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-close-button-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableCloseButtonTemplate]', + standalone: true +}) +export class IonicSelectableCloseButtonTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-footer-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-footer-template.directive.ts new file mode 100644 index 0000000..e75994f --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-footer-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableFooterTemplate]', + standalone: true +}) +export class IonicSelectableFooterTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-group-end-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-group-end-template.directive.ts new file mode 100644 index 0000000..67a6005 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-group-end-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableGroupEndTemplate]', + standalone: true +}) +export class IonicSelectableGroupEndTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-group-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-group-template.directive.ts new file mode 100644 index 0000000..26b7f54 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-group-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableGroupTemplate]', + standalone: true +}) +export class IonicSelectableGroupTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-header-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-header-template.directive.ts new file mode 100644 index 0000000..c10c962 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-header-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableHeaderTemplate]', + standalone: true +}) +export class IonicSelectableHeaderTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-icon-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-icon-template.directive.ts new file mode 100644 index 0000000..ba7e3b0 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-icon-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableIconTemplate]', + standalone: true +}) +export class IonicSelectableIconTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-item-end-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-item-end-template.directive.ts new file mode 100644 index 0000000..0e98a33 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-item-end-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableItemEndTemplate]', + standalone: true +}) +export class IonicSelectableItemEndTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-item-icon-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-item-icon-template.directive.ts new file mode 100644 index 0000000..1ff89c0 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-item-icon-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableItemIconTemplate]', + standalone: true +}) +export class IonicSelectableItemIconTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-item-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-item-template.directive.ts new file mode 100644 index 0000000..65ecd99 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-item-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableItemTemplate]', + standalone: true +}) +export class IonicSelectableItemTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-message-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-message-template.directive.ts new file mode 100644 index 0000000..b7a85cc --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-message-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableMessageTemplate]', + standalone: true +}) +export class IonicSelectableMessageTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-modal.component.html b/src/app/components/ionic-selectable/ionic-selectable-modal.component.html new file mode 100644 index 0000000..fa7b126 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-modal.component.html @@ -0,0 +1,177 @@ + + + + + + + + {{selectComponent.closeButtonText}} + + + + + + + + + {{selectComponent.label}} + + + +
+
+ + + +
+
+
+
+
+
+ +
+
+ +
+ + + + + + + + + {{group.text}} + +
+
+
+
+
+ + + + + + + {{selectComponent._formatItem(item)}} + +
+
+
+
+ + + + + + + + + + +
+
+
+ +
+ + +
+ {{selectComponent.searchFailText}} +
+
+ + + +
+ + + + + + + {{selectComponent._formatItem(item)}} + +
+
+
+
+ + + + + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + {{selectComponent.clearButtonText}} + + + + + {{selectComponent.addButtonText}} + + + + + {{selectComponent.confirmButtonText}} + + + + +
+
+
diff --git a/src/app/components/ionic-selectable/ionic-selectable-modal.component.ts b/src/app/components/ionic-selectable/ionic-selectable-modal.component.ts new file mode 100644 index 0000000..a75710b --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-modal.component.ts @@ -0,0 +1,87 @@ +/* eslint-disable */ +import { NgClass, NgFor, NgIf, NgStyle, NgTemplateOutlet } from '@angular/common'; +import { AfterViewInit, Component, ElementRef, HostBinding, HostListener, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { IonContent, IonInfiniteScroll, IonSearchbar, IonicModule, NavParams } from '@ionic/angular'; +import { IonicSelectableComponent } from './ionic-selectable.component'; + +@Component({ + selector: 'ionic-selectable-modal', + templateUrl: './ionic-selectable-modal.component.html', + standalone: true, + imports: [IonicModule, NgIf, NgTemplateOutlet, FormsModule, NgFor, NgClass, NgStyle] +}) +export class IonicSelectableModalComponent implements AfterViewInit { + @ViewChild(IonContent) + _content: IonContent; + _header: HTMLElement; + selectComponent: IonicSelectableComponent; + @ViewChild('searchbarComponent') + _searchbarComponent: IonSearchbar; + @ViewChild(IonInfiniteScroll) + _infiniteScroll: IonInfiniteScroll; + @HostBinding('class.ionic-selectable-modal') + _cssClass = true; + @HostBinding('class.ionic-selectable-modal-can-clear') + get _canClearCssClass(): boolean { + return this.selectComponent.canClear; + } + @HostBinding('class.ionic-selectable-modal-is-multiple') + get _isMultipleCssClass(): boolean { + return this.selectComponent.isMultiple; + } + @HostBinding('class.ionic-selectable-modal-is-searching') + get _isSearchingCssClass(): boolean { + return this.selectComponent._isSearching; + } + @HostBinding('class.ionic-selectable-modal-ios') + get _isIos(): boolean { + return this.selectComponent._isIos; + } + @HostBinding('class.ionic-selectable-modal-md') + _isMD(): boolean { + return this.selectComponent._isMD; + } + @HostBinding('class.ionic-selectable-modal-is-add-item-template-visible') + get _isAddItemTemplateVisibleCssClass(): boolean { + return this.selectComponent._isAddItemTemplateVisible; + } + @HostListener('window:resize') + onResize() { + // ion-footer inside the template might change its height when + // device orientation changes. + this.selectComponent._positionAddItemTemplate(); + } + + constructor( + private navParams: NavParams, + public _element: ElementRef, + ) { + this.selectComponent = this.navParams.get('selectComponent'); + this.selectComponent._modalComponent = this; + this.selectComponent._selectedItems = []; + + if (!this.selectComponent._isNullOrWhiteSpace(this.selectComponent.value)) { + if (this.selectComponent.isMultiple) { + this.selectComponent.value.forEach(item => { + this.selectComponent._selectedItems.push(item); + }); + } else { + this.selectComponent._selectedItems.push(this.selectComponent.value); + } + } + + this.selectComponent._setItemsToConfirm(this.selectComponent._selectedItems); + } + + ngAfterViewInit() { + this._header = this._element.nativeElement.querySelector('ion-header'); + + if (this._searchbarComponent && this.selectComponent.shouldFocusSearchbar) { + // Focus after a delay because focus doesn't work without it. + setTimeout(() => { + this._searchbarComponent.setFocus(); + }, 1000); + } + } +} diff --git a/src/app/components/ionic-selectable/ionic-selectable-placeholder-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-placeholder-template.directive.ts new file mode 100644 index 0000000..b93a8eb --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-placeholder-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectablePlaceholderTemplate]', + standalone: true +}) +export class IonicSelectablePlaceholderTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-search-fail-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-search-fail-template.directive.ts new file mode 100644 index 0000000..2245687 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-search-fail-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableSearchFailTemplate]', + standalone: true +}) +export class IonicSelectableSearchFailTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-title-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-title-template.directive.ts new file mode 100644 index 0000000..366ab7c --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-title-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableTitleTemplate]', + standalone: true +}) +export class IonicSelectableTitleTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable-value-template.directive.ts b/src/app/components/ionic-selectable/ionic-selectable-value-template.directive.ts new file mode 100644 index 0000000..604acc6 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable-value-template.directive.ts @@ -0,0 +1,8 @@ +/* eslint-disable @angular-eslint/directive-selector */ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ionicSelectableValueTemplate]', + standalone: true +}) +export class IonicSelectableValueTemplateDirective { } diff --git a/src/app/components/ionic-selectable/ionic-selectable.component.html b/src/app/components/ionic-selectable/ionic-selectable.component.html new file mode 100644 index 0000000..a9539fb --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable.component.html @@ -0,0 +1,41 @@ +
+
+
+
+
+
+
+
+ +
+ {{_formatValueItem(valueItem)}} +
+
+
+
+
+
+
+ {{placeholder}} +
+ +   +
+
+
+
+
+
+
+ + +
diff --git a/src/app/components/ionic-selectable/ionic-selectable.component.scss b/src/app/components/ionic-selectable/ionic-selectable.component.scss new file mode 100644 index 0000000..765a358 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable.component.scss @@ -0,0 +1,259 @@ +$icon-color: #999; +$placeholder-color: #999; +$padding: 16px; +$item-padding-end: 16px; +$item-padding-end-ios: 8px; + +.item { + &-ionic-selectable { + + // Vertical allignment for label. + .item-inner .input-wrapper { + align-items: normal; + } + + ion-label { + flex: 1; + max-width: initial; + } + } +} + +.ionic-selectable { + display: block; + max-width: 45%; + + &-inner { + display: flex; + /* + When there's no ion-label we need to keep + value and icon alligned to the right ourselves. + */ + flex-wrap: wrap; + flex-direction: row; + justify-content: flex-end; + } + + &-has-placeholder { + .ionic-selectable-value-item { + color: var(--placeholder-color, $placeholder-color); + } + } + + &-value { + flex: 1; + padding-top: 13px; + padding-bottom: 13px; + overflow: hidden; + + &-item { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + + &:not(:last-child) { + margin-bottom: 5px; + } + } + } + + &-icon { + position: relative; + width: 20px; + + &-inner { + position: absolute; + top: 20px; + left: 5px; + border-top: 5px solid; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + pointer-events: none; + color: var(--icon-color, $icon-color); + } + + &-template { + align-self: center; + margin-left: 5px; + } + } + + &-ios { + .ionic-selectable-value { + padding-top: 11px; + padding-bottom: 11px; + } + + .ionic-selectable-icon { + &-inner { + top: 19px; + } + } + } + + &-spinner { + position: fixed; + bottom: 0; + top: 0; + left: 0; + right: 0; + z-index: 1; + + &-background { + top: 0; + bottom: 0; + left: 0; + right: 0; + position: absolute; + background-color: #000000; + opacity: 0.05; + } + + ion-spinner { + position: absolute; + top: 50%; + left: 50%; + z-index: 10; + margin-top: -14px; + margin-left: -14px; + } + } + + &-cover { + left: 0; + top: 0; + margin: 0; + position: absolute; + width: 100%; + height: 100%; + border: 0; + background: 0 0; + cursor: pointer; + appearance: none; + outline: 0; + } + + &-add-item-template { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background-color: #ffffff; + + &-inner { + overflow-y: auto; + + >ion-footer { + bottom: 0; + position: absolute; + } + } + } + + &-label-stacked, + &-label-floating { + align-self: stretch; + max-width: 100%; + padding-left: 0; + padding-top: 8px; + padding-bottom: 8px; + + .ionic-selectable-value { + padding-top: 0; + padding-bottom: 0; + min-height: 19px; + } + + .ionic-selectable-icon-inner { + top: 7px; + } + + &.ionic-selectable-ios { + .ionic-selectable-value { + padding-top: 0; + padding-bottom: 0; + min-height: 20px; + } + + .ionic-selectable-icon-inner { + top: 8px; + } + } + } + + &-label-default, + &-label-fixed { + .ionic-selectable-value { + padding-left: var(--padding-start, $padding); + } + } + + &-label-fixed:not(&-has-value) { + .ionic-selectable-value { + padding-left: calc(var(--padding-start, $padding) + 11px); + } + } +} + +.ionic-selectable-modal { + .ionic-selectable-group { + ion-item-divider { + padding-right: $item-padding-end; + } + } + + .ionic-selectable-item-button { + margin-left: 8px; + margin-right: 8px; + } + + &-ios { + .ionic-selectable-message { + padding: 8px; + } + + .ionic-selectable-group { + ion-item-divider { + padding-right: $item-padding-end-ios; + } + } + } + + &-md { + .ionic-selectable-message { + padding: 8px 12px; + } + } + + &.ionic-selectable-modal-can-clear.ionic-selectable-modal-is-multiple { + .footer .col:first-child { + padding-right: calc($padding / 2); + } + + .footer .col:last-child { + padding-left: calc($padding / 2); + } + } + + &.ionic-selectable-modal-is-searching { + .scroll-content { + overflow-y: hidden; + } + } + + &.ionic-selectable-modal-is-add-item-template-visible { + + // Hide scroll from list content. + // Use immediate child selector as we don't want to apply the rule + // to content inside add item template defined by user. + >.content>.scroll-content { + overflow-y: hidden; + } + } + + ion-header { + ion-toolbar:first-of-type { + padding-top: var(--ion-safe-area-top, 0); + } + } +} \ No newline at end of file diff --git a/src/app/components/ionic-selectable/ionic-selectable.component.ts b/src/app/components/ionic-selectable/ionic-selectable.component.ts new file mode 100644 index 0000000..c67fd85 --- /dev/null +++ b/src/app/components/ionic-selectable/ionic-selectable.component.ts @@ -0,0 +1,1837 @@ +/* eslint-disable */ +import { NgFor, NgIf, NgTemplateOutlet } from '@angular/common'; +import { Component, ContentChild, DoCheck, ElementRef, EventEmitter, HostBinding, Input, IterableDiffer, IterableDiffers, OnInit, Optional, Output, Renderer2, TemplateRef, ViewEncapsulation, forwardRef } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { IonItem, ModalController, Platform } from '@ionic/angular'; +import { AnimationBuilder, ModalOptions } from '@ionic/core'; +import { Subscription } from 'rxjs'; +import { IonicSelectableAddItemTemplateDirective } from './ionic-selectable-add-item-template.directive'; +import { IonicSelectableCloseButtonTemplateDirective } from './ionic-selectable-close-button-template.directive'; +import { IonicSelectableFooterTemplateDirective } from './ionic-selectable-footer-template.directive'; +import { IonicSelectableGroupEndTemplateDirective } from './ionic-selectable-group-end-template.directive'; +import { IonicSelectableGroupTemplateDirective } from './ionic-selectable-group-template.directive'; +import { IonicSelectableHeaderTemplateDirective } from './ionic-selectable-header-template.directive'; +import { IonicSelectableIconTemplateDirective } from './ionic-selectable-icon-template.directive'; +import { IonicSelectableItemEndTemplateDirective } from './ionic-selectable-item-end-template.directive'; +import { IonicSelectableItemIconTemplateDirective } from './ionic-selectable-item-icon-template.directive'; +import { IonicSelectableItemTemplateDirective } from './ionic-selectable-item-template.directive'; +import { IonicSelectableMessageTemplateDirective } from './ionic-selectable-message-template.directive'; +import { IonicSelectableModalComponent } from './ionic-selectable-modal.component'; +import { IonicSelectablePlaceholderTemplateDirective } from './ionic-selectable-placeholder-template.directive'; +import { IonicSelectableSearchFailTemplateDirective } from './ionic-selectable-search-fail-template.directive'; +import { IonicSelectableTitleTemplateDirective } from './ionic-selectable-title-template.directive'; +import { IonicSelectableValueTemplateDirective } from './ionic-selectable-value-template.directive'; + +@Component({ + selector: 'ionic-selectable', + templateUrl: './ionic-selectable.component.html', + styleUrls: ['./ionic-selectable.component.scss'], + encapsulation: ViewEncapsulation.None, + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => IonicSelectableComponent), + multi: true + }], + standalone: true, + imports: [NgIf, NgTemplateOutlet, NgFor] +}) +export class IonicSelectableComponent implements ControlValueAccessor, OnInit, DoCheck { + @HostBinding('class.ionic-selectable') + _cssClass = true; + @HostBinding('class.ionic-selectable-ios') + _isIos: boolean; + @HostBinding('class.ionic-selectable-md') + _isMD: boolean; + @HostBinding('class.ionic-selectable-is-multiple') + get _isMultipleCssClass(): boolean { + return this.isMultiple; + } + @HostBinding('class.ionic-selectable-has-value') + get _hasValueCssClass(): boolean { + return this.hasValue(); + } + @HostBinding('class.ionic-selectable-has-placeholder') + get _hasPlaceholderCssClass(): boolean { + return this._hasPlaceholder; + } + @HostBinding('class.ionic-selectable-has-label') + get _hasIonLabelCssClass(): boolean { + return this._hasIonLabel; + } + @HostBinding('class.ionic-selectable-label-default') + get _hasDefaultIonLabelCssClass(): boolean { + return this._ionLabelPosition === 'default'; + } + @HostBinding('class.ionic-selectable-label-fixed') + get _hasFixedIonLabelCssClass(): boolean { + return this._ionLabelPosition === 'fixed'; + } + @HostBinding('class.ionic-selectable-label-stacked') + get _hasStackedIonLabelCssClass(): boolean { + return this._ionLabelPosition === 'stacked'; + } + @HostBinding('class.ionic-selectable-label-floating') + get _hasFloatingIonLabelCssClass(): boolean { + return this._ionLabelPosition === 'floating'; + } + private _isOnSearchEnabled = true; + private _isEnabled = true; + private _shouldBackdropClose = true; + private _isOpened = false; + private _value: any = null; + private _modal: HTMLIonModalElement; + private _itemsDiffer: IterableDiffer; + private _hasObjects: boolean; + private _canClear = false; + private _hasConfirmButton = false; + private _isMultiple = false; + private _canAddItem = false; + private _addItemObservable: Subscription; + private _deleteItemObservable: Subscription; + private onItemsChange: EventEmitter = new EventEmitter(); + private _ionItemElement: any; + private _ionLabelElement: any; + private _hasIonLabel = false; + private _ionLabelPosition: 'fixed' | 'stacked' | 'floating' | 'default' | null = null; + private _label: string = null; + private get _hasInfiniteScroll(): boolean { + return this.isEnabled && this._modalComponent && + this._modalComponent._infiniteScroll ? true : false; + } + get _shouldStoreItemValue(): boolean { + return this.shouldStoreItemValue && this._hasObjects; + } + _valueItems: any[] = []; + _searchText = ''; + _hasSearchText = false; + _groups: any[] = []; + _itemsToConfirm: any[] = []; + _selectedItems: any[] = []; + _modalComponent: IonicSelectableModalComponent; + _filteredGroups: any[] = []; + _hasGroups: boolean; + _isSearching: boolean; + _hasPlaceholder: boolean; + _isAddItemTemplateVisible = false; + _isFooterVisible = true; + _itemToAdd: any = null; + _footerButtonsCount = 0; + _hasFilteredItems = false; + + /** + * Text of [Ionic Label](https://ionicframework.com/docs/api/label). + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#label). + * + * @readonly + * @default null + * @memberof IonicSelectableComponent + */ + get label(): string { + return this._label; + } + + /** + * Text that the user has typed in Searchbar. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#searchtext). + * + * @readonly + * @default '' + * @memberof IonicSelectableComponent + */ + get searchText(): string { + return this._searchText; + } + set searchText(searchText: string) { + this._searchText = searchText; + this._setHasSearchText(); + } + + /** + * Determines whether search is running. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#issearching). + * + * @default false + * @readonly + * @memberof IonicSelectableComponent + */ + get isSearching(): boolean { + return this._isSearching; + } + + /** + * Determines whether user has typed anything in Searchbar. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hassearchtext). + * + * @default false + * @readonly + * @memberof IonicSelectableComponent + */ + get hasSearchText(): boolean { + return this._hasSearchText; + } + + get value(): any { + return this._value; + } + set value(value: any) { + this._value = value; + + // Set value items. + this._valueItems.splice(0, this._valueItems.length); + + if (this.isMultiple) { + if (value && value.length) { + Array.prototype.push.apply(this._valueItems, value); + } + } else { + if (!this._isNullOrWhiteSpace(value)) { + this._valueItems.push(value); + } + } + + this._setIonItemHasValue(); + this._setHasPlaceholder(); + } + + /** + * A list of items. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#items). + * + * @default [] + * @memberof IonicSelectableComponent + */ + @Input() + items: any[] = []; + @Output() + itemsChange: EventEmitter = new EventEmitter(); + + /** + * Determines whether the component is enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#isenabled). + * + * @default true + * @memberof IonicSelectableComponent + */ + @HostBinding('class.ionic-selectable-is-enabled') + @Input('isEnabled') + get isEnabled(): boolean { + return this._isEnabled; + } + set isEnabled(isEnabled: boolean) { + this._isEnabled = !!isEnabled; + this.enableIonItem(this._isEnabled); + } + + /** + * Determines whether Modal should be closed when backdrop is clicked. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#shouldbackdropclose). + * + * @default true + * @memberof IonicSelectableComponent + */ + @Input('shouldBackdropClose') + get shouldBackdropClose(): boolean { + return this._shouldBackdropClose; + } + set shouldBackdropClose(shouldBackdropClose: boolean) { + this._shouldBackdropClose = !!shouldBackdropClose; + } + + /** + * Modal CSS class. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#modalcssclass). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + modalCssClass: string = null; + + /** + * Modal enter animation. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#modalenteranimation). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + modalEnterAnimation: AnimationBuilder = null; + + /** + * Modal leave animation. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#modalleaveanimation). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + modalLeaveAnimation: AnimationBuilder = null; + + /** + * Determines whether Modal is opened. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#isopened). + * + * @default false + * @readonly + * @memberof IonicSelectableComponent + */ + get isOpened(): boolean { + return this._isOpened; + } + + /** + * Determines whether Confirm button is enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#isconfirmbuttonenabled). + * + * @default true + * @memberof IonicSelectableComponent + */ + @Input() + isConfirmButtonEnabled = true; + + /** + * Determines whether Confirm button is visible for single selection. + * By default Confirm button is visible only for multiple selection. + * **Note**: It is always true for multiple selection and cannot be changed. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hasconfirmbutton). + * + * @default true + * @memberof IonicSelectableComponent + */ + @Input('hasConfirmButton') + get hasConfirmButton(): boolean { + return this._hasConfirmButton; + } + set hasConfirmButton(hasConfirmButton: boolean) { + this._hasConfirmButton = !!hasConfirmButton; + this._countFooterButtons(); + } + + /** + * Item property to use as a unique identifier, e.g, `'id'`. + * **Note**: `items` should be an object array. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#itemvaluefield). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + itemValueField: string = null; + + /** + * Item property to display, e.g, `'name'`. + * **Note**: `items` should be an object array. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#itemtextfield). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + itemTextField: string = null; + + /** + * + * Group property to use as a unique identifier to group items, e.g. `'country.id'`. + * **Note**: `items` should be an object array. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#groupvaluefield). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + groupValueField: string = null; + + /** + * Group property to display, e.g. `'country.name'`. + * **Note**: `items` should be an object array. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#grouptextfield). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + groupTextField: string = null; + + /** + * Determines whether to show Searchbar. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#cansearch). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + canSearch = false; + + /** + * Determines whether `onSearch` event is enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#isonsearchenabled). + * + * @default true + * @memberof IonicSelectableComponent + */ + @Input('isOnSearchEnabled') + get isOnSearchEnabled(): boolean { + return this._isOnSearchEnabled; + } + set isOnSearchEnabled(isOnSearchEnabled: boolean) { + this._isOnSearchEnabled = !!isOnSearchEnabled; + } + + /** + * Determines whether to show Clear button. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#canclear). + * + * @default false + * @memberof IonicSelectableComponent + */ + @HostBinding('class.ionic-selectable-can-clear') + @Input('canClear') + get canClear(): boolean { + return this._canClear; + } + set canClear(canClear: boolean) { + this._canClear = !!canClear; + this._countFooterButtons(); + } + + /** + * Determines whether Ionic [InfiniteScroll](https://ionicframework.com/docs/api/components/infinite-scroll/InfiniteScroll/) is enabled. + * **Note**: Infinite scroll cannot be used together with virtual scroll. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hasinfinitescroll). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + hasInfiniteScroll = false; + + /** + * Determines whether Ionic [VirtualScroll](https://ionicframework.com/docs/api/components/virtual-scroll/VirtualScroll/) is enabled. + * **Note**: Virtual scroll cannot be used together with infinite scroll. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hasvirtualscroll). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + hasVirtualScroll = false; + + /** + * See Ionic VirtualScroll [approxItemHeight](https://ionicframework.com/docs/api/components/virtual-scroll/VirtualScroll/). + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#virtualscrollapproxitemheight). + * + * @default '40px' + * @memberof IonicSelectableComponent + */ + @Input() + virtualScrollApproxItemHeight = '40px'; + + /** + * A placeholder for Searchbar. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#searchplaceholder). + * + * @default 'Search' + * @memberof IonicSelectableComponent + */ + @Input() + searchPlaceholder = 'Search'; + + /** + * A placeholder. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#placeholder). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + placeholder: string = null; + + /** + * Determines whether multiple items can be selected. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#ismultiple). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input('isMultiple') + get isMultiple(): boolean { + return this._isMultiple; + } + set isMultiple(isMultiple: boolean) { + this._isMultiple = !!isMultiple; + this._countFooterButtons(); + } + + /** + * Text to display when no items have been found during search. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#searchfailtext). + * + * @default 'No items found.' + * @memberof IonicSelectableComponent + */ + @Input() + searchFailText = 'No items found.'; + + /** + * Clear button text. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#clearbuttontext). + * + * @default 'Clear' + * @memberof IonicSelectableComponent + */ + @Input() + clearButtonText = 'Clear'; + + /** + * Add button text. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#addbuttontext). + * + * @default 'Add' + * @memberof IonicSelectableComponent + */ + @Input() + addButtonText = 'Add'; + + /** + * Confirm button text. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#confirmbuttontext). + * + * @default 'OK' + * @memberof IonicSelectableComponent + */ + @Input() + confirmButtonText = 'OK'; + + /** + * Close button text. + * The field is only applicable to **iOS** platform, on **Android** only Cross icon is displayed. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#closebuttontext). + * + * @default 'Cancel' + * @memberof IonicSelectableComponent + */ + @Input() + closeButtonText = 'Cancel'; + + /** + * Determines whether Searchbar should receive focus when Modal is opened. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#shouldfocussearchbar). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + shouldFocusSearchbar = false; + + /** + * Header color. [Ionic colors](https://ionicframework.com/docs/theming/advanced#colors) are supported. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#headercolor). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + headerColor: string = null; + + /** + * Group color. [Ionic colors](https://ionicframework.com/docs/theming/advanced#colors) are supported. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#groupcolor). + * + * @default null + * @memberof IonicSelectableComponent + */ + @Input() + groupColor: string = null; + + /** + * Close button slot. [Ionic slots](https://ionicframework.com/docs/api/buttons) are supported. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#closebuttonslot). + * + * @default 'start' + * @memberof IonicSelectableComponent + */ + @Input() + closeButtonSlot = 'start'; + + /** + * Item icon slot. [Ionic slots](https://ionicframework.com/docs/api/item) are supported. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#itemiconslot). + * + * @default 'start' + * @memberof IonicSelectableComponent + */ + @Input() + itemIconSlot = 'start'; + + /** + * Fires when item/s has been selected and Modal closed. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onchange). + * + * @memberof IonicSelectableComponent + */ + @Output() + onChange: EventEmitter<{ component: IonicSelectableComponent; value: any }> = new EventEmitter(); + + /** + * Fires when the user is typing in Searchbar. + * **Note**: `canSearch` and `isOnSearchEnabled` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onsearch). + * + * @memberof IonicSelectableComponent + */ + @Output() + onSearch: EventEmitter<{ component: IonicSelectableComponent; text: string }> = new EventEmitter(); + + /** + * Fires when no items have been found. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onsearchfail). + * + * @memberof IonicSelectableComponent + */ + @Output() + onSearchFail: EventEmitter<{ component: IonicSelectableComponent; text: string }> = new EventEmitter(); + + /** + * Fires when some items have been found. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onsearchsuccess). + * + * @memberof IonicSelectableComponent + */ + @Output() + onSearchSuccess: EventEmitter<{ component: IonicSelectableComponent; text: string }> = new EventEmitter(); + + /** + * Fires when the user has scrolled to the end of the list. + * **Note**: `hasInfiniteScroll` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#oninfinitescroll). + * + * @memberof IonicSelectableComponent + */ + @Output() + onInfiniteScroll: EventEmitter<{ component: IonicSelectableComponent; text: string }> = new EventEmitter(); + + /** + * Fires when Modal has been opened. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onopen). + * + * @memberof IonicSelectableComponent + */ + @Output() + onOpen: EventEmitter<{ component: IonicSelectableComponent }> = new EventEmitter(); + + /** + * Fires when Modal has been closed. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onclose). + * + * @memberof IonicSelectableComponent + */ + @Output() + onClose: EventEmitter<{ component: IonicSelectableComponent }> = new EventEmitter(); + + /** + * Fires when an item has been selected or unselected. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onselect). + * + * @memberof IonicSelectableComponent + */ + @Output() + onSelect: EventEmitter<{ component: IonicSelectableComponent; item: any; isSelected: boolean }> = new EventEmitter(); + + /** + * Fires when Clear button has been clicked. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onclear). + * + * @memberof IonicSelectableComponent + */ + @Output() + onClear: EventEmitter<{ component: IonicSelectableComponent; items: any[] }> = new EventEmitter(); + + /** + * A list of items that are selected and awaiting confirmation by user, when he has clicked Confirm button. + * After the user has clicked Confirm button items to confirm are cleared. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#itemstoconfirm). + * + * @default [] + * @readonly + * @memberof IonicSelectableComponent + */ + get itemsToConfirm(): any[] { + return this._itemsToConfirm; + } + + /** + * How long, in milliseconds, to wait to filter items or to trigger `onSearch` event after each keystroke. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#searchdebounce). + * + * @default 250 + * @memberof IonicSelectableComponent + */ + @Input() + searchDebounce = 250; + + /** + * A list of items to disable. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#disableditems). + * + * @default [] + * @memberof IonicSelectableComponent + */ + @Input() + disabledItems: any[] = []; + + /** + * Determines whether item value only should be stored in `ngModel`, not the entire item. + * **Note**: Item value is defined by `itemValueField`. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#shouldstoreitemvalue). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + shouldStoreItemValue = false; + + /** + * Determines whether to allow editing items. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#cansaveitem). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + canSaveItem = false; + + /** + * Determines whether to allow deleting items. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#candeleteitem). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input() + canDeleteItem = false; + + /** + * Determines whether to allow adding items. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#canadditem). + * + * @default false + * @memberof IonicSelectableComponent + */ + @Input('canAddItem') + get canAddItem(): boolean { + return this._canAddItem; + } + set canAddItem(canAddItem: boolean) { + this._canAddItem = !!canAddItem; + this._countFooterButtons(); + } + + /** + * Fires when Edit item button has been clicked. + * When the button has been clicked `ionicSelectableAddItemTemplate` will be shown. Use the template to create a form to edit item. + * **Note**: `canSaveItem` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onsaveitem). + * + * @memberof IonicSelectableComponent + */ + @Output() + onSaveItem: EventEmitter<{ component: IonicSelectableComponent; item: any }> = new EventEmitter(); + + /** + * Fires when Delete item button has been clicked. + * **Note**: `canDeleteItem` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#ondeleteitem). + * + * @memberof IonicSelectableComponent + */ + @Output() + onDeleteItem: EventEmitter<{ component: IonicSelectableComponent; item: any }> = new EventEmitter(); + + /** + * Fires when Add item button has been clicked. + * When the button has been clicked `ionicSelectableAddItemTemplate` will be shown. Use the template to create a form to add item. + * **Note**: `canAddItem` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#onadditem). + * + * @memberof IonicSelectableComponent + */ + @Output() + onAddItem: EventEmitter<{ component: IonicSelectableComponent }> = new EventEmitter(); + + @ContentChild(IonicSelectableValueTemplateDirective, { read: TemplateRef }) + valueTemplate: TemplateRef; + @ContentChild(IonicSelectableItemTemplateDirective, { read: TemplateRef }) + itemTemplate: TemplateRef; + @ContentChild(IonicSelectableItemEndTemplateDirective, { read: TemplateRef }) + itemEndTemplate: TemplateRef; + @ContentChild(IonicSelectableTitleTemplateDirective, { read: TemplateRef }) + titleTemplate: TemplateRef; + @ContentChild(IonicSelectablePlaceholderTemplateDirective, { read: TemplateRef }) + placeholderTemplate: TemplateRef; + @ContentChild(IonicSelectableMessageTemplateDirective, { read: TemplateRef }) + messageTemplate: TemplateRef; + @ContentChild(IonicSelectableGroupTemplateDirective, { read: TemplateRef }) + groupTemplate: TemplateRef; + @ContentChild(IonicSelectableGroupEndTemplateDirective, { read: TemplateRef }) + groupEndTemplate: TemplateRef; + @ContentChild(IonicSelectableCloseButtonTemplateDirective, { read: TemplateRef }) + closeButtonTemplate: TemplateRef; + @ContentChild(IonicSelectableSearchFailTemplateDirective, { read: TemplateRef }) + searchFailTemplate: TemplateRef; + @ContentChild(IonicSelectableAddItemTemplateDirective, { read: TemplateRef }) + addItemTemplate: TemplateRef; + @ContentChild(IonicSelectableFooterTemplateDirective, { read: TemplateRef }) + footerTemplate: TemplateRef; + _addItemTemplateFooterHeight: string; + @ContentChild(IonicSelectableHeaderTemplateDirective, { read: TemplateRef }) + headerTemplate: TemplateRef; + @ContentChild(IonicSelectableItemIconTemplateDirective, { read: TemplateRef }) + itemIconTemplate: TemplateRef; + @ContentChild(IonicSelectableIconTemplateDirective, { read: TemplateRef }) + iconTemplate: TemplateRef; + + /** + * See Ionic VirtualScroll [headerFn](https://ionicframework.com/docs/api/components/virtual-scroll/VirtualScroll/). + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#virtualscrollheaderfn). + * + * @memberof IonicSelectableComponent + */ + @Input() + virtualScrollHeaderFn = () => null; + + constructor( + private _modalController: ModalController, + private _platform: Platform, + @Optional() private ionItem: IonItem, + private _iterableDiffers: IterableDiffers, + private _element: ElementRef, + private _renderer: Renderer2 + ) { + if (!this.items || !this.items.length) { + this.items = []; + } + + this._itemsDiffer = this._iterableDiffers.find(this.items).create(); + } + + + enableIonItem(isEnabled: boolean) { + if (!this.ionItem) { + return; + } + + this.ionItem.disabled = !isEnabled; + } + + _isNullOrWhiteSpace(value: any): boolean { + if (value === null || value === undefined) { + return true; + } + + // Convert value to string in case if it's not. + return value.toString().replace(/\s/g, '').length < 1; + } + + _setHasSearchText() { + this._hasSearchText = !this._isNullOrWhiteSpace(this._searchText); + } + + _hasOnSearch(): boolean { + return this.isOnSearchEnabled && this.onSearch.observers.length > 0; + } + + _hasOnSaveItem(): boolean { + return this.canSaveItem && this.onSaveItem.observers.length > 0; + } + + _hasOnAddItem(): boolean { + return this.canAddItem && this.onAddItem.observers.length > 0; + } + + _hasOnDeleteItem(): boolean { + return this.canDeleteItem && this.onDeleteItem.observers.length > 0; + } + + _emitValueChange() { + this.propagateOnChange(this.value); + + this.onChange.emit({ + component: this, + value: this.value + }); + } + + _emitSearch() { + if (!this.canSearch) { + return; + } + + this.onSearch.emit({ + component: this, + text: this._searchText + }); + } + + _emitOnSelect(item: any, isSelected: boolean) { + this.onSelect.emit({ + component: this, + item, + isSelected + }); + } + + _emitOnClear(items: any[]) { + this.onClear.emit({ + component: this, + items + }); + } + + _emitOnSearchSuccessOrFail(isSuccess: boolean) { + const eventData = { + component: this, + text: this._searchText + }; + + if (isSuccess) { + this.onSearchSuccess.emit(eventData); + } else { + this.onSearchFail.emit(eventData); + } + } + + _formatItem(item: any): string { + if (this._isNullOrWhiteSpace(item)) { + return null; + } + + return this.itemTextField ? item[this.itemTextField] : item.toString(); + } + + _formatValueItem(item: any): string { + if (this._shouldStoreItemValue) { + // Get item text from the list as we store it's value only. + const selectedItem = this.items.find(_item => _item[this.itemValueField] === item); + + return this._formatItem(selectedItem); + } else { + return this._formatItem(item); + } + } + + _getItemValue(item: any): any { + if (!this._hasObjects) { + return item; + } + + return item[this.itemValueField]; + } + + _getStoredItemValue(item: any): any { + if (!this._hasObjects) { + return item; + } + + return this._shouldStoreItemValue ? item : item[this.itemValueField]; + } + + _onSearchbarClear() { + // Ionic Searchbar doesn't clear bind with ngModel value. + // Do it ourselves. + this._searchText = ''; + this._filterItems(); + } + + _filterItems() { + this._setHasSearchText(); + + if (this._hasOnSearch()) { + // Delegate filtering to the event. + this._emitSearch(); + } else { + // Default filtering. + let groups = []; + + if (!this._searchText || !this._searchText.trim()) { + groups = this._groups; + } else { + const filterText = this._searchText.trim().toLowerCase(); + + this._groups.forEach(group => { + const items = group.items.filter(item => { + const itemText = (this.itemTextField ? + item[this.itemTextField] : item).toString().toLowerCase(); + return itemText.indexOf(filterText) !== -1; + }); + + if (items.length) { + groups.push({ + value: group.value, + text: group.text, + items + }); + } + }); + + // No items found. + if (!groups.length) { + groups.push({ + items: [] + }); + } + } + + this._filteredGroups = groups; + this._hasFilteredItems = !this._areGroupsEmpty(groups); + this._emitOnSearchSuccessOrFail(this._hasFilteredItems); + } + } + + _isItemDisabled(item: any): boolean { + if (!this.disabledItems) { + return; + } + + return this.disabledItems.some(_item => this._getItemValue(_item) === this._getItemValue(item)); + } + + _isItemSelected(item: any) { + return this._selectedItems.find(selectedItem => this._getItemValue(item) === this._getStoredItemValue(selectedItem)) !== undefined; + } + + _addSelectedItem(item: any) { + if (this._shouldStoreItemValue) { + this._selectedItems.push(this._getItemValue(item)); + } else { + this._selectedItems.push(item); + } + } + + _deleteSelectedItem(item: any) { + let itemToDeleteIndex; + + this._selectedItems.forEach((selectedItem, itemIndex) => { + if ( + this._getItemValue(item) === + this._getStoredItemValue(selectedItem) + ) { + itemToDeleteIndex = itemIndex; + } + }); + + this._selectedItems.splice(itemToDeleteIndex, 1); + } + + _click() { + if (!this.isEnabled) { + return; + } + + this._label = this._getLabelText(); + this.open().then(() => { + this.onOpen.emit({ + component: this + }); + }); + } + + _saveItem(event: Event, item: any) { + event.stopPropagation(); + this._itemToAdd = item; + + if (this._hasOnSaveItem()) { + this.onSaveItem.emit({ + component: this, + item: this._itemToAdd + }); + } else { + this.showAddItemTemplate(); + } + } + + _deleteItemClick(event: Event, item: any) { + event.stopPropagation(); + this._itemToAdd = item; + + if (this._hasOnDeleteItem()) { + // Delegate logic to event. + this.onDeleteItem.emit({ + component: this, + item: this._itemToAdd + }); + } else { + this.deleteItem(this._itemToAdd); + } + } + + _addItemClick() { + if (this._hasOnAddItem()) { + this.onAddItem.emit({ + component: this + }); + } else { + this.showAddItemTemplate(); + } + } + + _positionAddItemTemplate() { + // Wait for the template to render. + setTimeout(() => { + const footer = this._modalComponent._element.nativeElement + .querySelector('.ionic-selectable-add-item-template ion-footer'); + + this._addItemTemplateFooterHeight = footer ? `calc(100% - ${footer.offsetHeight}px)` : '100%'; + }, 100); + } + + _close() { + this.close().then(() => { + this.onClose.emit({ + component: this + }); + }); + + if (!this._hasOnSearch()) { + this._searchText = ''; + this._setHasSearchText(); + } + } + + _clear() { + const selectedItems = this._selectedItems; + + this.clear(); + this._emitValueChange(); + this._emitOnClear(selectedItems); + this.close().then(() => { + this.onClose.emit({ + component: this + }); + }); + } + + _getMoreItems() { + this.onInfiniteScroll.emit({ + component: this, + text: this._searchText + }); + } + + _setItemsToConfirm(items: any[]) { + // Return a copy of original array, so it couldn't be changed from outside. + this._itemsToConfirm = [].concat(items); + } + + _doSelect(selectedItem: any) { + this.value = selectedItem; + this._emitValueChange(); + } + + _select(item: any) { + const isItemSelected = this._isItemSelected(item); + + if (this.isMultiple) { + if (isItemSelected) { + this._deleteSelectedItem(item); + } else { + this._addSelectedItem(item); + } + + this._setItemsToConfirm(this._selectedItems); + + // Emit onSelect event after setting items to confirm so they could be used + // inside the event. + this._emitOnSelect(item, !isItemSelected); + } else { + if (this.hasConfirmButton || this.footerTemplate) { + // Don't close Modal and keep track on items to confirm. + // When footer template is used it's up to developer to close Modal. + this._selectedItems = []; + + if (isItemSelected) { + this._deleteSelectedItem(item); + } else { + this._addSelectedItem(item); + } + + this._setItemsToConfirm(this._selectedItems); + + // Emit onSelect event after setting items to confirm so they could be used + // inside the event. + this._emitOnSelect(item, !isItemSelected); + } else { + if (!isItemSelected) { + this._selectedItems = []; + this._addSelectedItem(item); + + // Emit onSelect before onChange. + this._emitOnSelect(item, true); + + if (this._shouldStoreItemValue) { + this._doSelect(this._getItemValue(item)); + } else { + this._doSelect(item); + } + } + + this._close(); + } + } + } + + _confirm() { + this.confirm(); + this._close(); + } + + private _getLabelText(): string { + return this._ionLabelElement ? this._ionLabelElement.textContent : null; + } + + private _areGroupsEmpty(groups) { + return groups.length === 0 || groups.every(group => !group.items || group.items.length === 0); + } + + private _countFooterButtons() { + let footerButtonsCount = 0; + + if (this.canClear) { + footerButtonsCount++; + } + + if (this.isMultiple || this._hasConfirmButton) { + footerButtonsCount++; + } + + if (this.canAddItem) { + footerButtonsCount++; + } + + this._footerButtonsCount = footerButtonsCount; + } + + private _setItems(items: any[]) { + // It's important to have an empty starting group with empty items (groups[0].items), + // because we bind to it when using VirtualScroll. + // See https://github.com/eakoriakin/ionic-selectable/issues/70. + let groups: any[] = [{ + items: items || [] + }]; + + if (items && items.length) { + if (this._hasGroups) { + groups = []; + + items.forEach(item => { + const groupValue = this._getPropertyValue(item, this.groupValueField); + const group = groups.find(_group => _group.value === groupValue); + + if (group) { + group.items.push(item); + } else { + groups.push({ + value: groupValue, + text: this._getPropertyValue(item, this.groupTextField), + items: [item] + }); + } + }); + } + } + + this._groups = groups; + this._filteredGroups = this._groups; + this._hasFilteredItems = !this._areGroupsEmpty(this._filteredGroups); + } + + private _getPropertyValue(object: any, property: string): any { + if (!property) { + return null; + } + + return property.split('.').reduce((_object, _property) => _object ? _object[_property] : null, object); + } + + private _setIonItemHasFocus(hasFocus: boolean) { + if (!this.ionItem) { + return; + } + + // Apply focus CSS class for proper stylying of ion-item/ion-label. + this._setIonItemCssClass('item-has-focus', hasFocus); + } + + private _setIonItemHasValue() { + if (!this.ionItem) { + return; + } + + // Apply value CSS class for proper stylying of ion-item/ion-label. + this._setIonItemCssClass('item-has-value', this.hasValue()); + } + + private _setHasPlaceholder() { + this._hasPlaceholder = !this.hasValue() && + (!this._isNullOrWhiteSpace(this.placeholder) || this.placeholderTemplate) ? + true : false; + } + + private propagateOnChange = (_: any) => { }; + private propagateOnTouched = () => { }; + + private _setIonItemCssClass(cssClass: string, shouldAdd: boolean) { + if (!this._ionItemElement) { + return; + } + + // Change to Renderer2 + if (shouldAdd) { + this._renderer.addClass(this._ionItemElement, cssClass); + } else { + this._renderer.removeClass(this._ionItemElement, cssClass); + } + } + + private _toggleAddItemTemplate(isVisible: boolean) { + // It should be possible to show/hide the template regardless + // canAddItem or canSaveItem parameters, so we could implement some + // custom behavior. E.g. adding item when search fails using onSearchFail event. + if (!this.addItemTemplate) { + return; + } + + // To make SaveItemTemplate visible we just position it over list using CSS. + // We don't hide list with *ngIf or [hidden] to prevent its scroll position. + this._isAddItemTemplateVisible = isVisible; + this._isFooterVisible = !isVisible; + } + + /* ControlValueAccessor */ + writeValue(value: any) { + this.value = value; + } + + registerOnChange(method: any): void { + this.propagateOnChange = method; + } + + registerOnTouched(method: () => void) { + this.propagateOnTouched = method; + } + + setDisabledState(isDisabled: boolean) { + this.isEnabled = !isDisabled; + } + /* .ControlValueAccessor */ + + ngOnInit() { + this._isIos = this._platform.is('ios'); + this._isMD = !this._isIos; + this._hasObjects = !this._isNullOrWhiteSpace(this.itemValueField); + // Grouping is supported for objects only. + // Ionic VirtualScroll has it's own implementation of grouping. + this._hasGroups = Boolean(this._hasObjects && this.groupValueField && !this.hasVirtualScroll); + + if (this.ionItem) { + this._ionItemElement = this._element.nativeElement.closest('ion-item'); + this._setIonItemCssClass('item-interactive', true); + this._setIonItemCssClass('item-ionic-selectable', true); + + if (this._ionItemElement) { + this._ionLabelElement = this._ionItemElement.querySelector('ion-label'); + + if (this._ionLabelElement) { + this._hasIonLabel = true; + this._ionLabelPosition = this._ionLabelElement.getAttribute('position') || 'default'; + } + } + } + + this.enableIonItem(this.isEnabled); + } + + ngDoCheck() { + const itemsChanges = this._itemsDiffer.diff(this.items); + + if (itemsChanges) { + this._setItems(this.items); + this.value = this.value; + + this.onItemsChange.emit({ + component: this + }); + } + } + + /** + * Adds item. + * **Note**: If you want an item to be added to the original array as well use two-way data binding syntax on `[(items)]` field. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#additem). + * + * @param item Item to add. + * @returns Promise that resolves when item has been added. + * @memberof IonicSelectableComponent + */ + addItem(item: any): Promise { + const self = this; + + // Adding item triggers onItemsChange. + // Return a promise that resolves when onItemsChange finishes. + // We need a promise or user could do something after item has been added, + // e.g. use search() method to find the added item. + this.items.unshift(item); + + // Close any running subscription. + if (this._addItemObservable) { + this._addItemObservable.unsubscribe(); + } + + return new Promise(function (resolve, reject) { + // Complete callback isn't fired for some reason, + // so unsubscribe in both success and fail cases. + self._addItemObservable = self.onItemsChange.asObservable().subscribe(() => { + self._addItemObservable.unsubscribe(); + resolve(''); + }, () => { + self._addItemObservable.unsubscribe(); + reject(); + }); + }); + } + + /** + * Deletes item. + * **Note**: If you want an item to be deleted from the original array as well use two-way data binding syntax on `[(items)]` field. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#deleteitem). + * + * @param item Item to delete. + * @returns Promise that resolves when item has been deleted. + * @memberof IonicSelectableComponent + */ + deleteItem(item: any): Promise { + const self = this; + let hasValueChanged = false; + + // Remove deleted item from selected items. + if (this._selectedItems) { + this._selectedItems = this._selectedItems.filter(_item => this._getItemValue(item) !== this._getStoredItemValue(_item)); + } + + // Remove deleted item from value. + if (this.value) { + if (this.isMultiple) { + const values = this.value.filter(value => value.id !== item.id); + + if (values.length !== this.value.length) { + this.value = values; + hasValueChanged = true; + } + } else { + if (item === this.value) { + this.value = null; + hasValueChanged = true; + } + } + } + + if (hasValueChanged) { + this._emitValueChange(); + } + + // Remove deleted item from list. + const items = this.items.filter(_item => _item.id !== item.id); + + // Refresh items on parent component. + this.itemsChange.emit(items); + + // Refresh list. + this._setItems(items); + + this.onItemsChange.emit({ + component: this + }); + + // Close any running subscription. + if (this._deleteItemObservable) { + this._deleteItemObservable.unsubscribe(); + } + + return new Promise(function (resolve, reject) { + // Complete callback isn't fired for some reason, + // so unsubscribe in both success and fail cases. + self._deleteItemObservable = self.onItemsChange.asObservable().subscribe(() => { + self._deleteItemObservable.unsubscribe(); + resolve(''); + }, () => { + self._deleteItemObservable.unsubscribe(); + reject(); + }); + }); + } + + /** + * Determines whether any item has been selected. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hasvalue). + * + * @returns A boolean determining whether any item has been selected. + * @memberof IonicSelectableComponent + */ + hasValue(): boolean { + if (this.isMultiple) { + return this._valueItems.length !== 0; + } else { + return this._valueItems.length !== 0 && !this._isNullOrWhiteSpace(this._valueItems[0]); + } + } + + /** + * Opens Modal. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#open). + * + * @returns Promise that resolves when Modal has been opened. + * @memberof IonicSelectableComponent + */ + open(): Promise { + const self = this; + + return new Promise(function (resolve, reject) { + if (!self._isEnabled || self._isOpened) { + reject('IonicSelectable is disabled or already opened.'); + return; + } + + self._filterItems(); + self._isOpened = true; + + const modalOptions: ModalOptions = { + component: IonicSelectableModalComponent, + componentProps: { selectComponent: self }, + backdropDismiss: self._shouldBackdropClose + }; + + if (self.modalCssClass) { + modalOptions.cssClass = self.modalCssClass; + } + + if (self.modalEnterAnimation) { + modalOptions.enterAnimation = self.modalEnterAnimation; + } + + if (self.modalLeaveAnimation) { + modalOptions.leaveAnimation = self.modalLeaveAnimation; + } + + self._modalController.create(modalOptions).then(modal => { + self._modal = modal; + modal.present().then(() => { + // Set focus after Modal has opened to avoid flickering of focus highlighting + // before Modal opening. + self._setIonItemHasFocus(true); + resolve(); + }); + + modal.onWillDismiss().then(() => { + self._setIonItemHasFocus(false); + }); + + modal.onDidDismiss().then(event => { + self._isOpened = false; + self._itemsToConfirm = []; + + // Closed by clicking on backdrop outside modal. + if (event.role === 'backdrop') { + self.onClose.emit({ + component: self + }); + } + }); + }); + }); + } + + /** + * Closes Modal. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#close). + * + * @returns Promise that resolves when Modal has been closed. + * @memberof IonicSelectableComponent + */ + close(): Promise { + const self = this; + + return new Promise(function (resolve, reject) { + if (!self._isEnabled || !self._isOpened) { + reject('IonicSelectable is disabled or already closed.'); + return; + } + + self.propagateOnTouched(); + self._isOpened = false; + self._itemToAdd = null; + self._modal.dismiss().then(() => { + self._setIonItemHasFocus(false); + self.hideAddItemTemplate(); + resolve(); + }); + }); + } + + /** + * Clears value. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#clear). + * + * @memberof IonicSelectableComponent + */ + clear() { + this.value = this.isMultiple ? [] : null; + this._itemsToConfirm = []; + this.propagateOnChange(this.value); + } + + /** + * Confirms selected items by updating value. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#confirm). + * + * @memberof IonicSelectableComponent + */ + confirm() { + if (this.isMultiple) { + this._doSelect(this._selectedItems); + } else if (this.hasConfirmButton || this.footerTemplate) { + this._doSelect(this._selectedItems[0] || null); + } + } + + /** + * Selects or deselects all or specific items. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#toggleitems). + * + * @param isSelect Determines whether to select or deselect items. + * @param [items] Items to toggle. If items are not set all items will be toggled. + * @memberof IonicSelectableComponent + */ + toggleItems(isSelect: boolean, items?: any[]) { + if (isSelect) { + const hasItems = items && items.length; + let itemsToToggle = this._groups.reduce((allItems, group) => allItems.concat(group.items), []); + + // Don't allow to select all items in single mode. + if (!this.isMultiple && !hasItems) { + itemsToToggle = []; + } + + // Toggle specific items. + if (hasItems) { + itemsToToggle = itemsToToggle.filter(itemToToggle => items.find(item => this._getItemValue(itemToToggle) === this._getItemValue(item)) !== undefined); + + // Take the first item for single mode. + if (!this.isMultiple) { + itemsToToggle.splice(0, 1); + } + } + + itemsToToggle.forEach(item => { + this._addSelectedItem(item); + }); + } else { + this._selectedItems = []; + } + + this._setItemsToConfirm(this._selectedItems); + } + + /** + * Scrolls to the top of Modal content. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#scrolltotop). + * + * @returns Promise that resolves when scroll has been completed. + * @memberof IonicSelectableComponent + */ + scrollToTop(): Promise { + const self = this; + + return new Promise(function (resolve, reject) { + if (!self._isOpened) { + reject('IonicSelectable content cannot be scrolled.'); + return; + } + + self._modalComponent._content.scrollToTop().then(() => { + resolve(''); + }); + }); + } + + /** + * Scrolls to the bottom of Modal content. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#scrolltobottom). + * + * @returns Promise that resolves when scroll has been completed. + * @memberof IonicSelectableComponent + */ + scrollToBottom(): Promise { + const self = this; + + return new Promise(function (resolve, reject) { + if (!self._isOpened) { + reject('IonicSelectable content cannot be scrolled.'); + return; + } + + self._modalComponent._content.scrollToBottom().then(() => { + resolve(''); + }); + }); + } + + /** + * Starts search process by showing Loading spinner. + * Use it together with `onSearch` event to indicate search start. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#startsearch). + * + * @memberof IonicSelectableComponent + */ + startSearch() { + if (!this._isEnabled) { + return; + } + + this.showLoading(); + } + + /** + * Ends search process by hiding Loading spinner and refreshing items. + * Use it together with `onSearch` event to indicate search end. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#endsearch). + * + * @memberof IonicSelectableComponent + */ + endSearch() { + if (!this._isEnabled) { + return; + } + + this.hideLoading(); + + // When inside Ionic Modal and onSearch event is used, + // ngDoCheck() doesn't work as _itemsDiffer fails to detect changes. + // See https://github.com/eakoriakin/ionic-selectable/issues/44. + // Refresh items manually. + this._setItems(this.items); + this._emitOnSearchSuccessOrFail(this._hasFilteredItems); + } + + /** + * Enables infinite scroll. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#enableinfinitescroll). + * + * @memberof IonicSelectableComponent + */ + enableInfiniteScroll() { + if (!this._hasInfiniteScroll) { + return; + } + + this._modalComponent._infiniteScroll.disabled = false; + } + + /** + * Disables infinite scroll. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#disableinfinitescroll). + * + * @memberof IonicSelectableComponent + */ + disableInfiniteScroll() { + if (!this._hasInfiniteScroll) { + return; + } + + this._modalComponent._infiniteScroll.disabled = true; + } + + /** + * Ends infinite scroll. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#endinfinitescroll). + * + * @memberof IonicSelectableComponent + */ + endInfiniteScroll() { + if (!this._hasInfiniteScroll) { + return; + } + + this._modalComponent._infiniteScroll.complete(); + this._setItems(this.items); + } + + /** + * Triggers search of items. + * **Note**: `canSearch` has to be enabled. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#search). + * + * @param text Text to search items by. + * @memberof IonicSelectableComponent + */ + search(text: string) { + if (!this._isEnabled || !this._isOpened || !this.canSearch) { + return; + } + + this._searchText = text; + this._setHasSearchText(); + this._filterItems(); + } + + /** + * Shows Loading spinner. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#showloading). + * + * @memberof IonicSelectableComponent + */ + showLoading() { + if (!this._isEnabled) { + return; + } + + this._isSearching = true; + } + + /** + * Hides Loading spinner. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hideloading). + * + * @memberof IonicSelectableComponent + */ + hideLoading() { + if (!this._isEnabled) { + return; + } + + this._isSearching = false; + } + + /** + * Shows `ionicSelectableAddItemTemplate`. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#showadditemtemplate). + * + * @memberof IonicSelectableComponent + */ + showAddItemTemplate() { + this._toggleAddItemTemplate(true); + + // Position the template only when it shous up. + this._positionAddItemTemplate(); + } + + /** + * Hides `ionicSelectableAddItemTemplate`. + * See more on [GitHub](https://github.com/eakoriakin/ionic-selectable/wiki/Documentation#hideadditemtemplate). + * + * @memberof IonicSelectableComponent + */ + hideAddItemTemplate() { + // Clean item to add as it's no longer needed once Add Item Modal has been closed. + this._itemToAdd = null; + this._toggleAddItemTemplate(false); + } +} diff --git a/src/app/components/join-sangh-button/join-sangh-button.component.html b/src/app/components/join-sangh-button/join-sangh-button.component.html new file mode 100644 index 0000000..e733891 --- /dev/null +++ b/src/app/components/join-sangh-button/join-sangh-button.component.html @@ -0,0 +1,53 @@ + + {{sangh.sangh_member_status === 3 ? 'Requested' : 'Join'}} + + + + {{sangh.sangh_member_status === 3 ? 'Requested' : 'Join'}} + + + + + Request for member + + + Accept/Decline + + Requested + + + +
+ +
+ + + Member + Core Committee Member + +
+ +
+ + +
+ + Role title is required. + +
+
+ + + JOIN + CANCEL + +
+
+
\ No newline at end of file diff --git a/src/app/components/join-sangh-button/join-sangh-button.component.scss b/src/app/components/join-sangh-button/join-sangh-button.component.scss new file mode 100644 index 0000000..55ee0f5 --- /dev/null +++ b/src/app/components/join-sangh-button/join-sangh-button.component.scss @@ -0,0 +1,37 @@ +:host { + display: contents; +} + +ion-modal { + --width: fit-content; + --min-width: 250px; + --height: fit-content; + --border-radius: 6px; + --box-shadow: 0 28px 48px rgba(0, 0, 0, 0.4); +} + +ion-modal ion-icon { + margin-right: 6px; + + width: 48px; + height: 48px; + + padding: 4px 0; + + color: #aaaaaa; +} + +ion-modal .wrapper { + padding: 10px; + + ion-buttons { + justify-content: space-around; + } +} + +.si { + &::part(native) { + --background: var(--ion-background-content-sangh) !important; + color: var(--ion-color-sangh) !important; + } +} diff --git a/src/app/components/join-sangh-button/join-sangh-button.component.ts b/src/app/components/join-sangh-button/join-sangh-button.component.ts new file mode 100644 index 0000000..11a2c87 --- /dev/null +++ b/src/app/components/join-sangh-button/join-sangh-button.component.ts @@ -0,0 +1,116 @@ +import { NgClass, NgIf } from '@angular/common'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { CommonResponse, SanghData, UserData } from '@interfaces/common'; +import { JoinSanghForm } from '@interfaces/form'; +import { IonicModule } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-join-sangh-button', + templateUrl: './join-sangh-button.component.html', + styleUrls: ['./join-sangh-button.component.scss'], + standalone: true, + imports: [NgIf, IonicModule, FormsModule, ReactiveFormsModule, NgClass], +}) +export class JoinSanghButtonComponent implements OnInit { + @Input() sangh: any; + @Input() userData: UserData; + @Input() page: string; + joinSanghForm: FormGroup; + isModalOpen = false; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private utilityService: UtilityService + ) { } + + ngOnInit(): void { + this.joinSanghForm = new FormGroup({ + joinType: new FormControl('member'), + roleName: new FormControl(null) + }); + this.onTypeChange(); + } + + joinSangh(sangh: SanghData) { + if (this.sangh.sangh_member_status === 3) { + this.cancelSanghRequest(sangh); + } else { + this.isModalOpen = true; + } + } + + onTypeChange() { + this.joinSanghForm.get('roleName').addValidators([Validators.required]); + if (this.joinSanghForm.value.joinType === 'member') { + this.joinSanghForm.get('roleName').clearValidators(); + } + this.joinSanghForm.get('roleName').updateValueAndValidity(); + } + + confirmJoin() { + this.joinSanghForm.markAllAsTouched(); + + if (this.joinSanghForm.invalid) { return; } + + this.alert.showLoader(); + this.httpRequestService.post(api.addMemberForSangh, { + sangh_id: this.sangh.id, + user_id: [this.userData.id], + is_join: 1, + ...this.joinSanghForm.value.joinType === 'committee' && { + core_committee: 1, + role: this.joinSanghForm.value.roleName, + } + }).then((res: any) => { + this.sangh.sangh_member_status = 3; + this.alert.showToaster(res.message); + }).finally(() => { + this.isModalOpen = false; + this.alert.hideLoader(); + }); + } + + async cancelSanghRequest(sangh: SanghData) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about cancel this request?', + 'No', 'Yes', 'Cancel Request' + ); + if (isYes) { + this.alert.showLoader(); + this.httpRequestService.post(api.acceptDeclineSanghRequest, { + sangh_id: sangh.id, + user_id: this.userData.id, + status: 2, + }).then((res: any) => { + sangh.sangh_member_status = 0; + this.alert.showToaster(res.message); + }).finally(() => this.alert.hideLoader()); + } + } + + acceptDecline() { + this.utilityService.presentAcceptDecline(`Please confirm`) + .then(action => { + if (action) { + this.alert.showLoader(); + this.httpRequestService.post(api.acceptDeclineSanghRequest, { + sangh_id: this.sangh.id, + user_id: this.userData.id, + status: action, // 1-accept, 2-decline/cancel + is_commiittee: this.sangh.is_member === 0 ? 0 : 1, + }).then((res: CommonResponse) => { + this.alert.showToaster(res.message); + this.sangh.sangh_member_status = (action === 1 ? 1 : 0); // 1-accept, 0-reset + }).finally(() => { + this.alert.hideLoader(); + }); + } + }); + } +} diff --git a/src/app/components/message-notification-badge/message-notification-badge.component.html b/src/app/components/message-notification-badge/message-notification-badge.component.html new file mode 100644 index 0000000..8cc54e2 --- /dev/null +++ b/src/app/components/message-notification-badge/message-notification-badge.component.html @@ -0,0 +1,7 @@ + + +{{ messageIndObservable }} + +{{ pushNotyObservable }} \ No newline at end of file diff --git a/src/app/components/message-notification-badge/message-notification-badge.component.scss b/src/app/components/message-notification-badge/message-notification-badge.component.scss new file mode 100644 index 0000000..8a37fd5 --- /dev/null +++ b/src/app/components/message-notification-badge/message-notification-badge.component.scss @@ -0,0 +1,13 @@ +ion-icon.home { + color: var(--ion-color) !important; + font-size: var(--ion-font-size-24); +} + +ion-icon.menu { + color: #fff !important; + font-size: var(--ion-font-size-24); +} + +.notifications-badge { + right: 45px; +} \ No newline at end of file diff --git a/src/app/components/message-notification-badge/message-notification-badge.component.ts b/src/app/components/message-notification-badge/message-notification-badge.component.ts new file mode 100644 index 0000000..23c612a --- /dev/null +++ b/src/app/components/message-notification-badge/message-notification-badge.component.ts @@ -0,0 +1,40 @@ +import { NgIf } from '@angular/common'; +import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-message-notification-badge', + templateUrl: './message-notification-badge.component.html', + styleUrls: ['./message-notification-badge.component.scss'], + standalone: true, + imports: [IonicModule, NgIf] +}) +export class MessageNotificationBadgeComponent implements OnInit { + @Input() type: string; + messageIndObservable = 0; + pushNotyObservable = 0; + + constructor( + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private change: ChangeDetectorRef + ) { } + + ngOnInit() { + this.pushNotyObservable = this.stateManagementService.generalData.unread_notification_count; + this.messageIndObservable = this.stateManagementService.generalData.unread_message_count; + this.stateManagementService.pushNotyObservable.subscribe(res => { + this.pushNotyObservable = res.unread_notification_count; + this.messageIndObservable = res.unread_message_count; + this.change.detectChanges(); + }); + } + + redirect(type: string) { + this.navCtrl.navigateForward([`${Roots.page}/${type === 'messages' ? Roots.message : type === 'search' ? + Roots.globalSearch : Roots.notification}`]); + } + +} diff --git a/src/app/components/message-popover/message-popover.component.html b/src/app/components/message-popover/message-popover.component.html new file mode 100644 index 0000000..d7c95d7 --- /dev/null +++ b/src/app/components/message-popover/message-popover.component.html @@ -0,0 +1,11 @@ + + + View Profile + + + Clear Conversation + + + Delete Conversation + + diff --git a/src/app/components/message-popover/message-popover.component.scss b/src/app/components/message-popover/message-popover.component.scss new file mode 100644 index 0000000..674d139 --- /dev/null +++ b/src/app/components/message-popover/message-popover.component.scss @@ -0,0 +1,11 @@ +ion-list { + box-shadow: 0px 4px 31.1px 19.9px rgba(0, 1, 1, 0.2); + padding: 10px 0; + ion-item { + --padding-end: 0px; + --inner-padding-end: 0px; + padding: 0 20px; + --background: transparent; + --min-height: 36px; + } +} diff --git a/src/app/components/message-popover/message-popover.component.ts b/src/app/components/message-popover/message-popover.component.ts new file mode 100644 index 0000000..eacd83d --- /dev/null +++ b/src/app/components/message-popover/message-popover.component.ts @@ -0,0 +1,59 @@ +import { NgIf } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController, PopoverController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-message-popover', + templateUrl: './message-popover.component.html', + styleUrls: ['./message-popover.component.scss'], + standalone: true, + imports: [IonicModule, NgIf] +}) +export class MessagePopoverComponent { + @Input() shravakId: number; + @Input() messageExist = Boolean(false); + + constructor( + private httpService: HttpRequestService, + private alert: AlertService, + private stateManagementService: StateManagementService, + private popoverController: PopoverController, + private navCtrl: NavController, + private utilityService: UtilityService + ) { } + + goToShravakProfile() { + this.dismiss(); + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: this.shravakId }]); + } + + async clearMessages() { + const isYes = await this.utilityService.presentConfirm('Are you sure you want to clear this conversation?'); + if (isYes) { + const res: any = await this.httpService.delete(api.clearMessage + '/' + this.shravakId.toString(), {}); + this.alert.showToaster(res.message); + this.stateManagementService.messageClearObservable.next(+this.shravakId); + } + } + + async deleteThread() { + const isYes = await this.utilityService.presentConfirm('Are you sure you want to remove this conversation?'); + if (isYes) { + const res: any = await this.httpService.delete(api.deleteMessageThread + '/' + this.shravakId.toString(), {}); + this.alert.showToaster(res.message); + this.stateManagementService.messageThreadRemoveObservable.next(this.shravakId); + this.navCtrl.navigateForward([Roots.page + '/' + Roots.message]); + } + } + + async dismiss() { + await this.popoverController.dismiss(); + } + +} diff --git a/src/app/components/post/post.component.html b/src/app/components/post/post.component.html new file mode 100644 index 0000000..5b2e1ea --- /dev/null +++ b/src/app/components/post/post.component.html @@ -0,0 +1,125 @@ + + + + +
+

{{postData?.created_by?.name}}

+ with +

{{ + postData?.tag_users[0]?.name }} +

+ and + {{ postData?.tag_users.length-1 }} others + in +

{{ postData?.location }}

+ {{ postData?.created_ago }} +
+ + + + + + + + + + + Edit post + + + + Delete post + + + + Report content + + + + {{ postData.hide ? 'Show' : 'Hide' }} post + + + + + + +
+

{{ postData?.post_type }}

+
+ +
+ +
+ + +
+ +
+
+
+
+
+

+

+ Show + {{ showMore ? 'less' : 'More' }} + +
+ +
+ +
+ Done +

This post has been hidden.

+ Undo +
+
+
+
diff --git a/src/app/components/post/post.component.scss b/src/app/components/post/post.component.scss new file mode 100644 index 0000000..a740033 --- /dev/null +++ b/src/app/components/post/post.component.scss @@ -0,0 +1,228 @@ +p { + display: inline-block; +} + +.show-more-less { + margin-left: 10px; +} + +.d-block { + display: block; +} + +ion-card { + border-radius: 0; + + ion-card-header { + padding: var(--ion-padding-10); + background: var(--ion-background-button); + border-top: 2px solid var(--ion-color); + flex-direction: column; + + ion-card-title { + font-size: var(--ion-font-size-14); + position: relative; + + ion-icon { + width: 23px; + height: 23px; + padding: 3px 6px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + background: none; + } + + .post-title { + width: calc(100% - 52px); + + p { + font-size: var(--ion-font-size-14); + color: var(--ion-color-black); + font-weight: 600; + display: inline; + word-break: break-word; + } + + span { + font-size: var(--ion-font-size-12); + margin-top: 2px; + font-weight: 500; + color: var(--ion-color-light-text); + + &:last-child { + display: block; + + ion-chip { + --background: rgba(255, 99, 49, 0.1); + --color: #FF6331; + margin: var(--ion-margin-0); + padding: 3px 7px; + font-size: 10px; + height: auto; + border-radius: 2px; + text-transform: uppercase; + } + } + } + } + } + + img { + width: 42px; + height: 42px; + background: var(--ion-background-content); + border-radius: 50%; + object-fit: cover; + margin-right: var(--ion-margin-10); + } + + p { + font-size: 12px; + margin-top: 5px; + border-radius: 10px; + color: var(--ion-color); + } + + } + + ion-card-content { + font-size: var(--ion-font-size-14); + display: block; + + p { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10); + color: var(--ion-color-black); + font-weight: 500; + + span { + color: var(--ion-color); + } + + a { + span { + color: var(--ion-color, #3880ff); + } + } + + &.pre-fill { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + margin-bottom: 3px; + + &.d-block { + display: block; + } + } + } + + .img-upload { + + .swiper { + width: 100%; + background: var(--ion-background-gray-medium); + } + } + + .footer-icon { + padding: 0 var(--ion-padding-10); + + .footer-icon-wrap { + color: var(--ion-color-black); + flex-wrap: wrap; + width: 100%; + + .footer-row { + padding: var(--ion-padding-10) 0; + width: 100%; + + &:not(:last-child) { + border-bottom: 1px solid var(--ion-background-gray-light); + } + + &.post-count { + font-size: var(--ion-font-size-12); + + ion-icon { + height: 18px; + width: 18px; + } + } + + span { + padding-left: var(--ion-padding-10); + min-width: 30px; + + &.like-text { + padding-left: 36px; + } + } + } + } + + .icon-wrap { + position: relative; + } + + ion-icon { + width: 22px; + height: 22px; + color: var(--ion-color); + position: relative; + + &.heart { + color: var(--ion-color-danger); + } + } + + .like-btn { + width: 80px; + height: 100px; + position: absolute; + left: -36px; + bottom: -39px; + background: url('/assets/images/web-like-animation.svg') no-repeat; + background-position: 0 0; + cursor: pointer; + background-size: 2900px 100px; + z-index: -1; + + &.pray-icon { + background: url('/assets/images/web-pray-animation.svg') no-repeat; + } + + &.filled-like { + background-position: -2800px 0; + } + + &.effect { + transition: background 1s steps(28); + animation: fave-like-btn 1s steps(28); + background-position: -2800px 0; + } + } + } + + swiper-container { + swiper-slide { + height: auto; + } + } + + .post-desc { + margin-top: 5px; + padding-top: 10px + } + } +} + +@keyframes fave-like-btn { + 0% { + background-position: 0 0; + } + + 100% { + background-position: -2800px 0; + } +} \ No newline at end of file diff --git a/src/app/components/post/post.component.ts b/src/app/components/post/post.component.ts new file mode 100644 index 0000000..d9c95b9 --- /dev/null +++ b/src/app/components/post/post.component.ts @@ -0,0 +1,178 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { AfterViewInit, CUSTOM_ELEMENTS_SCHEMA, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Share, ShareOptions } from '@capacitor/share'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { PostList } from '@interfaces/common'; +import { IonPopover, IonicModule, ModalController, NavController } from '@ionic/angular'; +import { TaggedUserPage } from '@pages/post/tagged-user/tagged-user.page'; +import { ClickableLinkPipe } from '@pipes/clickable-link.pipe'; +import { HighlightMentionsPipe } from '@pipes/highlight-mentions.pipe'; +import { SafeHtmlPipe } from '@pipes/safe-html.pipe'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; +import { register } from 'swiper/element/bundle'; + +register(); + +@Component({ + selector: 'app-post', + templateUrl: './post.component.html', + styleUrls: ['./post.component.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, NgClass, SafeHtmlPipe, ClickableLinkPipe, HighlightMentionsPipe], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class PostComponent implements AfterViewInit { + @Output() updatePostEvent = new EventEmitter(); + @Output() deletePostEvent = new EventEmitter(); + @ViewChild('description') description: ElementRef; + @ViewChild('postOption') postOption: IonPopover; + postData: PostList; + postType: 'sant' | 'sangh' | 'shravak'; + userId: number; + isEditable = Boolean(false); + diffPage: string; + showMore = false; + hasMoreDesc = false; + isOpenOptions = false; + toggleLike = false; + + constructor( + private navCtrl: NavController, + private modalController: ModalController, + private httpRequestService: HttpRequestService, + private utilityService: UtilityService + ) { } + + get defaultImg() { + return `/assets/images/${this.postType === 'shravak' ? 'shravak-profile.png' : + this.postType === 'sangh' ? 'sangh-profile.png' : 'sant-profile.png'}`; + } + + @Input() set _postData(value: PostList) { + this.postData = value; + } + + @Input() set _type(value: 'sant' | 'sangh' | 'shravak') { + this.postType = value; + } + + @Input() set _currentUserId(value: number) { + this.userId = value; + } + + @Input() set _isEditable(value: boolean) { + this.isEditable = value; + } + + @Input() set _fromPage(value: string) { + this.diffPage = value || 'default'; + } + + ngAfterViewInit(): void { + const el = this.description.nativeElement; + setTimeout(() => { + this.hasMoreDesc = el.offsetHeight < el.scrollHeight || el.offsetWidth < el.scrollWidth; + }, 300); + } + + async onModelOpen(taggedUsers) { + const componentProps = { + taggedUsers + }; + const modal = await this.modalController.create({ + component: TaggedUserPage, + componentProps, + mode: 'ios', + backdropDismiss: true, + breakpoints: [0.1, 0.2, 1], + initialBreakpoint: 0.2, + }); + return await modal.present(); + } + + openReport(id) { + this.utilityService.openReport({ postId: id, type: this.postType }); + } + + hidePost(post) { + this.utilityService.hidePost(post); + } + + postDetail(post: PostList) { + const navOption = { + state: { + postId: post.id, + type: this.postType === 'shravak' ? '1' : '3' + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postDetail, navOption); + } + + likeDislikePost(post, id) { + const params = { + post_id: id, + }; + this.httpRequestService.post(api.likeDislikePost, params).then((res: any) => { + post.is_liked = !post.is_liked; + post.likes_count = res.data.likes_count; + this.toggleLike = post.is_liked; + }); + } + + async updatePost(postInfo) { + this.updatePostEvent.emit(postInfo); + } + + async deletePost(postId) { + this.deletePostEvent.emit(postId); + } + + async sharePost() { + const url = `${environment.siteUrl}/page/post-detail/${this.postData.id}?type=${this.postType === 'shravak' ? '1' : '3'}`; + const options: ShareOptions = { url }; + await Share.share(options); + } + + moveToProfile() { + if (this.postType === 'shravak') { + this.moveToShravak(this.postData.user_id); + } else if (this.postType === 'sangh') { + this.moveToSangh(this.postData.sangh_details.id); + } else { + this.moveToSant(this.postData.subject.id); + } + } + + moveToShravak(shravakId) { + if (shravakId === this.userId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile.replace(':id', shravakId)]); + } + } + + moveToSangh(sanghId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', sanghId)); + } + + moveToSant(santId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } + + address(element) { + this.utilityService.openGoogleMap(element.latitude, element.longitude); + } + + imagePreview(imgName: string) { + this.utilityService.imagePreview(imgName); + } + + openOptions(e: Event) { + this.postOption.event = e; + this.isOpenOptions = true; + } + +} diff --git a/src/app/components/profile-complete-indicator/profile-complete-indicator.component.html b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.html new file mode 100644 index 0000000..69451a0 --- /dev/null +++ b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.html @@ -0,0 +1,26 @@ +
+ {{ percentage }}% complete + {{ points }} +
+
+ +
+

+ + Complete your profile and get 100 karma points + + + Congratulations. You received 100 karma points + + + Complete your profile and reclaim Karma points + +

+

+ Complete profile and earn 50 karma + points
on approval +

+ +
+
\ No newline at end of file diff --git a/src/app/components/profile-complete-indicator/profile-complete-indicator.component.scss b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.scss new file mode 100644 index 0000000..27ae98e --- /dev/null +++ b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.scss @@ -0,0 +1,28 @@ +.font-12 { + font-size: var(--ion-font-size-12); +} + +.ml-auto { + margin-left: auto; +} + +.my-5 { + margin: 5px 0; +} + +.karma-points { + color: var(--ion-color-warning); +} + +.progress-indicator { + height: 5px; + border-radius: var(--ion-border-radius-5); + --background: var(--ion-background-button); + --progress-background: var(--ion-color); + + &.sant { + --background: var(--ion-content-color-sant); + --progress-background: var(--ion-color-sant); + } + +} \ No newline at end of file diff --git a/src/app/components/profile-complete-indicator/profile-complete-indicator.component.ts b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.ts new file mode 100644 index 0000000..c6ef622 --- /dev/null +++ b/src/app/components/profile-complete-indicator/profile-complete-indicator.component.ts @@ -0,0 +1,24 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { IonicModule } from '@ionic/angular'; +import { NgIf, NgClass } from '@angular/common'; + +@Component({ + selector: 'app-profile-complete-indicator', + templateUrl: './profile-complete-indicator.component.html', + styleUrls: ['./profile-complete-indicator.component.scss'], + standalone: true, + imports: [NgIf, IonicModule, NgClass] +}) +export class ProfileCompleteIndicatorComponent { + @Input() page: string; + @Input() points: number; + @Input() percentage: number; + @Input() completed: number; + @Output() clicked = new EventEmitter(); + + goToEditProfile(e: Event) { + e.stopPropagation(); + this.clicked.emit(); + } + +} diff --git a/src/app/components/report-content/report-content.component.html b/src/app/components/report-content/report-content.component.html new file mode 100644 index 0000000..c35815d --- /dev/null +++ b/src/app/components/report-content/report-content.component.html @@ -0,0 +1,33 @@ + + + Report {{ data.postId ? 'content' : data.commentId ? 'comment' : 'user' }} + + + +
+ +
+ + + {{sub.text}} + +
+ + Please select a reason. + +
+
+ +
+ + +
+ + Submit +
+
\ No newline at end of file diff --git a/src/app/components/report-content/report-content.component.scss b/src/app/components/report-content/report-content.component.scss new file mode 100644 index 0000000..e83ace7 --- /dev/null +++ b/src/app/components/report-content/report-content.component.scss @@ -0,0 +1,25 @@ +ion-item { + --background-focused: none; +} + +.sangh { + ion-item { + + ion-input, + ion-text, + ion-textarea, + ion-select { + border: 1px solid var(--ion-color-sangh); + } + } + + ion-button::part(native) { + --background: var(--ion-color-sangh); + } +} + +.sant { + ion-button::part(native) { + --background: var(--ion-color-sant); + } +} \ No newline at end of file diff --git a/src/app/components/report-content/report-content.component.ts b/src/app/components/report-content/report-content.component.ts new file mode 100644 index 0000000..1f8cf1f --- /dev/null +++ b/src/app/components/report-content/report-content.component.ts @@ -0,0 +1,58 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { ReportForm } from '@interfaces/form'; +import { IonicModule, ModalController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; + +@Component({ + selector: 'app-report-content', + templateUrl: './report-content.component.html', + styleUrls: ['./report-content.component.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgFor, NgIf] +}) +export class ReportContentComponent implements OnInit { + @Input() data: any; + reportSubjects = constants.reportSubjects; + pType = 'shravak'; + reportForm: FormGroup; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private modalController: ModalController + ) { } + + ngOnInit() { + this.pType = this.data.type; + this.reportForm = new FormGroup({ + type: new FormControl(this.data.postId ? 2 : this.data.commentId ? 3 : 1), + reported_for: new FormControl( + this.data.postId ? this.data.postId : + this.data.commentId ? this.data.commentId : this.data.userId + ), + subject: new FormControl(null, Validators.required), + description: new FormControl(null) + }); + } + + submit() { + this.reportForm.markAsDirty(); + if (this.reportForm.invalid) { + return; + } + this.alert.showLoader(); + this.httpRequestService.post(api.flagReport, this.reportForm.value) + .then((res: any) => { + this.alert.showToaster(res.message); + }).finally(() => { + this.modalController.dismiss(); + this.alert.hideLoader(); + }); + } + +} diff --git a/src/app/components/sant-location/sant-location.component.html b/src/app/components/sant-location/sant-location.component.html new file mode 100644 index 0000000..76faf06 --- /dev/null +++ b/src/app/components/sant-location/sant-location.component.html @@ -0,0 +1,97 @@ +
+
+
Current location
+ + + +
+ + + + +
{{ santDetails.sant_location }}
+
+
+ + +

Last update: + {{ santDetails.sant_location_updated_by.name || santDetails.sant_location_created_by.name || + 'Global Jain Member' }} + +

+

{{ santDetails.sant_location_updated_by.updated_ago || + santDetails.sant_location_created_by.created_ago }} +

+
+ +

If you know the current location of {{ santDetails.name }}, please + add

+
+
+

Note: Last Vihaar location is + the current + location

+
+
+ + +
+

Please select

+ + + + By Location + + + By Sangh + + + + + + + + + + + +
+ + + + +

{{ sangh.name }}

+
+
+
+
+
+ Please select sangh. +
+
+ + + + + +
+ Please tick the checkbox as confirmation. +
+ + + UPDATE + + CANCEL + +
+
+
diff --git a/src/app/components/sant-location/sant-location.component.scss b/src/app/components/sant-location/sant-location.component.scss new file mode 100644 index 0000000..901822c --- /dev/null +++ b/src/app/components/sant-location/sant-location.component.scss @@ -0,0 +1,100 @@ +:host { + display: contents; +} + +ion-modal { + --width: fit-content; + --max-width: 90%; + --height: fit-content; + --border-radius: var(--ion-border-radius-5); + --box-shadow: 0 28px 48px rgba(var(--ion-color-black-rgb), 0.4); + + .wrapper { + padding: 10px; + + .input { + border: 1px solid var(--ion-color-sant); + border-radius: var(--border-radius-5); + font-size: var(--ion-font-size-14); + width: 100%; + height: 48px; + display: flex; + align-items: center; + } + + ion-radio-group { + + ion-item { + --min-height: inherit; + + ion-radio { + margin-right: var(--ion-margin-10); + --color-checked: var(--ion-color-sant); + + &::part(container) { + --border-width: 1px; + border-color: var(--ion-color-sant); + } + } + } + } + + .checkbox-label { + line-height: 1.2; + } + } +} + +.bottom-bg-location { + + h5 { + color: var(--ion-color-sant); + font-weight: 600; + } + + .edit-btn { + width: 30px; + height: 30px; + } + + ion-card { + padding: var(--ion-padding-10); + + ion-card-header { + + ion-card-title { + font-size: var(--ion-font-size-14); + font-weight: 600; + + ion-icon { + width: 23px; + height: 23px; + padding: 6px; + background: var(--ion-background-content-sant); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sant); + margin-right: var(--ion-margin-10); + } + + .full-address { + width: calc(100% - 65px); + } + } + } + + ion-card-content { + font-size: var(--ion-font-size-14); + } + + p { + + span { + color: var(--ion-color-sant); + } + + &.notes { + margin-top: 10px; + } + } + } +} \ No newline at end of file diff --git a/src/app/components/sant-location/sant-location.component.ts b/src/app/components/sant-location/sant-location.component.ts new file mode 100644 index 0000000..1533bc5 --- /dev/null +++ b/src/app/components/sant-location/sant-location.component.ts @@ -0,0 +1,172 @@ +import { NgIf } from '@angular/common'; +import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { FormsModule, NgModel } from '@angular/forms'; +import { IonicSelectableItemTemplateDirective } from '@components/ionic-selectable/ionic-selectable-item-template.directive'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { IdName, SanghData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +enum ADDRESS_TYPE { + Location = 1, + Sangh = 2 +} + +@Component({ + selector: 'app-sant-location', + templateUrl: './sant-location.component.html', + styleUrls: ['./sant-location.component.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, IonicSelectableComponent, IonicSelectableItemTemplateDirective] +}) +export class SantLocationComponent implements OnInit { + @Input() santDetails: any; + @Output() updated = new EventEmitter(); + @ViewChild('Location') location: ElementRef; + @ViewChild('confirm') confirm: NgModel; + @ViewChild('sanghListComponent') sanghListComponent: IonicSelectableComponent; + addLocation = ''; + addLocationLat = ''; + addLocationLong = ''; + isModalOpen = false; + addressType: ADDRESS_TYPE = ADDRESS_TYPE.Location; + sanghList: Array = []; + selectedSangh: IdName = null; + sanghPageNumber = 1; + sanghTotalPages = 1; + sanghSearchText = ''; + prevValue = ''; + confirmed = false; + + constructor( + private utilityService: UtilityService, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private change: ChangeDetectorRef, + private navController: NavController, + private stateManagementService: StateManagementService + ) { } + + async ngOnInit() { + this.addressType = this.santDetails.sant_location_type || ADDRESS_TYPE.Location; + if (this.santDetails.sant_location_type === ADDRESS_TYPE.Sangh) { + this.selectedSangh = { id: this.santDetails.sant_location_sangh_id, name: this.santDetails.sant_location }; + } else if (this.santDetails.sant_location_type === ADDRESS_TYPE.Location) { + this.addLocation = this.santDetails.sant_location; + this.addLocationLat = this.santDetails.sant_location_latitude; + this.addLocationLong = this.santDetails.sant_location_longitude; + } + this.change.detectChanges(); + await this.getSanghList(); + } + + address(element) { + this.utilityService.openGoogleMap(element.sant_location_latitude, element.sant_location_longitude); + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.location.nativeElement, []).subscribe((details) => { + this.addLocation = this.location.nativeElement.value; + this.addLocationLat = details.geometry.location.lat(); + this.addLocationLong = details.geometry.location.lng(); + }); + } + + removeLatAndLong() { + this.addLocationLat = ''; + this.addLocationLong = ''; + } + + searchSangh(event: { component: IonicSelectableComponent; text: string }) { + const isSameStr = this.utilityService.isSameStr(event.text, this.prevValue); + this.prevValue = event.text; + if (!isSameStr) { + this.sanghPageNumber = 1; + this.sanghList = []; + this.sanghSearchText = event.text; + event.component.showLoading(); + this.getSanghList().then(() => { + event.component.hideLoading(); + }); + } + } + + + getSanghList() { + return this.httpRequestService.get(api.sanghSearchList, { + name: this.sanghSearchText, + page: this.sanghPageNumber, + limit: 15 + }).then((res: any) => { + this.sanghList.push(...res.data.data); + this.sanghTotalPages = res.data.last_page; + }); + } + + addSangh(sangh) { + this.selectedSangh = { + id: sangh.value.id, + name: sangh.value.name + }; + this.sanghListComponent.searchText = ''; + this.sanghList = []; + this.sanghSearchText = ''; + this.sanghPageNumber = 1; + this.getSanghList(); + } + + getMoreSangh(event: { component: IonicSelectableComponent; text: string }) { + if (this.sanghPageNumber >= this.sanghTotalPages) { + event.component.disableInfiniteScroll(); + return; + } + this.sanghPageNumber++; + this.getSanghList().then(() => { + event.component.endInfiniteScroll(); + }); + } + + submitLocation() { + this.confirm.control.markAsDirty(); + if (!this.confirmed) { return; } + + this.alert.showLoader(); + this.httpRequestService.post(api.updateSantLocation, { + sant_id: this.santDetails.id, + ...this.addressType === ADDRESS_TYPE.Location && { + location: this.addLocation, + latitude: this.addLocationLat, + longitude: this.addLocationLong + }, + ...this.addressType === ADDRESS_TYPE.Sangh && { + sangh_id: this.selectedSangh.id + } + }).then((res: any) => { + this.isModalOpen = false; + this.alert.showToaster(res.message); + this.updated.emit(true); + }).finally(() => { + this.confirmed = false; + this.alert.hideLoader(); + }); + } + + async goToProfile() { + if (this.santDetails.sant_location_updated_by.name || this.santDetails.sant_location_created_by.name) { + const userData = await this.stateManagementService.storage.get(GJainStorage.userData); + const id = this.santDetails.sant_location_updated_by.id || this.santDetails.sant_location_created_by.id; + if (id === userData.id) { + this.navController.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navController.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile.replace(':id', id)]); + } + } + } + +} diff --git a/src/app/components/sant-post/sant-post.component.html b/src/app/components/sant-post/sant-post.component.html new file mode 100644 index 0000000..bb62ea9 --- /dev/null +++ b/src/app/components/sant-post/sant-post.component.html @@ -0,0 +1,45 @@ + + + + +
+

{{post?.subject?.name}}

+ {{ post?.created_ago }} +
+ + + + + + + + Report content + + + + {{ post.hide ? 'Show' : 'Hide' }} post + + + + + +
+
+ +
+ +

{{ + post?.properties?.attributes?.message }}

+
+ +
+ Done +

This post has been hidden.

+ Undo +
+
+
+
diff --git a/src/app/components/sant-post/sant-post.component.scss b/src/app/components/sant-post/sant-post.component.scss new file mode 100644 index 0000000..fce0cc3 --- /dev/null +++ b/src/app/components/sant-post/sant-post.component.scss @@ -0,0 +1,66 @@ +ion-card { + border-radius: 0; + + &.detail { + ion-card-header { + padding: var(--ion-padding-10); + background: var(--ion-background-content-sant); + border-top: 2px solid var(--ion-color-sant); + border-bottom: 2px solid var(--ion-color-sant); + align-items: start !important; + + app-avatar-percentage { + margin-right: var(--ion-margin-10); + } + + ion-card-title { + width: calc(100% - 62px); + font-size: var(--ion-font-size-14); + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + + .post-title { + width: 100%; + + p { + color: var(--ion-color-black); + font-weight: 600; + display: inline; + word-break: break-word; + border-radius: 10px; + } + + span { + font-size: var(--ion-font-size-12); + color: var(--ion-content-color); + margin-top: 2px; + font-weight: 500; + display: block; + } + } + + ion-icon { + background: none; + color: var(--ion-content-color); + width: 23px; + height: 23px; + padding: 3px 15px 3px 0px; + border-radius: var(--ion-border-radius-100); + } + } + } + + ion-card-content { + display: block; + font-size: var(--ion-font-size-14); + + p { + margin: var(--ion-margin-10); + color: var(--ion-color-black); + font-weight: 500; + } + } + } +} \ No newline at end of file diff --git a/src/app/components/sant-post/sant-post.component.ts b/src/app/components/sant-post/sant-post.component.ts new file mode 100644 index 0000000..a10a13e --- /dev/null +++ b/src/app/components/sant-post/sant-post.component.ts @@ -0,0 +1,52 @@ +import { NgIf } from '@angular/common'; +import { Component, Input, OnInit } from '@angular/core'; +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { SantActivityList, UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sant-post', + templateUrl: './sant-post.component.html', + styleUrls: ['./sant-post.component.scss'], + standalone: true, + imports: [IonicModule, AvatarPercentageComponent, NgIf] +}) +export class SantPostComponent implements OnInit { + @Input() post: SantActivityList; + userData: UserData; + + constructor( + private navCtrl: NavController, + private utilityService: UtilityService, + private stateManagementService: StateManagementService, + ) { } + + async ngOnInit() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + santProfile(id: number) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.santViewProfile, { santId: id }]); + } + + openReport(id) { + this.utilityService.openReport({ postId: id, type: 'sant' }); + } + + hidePost(post) { + this.utilityService.hidePost(post); + } + + redirectToUser(id) { + if (id === this.userData.id) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + } + +} diff --git a/src/app/directives/gj-datetime.directive.ts b/src/app/directives/gj-datetime.directive.ts new file mode 100644 index 0000000..dce5247 --- /dev/null +++ b/src/app/directives/gj-datetime.directive.ts @@ -0,0 +1,25 @@ +import { DOCUMENT } from '@angular/common'; +import { Directive, HostListener, Inject } from '@angular/core'; + +@Directive({ + selector: '[appGjDatetime]', + standalone: true +}) +export class GjDatetimeDirective { + ionDatetime: any; + canOverride = true; + + constructor(@Inject(DOCUMENT) private document: Document) { } + + + @HostListener('click', ['$event.target']) + onClick(el: { shadowRoot: { appendChild: (arg0: HTMLStyleElement) => void } }) { + if (this.canOverride) { + const style = this.document.createElement('style'); + style.innerHTML = ':host(.month-year-picker-open) .datetime-footer { display: block !important; }'; + el.shadowRoot.appendChild(style); + this.canOverride = false; + } + } + +} diff --git a/src/app/enums/api-keys.enum.ts b/src/app/enums/api-keys.enum.ts new file mode 100644 index 0000000..f140a78 --- /dev/null +++ b/src/app/enums/api-keys.enum.ts @@ -0,0 +1,3 @@ +export const apiKeys = { + facebookAppId: '2772955929664973', +}; diff --git a/src/app/enums/api.enum.ts b/src/app/enums/api.enum.ts new file mode 100644 index 0000000..2a438e4 --- /dev/null +++ b/src/app/enums/api.enum.ts @@ -0,0 +1,134 @@ +import { environment } from '@environments/environment'; + +export const api = { + countryCodes: environment.apiUrl + 'countries', + dharmaDetails: environment.apiUrl + 'dharma-detail', + signUp: environment.apiUrl + 'register', + login: environment.apiUrl + 'login', + fbLogin: environment.apiUrl + 'social-login', + emailVerification: environment.apiUrl + 'email-verification', + logout: environment.apiUrl + 'user/logout', + shravakProfile: environment.apiUrl + 'user/user-detail', + viharList: environment.apiUrl + 'vihar', + pastViharList: environment.apiUrl + 'past/vihar-list', + addVihar: environment.apiUrl + 'vihar', + updateVihar: environment.apiUrl + 'vihar', + addSant: environment.apiUrl + 'user/add-sant', + sampradayDetails: environment.apiUrl + 'user/sampraday-list', + globalSearch: environment.apiUrl + 'user/global-search', + shravakPublicProfile: environment.apiUrl + 'user/user-public-profile/{id}', + santList: environment.apiUrl + 'user/sant-list', + thanaSantList: environment.apiUrl + 'thana/sant/list', + chaturmasList: environment.apiUrl + 'chaturmas', + addChaturmas: environment.apiUrl + 'chaturmas', + chaturmasYear: environment.apiUrl + 'chaturmas-year', + postList: environment.apiUrl + 'post', + draftPostList: environment.apiUrl + 'get-draft-post', + postTypeList: environment.apiUrl + 'post-category-list', + createPost: environment.apiUrl + 'post', + updatePost: environment.apiUrl + 'post', + userPostList: environment.apiUrl + 'user/post', + deletePost: environment.apiUrl + 'post', + deleteUserAccount: environment.apiUrl + 'user/delete-account', + connectionRequestSend: environment.apiUrl + 'user/send-request', + connectionRequestStatusUpdate: environment.apiUrl + 'user/accept-request', + connectionRequestList: environment.apiUrl + 'user/request-list', + connectionRequestSentList: environment.apiUrl + 'user/sent-request-list', + friendList: environment.apiUrl + 'user/friend-list', + friendListForFamily: environment.apiUrl + 'user/relationship-user-list', + userFriendList: environment.apiUrl + 'user/friend-list/{id}', + updateShravakProfile: environment.apiUrl + 'user/update-profile', + jaatiList: environment.apiUrl + 'user/jati-detail', + fatherList: environment.apiUrl + 'user/father-list', + motherList: environment.apiUrl + 'user/mother-list', + userList: environment.apiUrl + 'user/user-list', + santInfo: environment.apiUrl + 'user/sant', + inReviewSantInfo: environment.apiUrl + 'user/in-review-sant-detail', + updateSant: environment.apiUrl + 'user/update-sant', + inReviewSant: environment.apiUrl + 'user/in-review/sant', + createdByMeSant: environment.apiUrl + 'user/sant/list', + suggestionSant: environment.apiUrl + 'user/sant-suggestion', + followingSant: environment.apiUrl + 'user/following', + followSant: environment.apiUrl + 'user/sant-follow', + followersOfSantList: environment.apiUrl + 'user/sant/{sant_id}/followers', + addPassiveUser: environment.apiUrl + 'child', + designationList: environment.apiUrl + 'designation', + relationshipList: environment.apiUrl + 'user/relationship-list', + sendRelationshipList: environment.apiUrl + 'user/send-relation-request', + notificationList: environment.apiUrl + 'user/notification-list', + relationshipRequestChange: environment.apiUrl + 'user/accept-relation-request', + deleteNotification: environment.apiUrl + 'user/delete-notification/{id}', + getMotherTongueList: environment.apiUrl + 'user/mother-tongue', + addJaati: environment.apiUrl + 'user/add-jati', + bloodGroupList: environment.apiUrl + 'user/blood-group', + hundredYearsList: environment.apiUrl + 'hundred-chaturmas-years', + deleteQualification: environment.apiUrl + 'user/delete-qualification', + deleteWork: environment.apiUrl + 'user/delete-work', + reviewRequestChaturmas: environment.apiUrl + 'chaturmas/{chaturmas_id}/review', + professionList: environment.apiUrl + 'profession', + likeDislikePost: environment.apiUrl + 'post/like', + santPostList: environment.apiUrl + 'sant/user/post', + addComment: environment.apiUrl + 'post/add-comment', + postDetail: environment.apiUrl + 'post', + commentList: environment.apiUrl + 'post/{post_id}/comments', + addSangh: environment.apiUrl + 'user/add-sangh', + memberCardSangh: environment.apiUrl + 'user/sangh/member-card/create', + sanghSearchList: environment.apiUrl + 'user/sangh-list', + addMemberUserList: environment.apiUrl + 'user/sangh/{id}', + sanghList: environment.apiUrl + 'user/sangh/list', + associatedSanghList: environment.apiUrl + 'user/associated-sangh-list', + sanghPostList: environment.apiUrl + 'sangh/user/post', + sanghProfile: environment.apiUrl + 'user/sangh/{id}', + suggestedSanghList: environment.apiUrl + 'user/sangh-suggestion', + deleteSangh: environment.apiUrl + 'user/delete-sangh/', + followSangh: environment.apiUrl + 'user/sangh-follow', + followedSanghList: environment.apiUrl + 'user/sangh-following', + updateSanghProfile: environment.apiUrl + 'user/update-sangh/{sangh_id}', + followersOfSanghList: environment.apiUrl + 'user/sangh/{sangh_id}/followers', + sangCard: environment.apiUrl + 'user/sangh/{id}/member-card', + addMemberForSangh: environment.apiUrl + 'user/add-sangh-member', + sanghMembersList: environment.apiUrl + 'user/sangh/{sangh_id}/get-sangh-members', + sanghCommitteeMembersList: environment.apiUrl + 'user/sangh/{sangh_id}/get-sangh-committee-members', + memberListForAddInSangh: environment.apiUrl + 'user/user-list-sangh', + updateCommitteeMember: environment.apiUrl + 'user/update-sangh-member', + deleteMember: environment.apiUrl + 'user/delete-sangh-member', + messageThread: environment.apiUrl + 'user/message-thread-list', + messageList: environment.apiUrl + 'user/message-list', + sendMessage: environment.apiUrl + 'user/send-message', + clearMessage: environment.apiUrl + 'user/clear-message', + deleteMessageThread: environment.apiUrl + 'user/delete-thread', + acceptDeclineSanghRequest: environment.apiUrl + 'user/accept-sangh-request', + unRegisterPushToken: environment.apiUrl + 'user/delete-device-token', + registerPushToken: environment.apiUrl + 'user/store-device-token', + getSanghInvitationsList: environment.apiUrl + 'user/get-invited-members', + getPrivacyValue: environment.apiUrl + 'user/informative-page', + addThana: environment.apiUrl + 'thana', + santThanaList: environment.apiUrl + 'thana/thana-member', + deleteThana: environment.apiUrl + 'thana/delete-member', + makeLeader: environment.apiUrl + 'thana/make-leader', + santActivityList: environment.apiUrl + 'user/sant/feeds', + deleteExistingToken: environment.apiUrl + 'user/delete-existing-token', + deleteChild: environment.apiUrl + 'child/{id}', + userExistNumber: environment.apiUrl + 'user/exist', + editFamilyRelation: environment.apiUrl + 'user/update-relation-request/{id}', + globalSearchShravak: environment.apiUrl + 'user/global/user-list', + globalSearchSant: environment.apiUrl + 'user/global/sant-list', + globalSearchSangh: environment.apiUrl + 'user/global/sangh-list', + suggestionShravakList: environment.apiUrl + 'user/user-suggestion', + getUserSanghList: environment.apiUrl + 'user/get-user-sangh', + inReviewUserSanghList: environment.apiUrl + 'user/in-review/sangh', + myFriendList: environment.apiUrl + 'user/my-friend-list', + myConnectionRequestList: environment.apiUrl + 'user/my-request-list', + myConnectionRequestSentList: environment.apiUrl + 'user/my-sent-request-list', + deleteVihaar: environment.apiUrl + 'vihar/{id}', + flagReport: environment.apiUrl + 'user/report', + blockThisUser: environment.apiUrl + 'user/block', + getBlockedUsers: environment.apiUrl + 'user/blocked-profile', + hideThisPost: environment.apiUrl + 'user/hide-post', + unreadCounts: environment.apiUrl + 'user/unread-counts', + updateSantLocation: environment.apiUrl + 'user/update-sant-location', + hospitalList: environment.apiUrl + 'hospitals', + certificate: environment.apiUrl + 'hospital/certificate/generate', + certificateDetail: environment.apiUrl + 'hospital/certificate/details', + commonDropdown: environment.apiUrl + 'common/dropdown' +}; diff --git a/src/app/enums/constants.enum.ts b/src/app/enums/constants.enum.ts new file mode 100644 index 0000000..7545ac5 --- /dev/null +++ b/src/app/enums/constants.enum.ts @@ -0,0 +1,113 @@ +export const constants = { + privacy: [ + { + name: 'Public', + value: 1 + }, + { + name: 'Connections', + value: 2 + }, + { + name: 'Only me', + value: 3 + } + ], + postPrivacy: [ + { + name: 'Public', + value: 1 + }, + { + name: 'Connections', + value: 2 + }, + ], + postPrivacySangh: [ + { + name: 'Public', + value: 1 + }, + { + name: 'Members', + value: 2 + }, + ], + reportSubjects: [ + { + text: 'Off-topic', + value: 'Off-topic' + }, + { + text: 'Inappropriate', + value: 'Inappropriate' + }, + { + text: 'Spam', + value: 'Spam' + }, + { + text: 'Others', + value: 'Others' + } + ], + sanghTypes: [ + { + text: 'Sthanak', + value: 1 + }, + { + text: 'Derasar', + value: 2 + } + ], + + confirmOptions: [ + { + text: 'Yes', + value: 1 + }, + { + text: 'No', + value: 0 + }, + ], + + templeType: [ + { + text: 'Shikhar Mandir', + value: 0 + }, + { + text: 'Without Shikhar', + value: 1 + }, + { + text: 'Ghar', + value: 2 + }, + ], + + medicalReason: [ + 'Health check-up packages', + 'Diagnostic tests on OPD basis', + 'Hospital Inpatient Service' + ], + inviteLink: 'https://gjain.app.link/user/invitation', + youtubeLink: 'https://www.youtube.com/@globaljain9248', + contributionLink: 'https://globaljain.net/contribution', + privacyPolicy: 'https://globaljain.net/privacy-policy', + termsAndConditions: 'https://globaljain.net/terms-and-conditions' +}; + +export enum CertificateStep { + home, + info, + description +} + +export enum CertificateStatus { + pending, + success, + reject +} \ No newline at end of file diff --git a/src/app/enums/gjain-storage.enum.ts b/src/app/enums/gjain-storage.enum.ts new file mode 100644 index 0000000..b1e947d --- /dev/null +++ b/src/app/enums/gjain-storage.enum.ts @@ -0,0 +1,11 @@ +export enum GJainStorage { + token = 'GlobalJainToken', + loginType = 'GlobalJainLoginType', + userData = 'GlobalJainUserData', + pushToken = 'GlobalJainPushToken', + deviceUUID = 'GlobalJainDeviceUUID', + introScreen = 'GlobalJainIntroStatus', + profileData = 'GlobalJainProfileData', + yearsList = 'GlobalJainYearsData', + otherUserDetail = 'GlobalJainOtherUserData', +} diff --git a/src/app/enums/root.enum.ts b/src/app/enums/root.enum.ts new file mode 100644 index 0000000..b37bfe3 --- /dev/null +++ b/src/app/enums/root.enum.ts @@ -0,0 +1,83 @@ +export enum Roots { + page = 'page', + intro = 'intro', + auth = 'auth', + home = 'home', + login = 'login', + register = 'signup', + otp = 'otp', + createdAccount = 'create-account', + settings = 'settings', + menu = 'menu', + santInfo = 'sant-information', + aboutDiksha = 'about-diksha', + aboutSansarikJeevan = 'about-sansarik-jeevan', + santProfileImage = 'sant-profile-image', + santViewProfile = 'sant-view-profile/:santId', + santBio = 'sant-bio/:santId', + viharInfo = 'vihar-info/:santId', + chaturmasInfo = 'chaturmas-info/:santId', + shravakViewProfile = 'shravak-view-profile', + shravakFeeds = 'shravak-feeds', + sanghFeeds = 'sangh-feeds', + shravakAbout = 'shravak-about', + createNewSant = 'create-new-sant', + shravakOtherProfile = 'shravak-other-profile/:id', + passiveUserInformation = 'passive-user-information', + passiveUserEducation = 'passive-user-education', + passiveUserProfileImage = 'passive-user-profile-image', + shravakEditProfile = 'shravak-edit-profile', + postFeed = 'post-feed', + postType = 'post-type', + globalSearch = 'global-search', + shravakEditLocation = 'shravak-edit-location', + shravakEditContactInfo = 'shravak-edit-contact-info', + shravakEditFamilyMembers = 'shravak-edit-family-members', + shravakEditWork = 'shravak-edit-work', + shravakEditEducation = 'shravak-edit-education', + shravakAboutOther = 'shravak-other-about', + message = 'message', + messageChat = 'message-chat', + notification = 'notification', + friendRequest = 'friend-request', + viharModal = 'vihar-modal', + viewAll = 'view-all/:santListType', + sanghTermPolicy = 'sangh-term-policy', + sanghInformation = 'sangh-information', + sanghAddress = 'sangh-address', + sanghFacilities = 'sangh-facilities', + sanghDonation = 'sangh-donation', + sanghProfileImage = 'sangh-profile-image', + chaturmasVihar = 'chaturmas-vihar/:sanghId', + inviteMembers = 'invite-members', + sanghProfile = 'sangh-profile/:sanghId', + sanghMemberCard = 'sangh-member-card/:sanghId', + sanghOtherProfile = 'sangh-other-profile', + sanghMembersAdminView = 'sangh-members-admin-view', + sanghSearchMember = 'sangh-search-member', + sanghRoleSelect = 'sangh-role-select', + sanghEditProfile = 'sangh-edit-profile', + addChild = 'passive-user-information', + addLocation = 'add-location', + taggedUsers = 'tagged-user', + searchSant = 'search-sant', + postDetail = 'post-detail', + postDetailURL = 'post-detail/:postId', + createNewSangh = 'create-new-sangh', + addChaturmas = 'add-chaturmas', + viewAllSangh = 'view-all-sangh/:sanghListType', + addCommitteeMember = 'add-committee-member', + invitations = 'invitations', + aboutSangh = 'about-sangh', + visibilityPolicy = 'visibility-policy', + termsPolicy = 'terms-policy', + thanaList = 'thana-list/:santId', + addThana = 'add-thana', + friendList = 'friend-list', + friendsSuggestionsViewAll = 'friends-suggestions-view-all', + searchFriend = 'search-friend', + imageView = 'image-view', + blockedUsers = 'blocked-users', + selectSangh = 'select-sangh', + certificate = 'certificate' +} diff --git a/src/app/guards/auth.guard.ts b/src/app/guards/auth.guard.ts new file mode 100644 index 0000000..1292c24 --- /dev/null +++ b/src/app/guards/auth.guard.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; + +import { Roots } from '@enums/root.enum'; +import { NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard { + + constructor( + private navController: NavController, + private stateManagementService: StateManagementService + ) { } + + async canActivate(): Promise { + const token = await this.stateManagementService.token; + if (!token) { + this.navController.navigateRoot(Roots.auth + '/' + Roots.login); + return false; + } + return true; + } +} diff --git a/src/app/guards/guest.guard.ts b/src/app/guards/guest.guard.ts new file mode 100644 index 0000000..cc9843e --- /dev/null +++ b/src/app/guards/guest.guard.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; + +import { Roots } from '@enums/root.enum'; +import { NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; + +@Injectable({ + providedIn: 'root' +}) +export class GuestGuard { + + constructor( + private navController: NavController, + private stateManagementService: StateManagementService + ) { } + + async canActivate(): Promise { + const token = await this.stateManagementService.token; + if (token) { + this.navController.navigateRoot(Roots.page); + return false; + } + return true; + } +} diff --git a/src/app/guards/intro.guard.ts b/src/app/guards/intro.guard.ts new file mode 100644 index 0000000..cc9b52e --- /dev/null +++ b/src/app/guards/intro.guard.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; + +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; + +@Injectable({ + providedIn: 'root' +}) +export class IntroGuard { + + constructor( + private navController: NavController, + private stateManagementService: StateManagementService + ) { } + + async canActivate(): Promise { + const introScreen = await this.stateManagementService.storage.get(GJainStorage.introScreen); + if (introScreen) { + this.navController.navigateRoot(Roots.auth + '/' + Roots.login); + return false; + } + return true; + } +} diff --git a/src/app/interceptors/auto-logout.interceptor.ts b/src/app/interceptors/auto-logout.interceptor.ts new file mode 100644 index 0000000..9f56d80 --- /dev/null +++ b/src/app/interceptors/auto-logout.interceptor.ts @@ -0,0 +1,50 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { StateManagementService } from '@services/state-management.service'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class AutoLogoutInterceptorService implements HttpInterceptor { + + constructor( + private navController: NavController, + public alert: AlertService, + private stateManagementService: StateManagementService, + ) { } + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe( + catchError((err) => { + console.log(err); + if (err && err.status === 401) { + this.stateManagementService.token = ''; + this.stateManagementService.storage.remove(GJainStorage.loginType); + this.stateManagementService.storage.remove(GJainStorage.profileData); + this.stateManagementService.storage.remove(GJainStorage.userData).then(() => { + this.navController.navigateRoot(Roots.auth + '/' + Roots.login); + }); + } + + if (err.status === 0) { + this.alert.showToasterError('Please check internet connectivity'); + } + else if (err.status === 500) { + this.alert.showToasterError('Internal server error'); + } + else { + if (!request.url.includes('?t=1')) { + this.alert.showToasterError(err.error.message || err.message); + } + } + console.log({ err }); + return throwError(err); + }) + ); + } +} diff --git a/src/app/interceptors/token.interceptor.ts b/src/app/interceptors/token.interceptor.ts new file mode 100644 index 0000000..bd210ef --- /dev/null +++ b/src/app/interceptors/token.interceptor.ts @@ -0,0 +1,33 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { StateManagementService } from '@services/state-management.service'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class TokenInterceptorService implements HttpInterceptor { + + constructor( + private stateManagementService: StateManagementService + ) { } + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(this.injectToken(request)); + } + + injectToken(request: HttpRequest) { + const token = this.stateManagementService.token; + if (token) { + const apiDomain = new RegExp('https://www.googleapis.com'); + if (apiDomain.test(request.url) === false) { + request = request.clone({ + setHeaders: { + Authorization: `Bearer ${token}` // 'Bearer ' keyword already added from server + } + }); + } + } + return request; + } +} diff --git a/src/app/interfaces/common.ts b/src/app/interfaces/common.ts new file mode 100644 index 0000000..999f40c --- /dev/null +++ b/src/app/interfaces/common.ts @@ -0,0 +1,1071 @@ +export interface VerifyLoginResponse { + token?: string; + user?: UserData; + status?: number; + message?: string; + success?: boolean; +} + +export interface ProfileResponse { + data: ProfileData; + status: number; + message?: string; +} + +export interface CommonResponse { + status?: number; + message?: string; + success?: boolean; + data?: any; +} + +export interface ProfileData { + id: number; + uuid: string; + name: string; + name_privacy?: number | string; + email: string; + email_privacy: number | string; + username: string; + country_code: string; + mobile: string; + mobile_privacy: number | string; + dharma_id: number; + dharma_name: string; + dharma_privacy: number | string; + birth_date: string; + birth_date_privacy: number | string; + gender_id: number; + gender: string; + gender_privacy: number | string; + email_verified_at: string; + mobile_verified_at: string; + avatar: any; + avatar_privacy: number | string; + verification_confirmed: number; + status: number; + timezone: string; + last_login_at: Date; + last_login_ip: string; + created_at: Date; + updated_at: Date; + deleted_at: Date; + jati_id: number; + jati_name: string; + jati_privacy: number | string; + location: string; + location_privacy: number | string; + longitude: string; + latitude: string; + native_place: string; + native_place_privacy: number | string; + native_longitude: string; + native_latitude: string; + mother_tongue_id: number; + mother_tongue: string; + mother_tongue_privacy: number | string; + marital_status: string; + marital_status_privacy: number | string; + marriage_anniversary: string; + marriage_anniversary_privacy: number | string; + family_members: FamilyMember[]; + company_details: CompanyDetails[]; + qualificaion_details: QualificationDetails; + profile_statistics?: { + basic_info: number; + contact_info: number; + location: number; + profile_completion_percentage: number; + qualification: number; + total_filled: number; + work: number; + }; + karma_dhan: number; + friend_count: number; + sangh_member_count: number; + share_content: string; + request_status?: number; + passive_users: PassiveUser[]; + profession: string; + profession_privacy: number; + blood_group?: string; + blood_group_id?: number; + blood_group_privacy?: number; + is_blocked?: number; + is_profile_completed?: number; +} + +export interface FamilyMember { + id: number; + from_id: number; + to_id: number; + relation: string; + relation_id: number; + status: number; + relation_privacy: number | string; + created_at: Date; + updated_at: Date; + relationships: Relationships; + sent_users: SentUsers; +} + +export interface Relationships { + id: number; + name: string; + status: number; + created_at: Date; + updated_at: Date; +} + +export interface SentUsers { + id: number; + uuid: string; + name: string; + email: string; + email_hash: null; + username: string; + country_code: null; + mobile: null; + dharma_id: number; + birth_date: Date; + gender: null; + email_verified_at: null; + mobile_verified_at: null; + avatar: string; + school_name: string; + about: string; + relationship: number; + is_passive: number; + parent_id: number; + verification_confirmed: number; + status: number; + mobile_privacy: number; + email_privacy: number; + avatar_privacy: number; + birth_date_privacy: number; + gender_privacy: number; + dharma_privacy: number; + timezone: null; + last_login_at: null; + last_login_ip: null; + created_at: Date; + updated_at: Date; + deleted_at: null; +} + +export interface PassiveUser { + id: number; + name: string; + parent_id: number; + is_passive: number; + relationship: number; + about: string; + school_name: string; + avatar: string; + birth_date: Date; +} + +export interface QualificationDetails { + schools: College[]; + colleges: College[]; +} + +export interface College { + id: number; + user_id: number; + qualification: null | string; + university: null | string; + highschool: null | string; + is_graduate: number; + is_pursuing: number; + passing_year: string; + starting_year: null | string; + start_date: Date; + end_date: Date; + created_at: Date; + updated_at: Date; + privacy: number; + type: number; +} + +export interface CompanyDetails { + id: number; + user_id: number; + company_name: string; + company_name_privacy: number; + profession_id: null; + profession: null; + profession_speciality: null; + position: null; + city: null; + city_privacy: number; + position_privacy: number; + profession_speciality_privacy: number; + profession_privacy: number; + website: string; + website_privacy: number; + about: null; + about_privacy: number; + is_working: null; + work_duration_privacy: number; + start_year: string; + end_year: string; + created_at: Date; + updated_at: Date; +} + + +export interface SignupResponse { + user?: UserData; + message?: string; +} + +export interface Countries { + countries: Country[]; +} + +export interface Country { + id: number; + iso: string; + name: string; + iso3: string; + num_code: string; + phone_code: string; + created_at: Date; + updated_at: Date; + num_length: string; +} + +export interface UserData { + id?: number; + name?: string; + email?: string; + country_code?: string; + mobile?: string; + email_preview?: string; + avatar_url?: string; + avatar?: string; + is_profile_verified: string; + login_type?: number; + type?: number; +} + +export interface Jaati { + id: number; + name: string; + status: number; + created_by: number; + updated_by: Date; + created_at: Date; + updated_at: Date; +} + +export interface MTongue { + id: number; + name: string; + status: number; + created_at: Date; + updated_at: Date; +} + +export interface Sampraday { + id: number; + name: string; + status: number; + created_by: number; + updated_by: number; + created_at: string; + updated_at: string; +} + +export interface BloodGroup { + id: number; + name: string; + status: number; + created_at: Date; + updated_at: Date; +} + +export interface addSant { + name?: string; + father_name?: string; + mother_name?: string; + avatar?: any; + honor?: string[]; + qualification?: string; + dharma_id?: number; + sampraday_id?: number; + birth_date?: string; + diksha_date?: string; + diksha_place?: string; + about?: string; + gender?: string; + guru?: string; + father_id?: string; + father_type?: string; + mother_id?: string; + mother_type?: string; + guru_id?: string; +} + +export interface addPassiveUser { + id?: any; + name?: string; + birth_date?: string; + gender?: string; + relationship?: string; + school_name?: string; + aboutUser?: string; + avatar?: any; +} + +export interface viharInfo { + to_sangh_id: number; + from_sangh_id: number; + viharFromPlace: string; + viharToPlace: string; + startDate: string; + endDate: string; + startTime: string; + isUpdate: boolean; + viharId?: string; + santId: string; + thanaMemberCount: string; + from_latitude?: string; + from_longitude?: string; + to_latitude?: string; + to_longitude?: string; + sant?: any; + date?: string; + end_date?: string; + start_date?: string; +} +export interface reviewedFields { + guru: boolean; + name: boolean; + about: boolean; + avatar: boolean; + dharma: boolean; + gender: boolean; + sampraday: boolean; + birth_date: boolean; + diksha_date: boolean; + father_name: boolean; + mother_name: boolean; + diksha_place: boolean; +} + + +export interface GlobalSearchDataShravak { + id: number; + uuid: string; + name: string; + email: null | string; + email_hash: null; + username: string; + country_code: string; + mobile: string; + dharma_id: number; + birth_date: Date; + gender: number; + email_verified_at: null; + mobile_verified_at: null; + avatar: string; + school_name: null; + about: null; + relationship: number; + is_passive: number; + parent_id: number; + verification_confirmed: number; + status: number; + mobile_privacy: number; + email_privacy: number; + avatar_privacy: number; + birth_date_privacy: number; + gender_privacy: number; + dharma_privacy: number; + karma_dhan: number; + timezone: null; + last_login_at: null; + last_login_ip: null; + profile_statistics: null; + created_at: Date; + updated_at: Date; + deleted_at: null; + unread_message_count: number; + unread_notification_count: number; + is_working: boolean; + is_friends: number; + hide_mobile: string; + is_user_friends: number; + dharma: Dharma; +} + +export interface GlobalSearchDataSangh { + id: number; + user_id: number | null; + name: string; + dharma_id: number; + sampraday_id: number; + reg_number: string; + reg_date: Date; + address: string; + city: string; + pincode: number; + longitude: string; + latitude: string; + about: null | string; + avatar: string; + created_by: number; + updated_by: number; + created_at: Date; + updated_at: Date; + is_user_following: boolean; + is_member: number; + is_requested: boolean; + dharma: Dharma; + sampraday: Sampraday; + sangh_member_status: number; +} + +export interface GlobalSearchDataSant { + id: number; + user_id: number; + name: string; + father_name: null | string; + mother_name: null | string; + guru_name: null; + gender: number | null; + avatar: string; + honor: string[]; + qualification: null; + dharma_id: number; + sampraday_id: number | null; + guru_id: number | null; + birth_date: Date | null; + diksha_date: Date | null; + diksha_place: null | string; + about: null | string; + status: number; + verification_status: number; + reviewed_fields: any[] | { [key: string]: boolean }; + description: null | string; + profile_verified_at: Date | null; + created_by: number; + updated_by: number | null; + created_at: Date; + updated_at: Date; + deleted_at: null; + current_thana_id: null; + age: number; + diksha_year: number; + is_user_following: boolean; + is_approved: number; + is_in_review: number; + dharm: Dharma; + sampraday: Sampraday | null; + profile_statistics?: { + basic_info: number; + contact_info: number; + location: number; + profile_completion_percentage: number; + qualification: number; + total_filled: number; + work: number; + }; +} + +export interface Dharma { + id: number; + name: string; + created_at?: string; + updated_at?: string; + deleted_at?: string; +} + +export interface Privacy { + name: string; + value: number | string; +} + +export interface RequestUserList { + id: number; + sender_id: number; + receiver_id: number; + status: number; + created_at: Date; + updated_at: Date; + deleted_at: null; + received_users?: RequestUserData; + sent_users?: RequestUserData; +} + +export interface RequestUserData { + id: number; + uuid: string; + name: string; + email: string; + email_hash: string; + username: string; + country_code: null; + mobile: null; + dharma_id: number; + birth_date: Date; + gender: null; + email_verified_at: null; + mobile_verified_at: null; + avatar: null; + verification_confirmed: number; + status: number; + timezone: null; + last_login_at: null; + last_login_ip: null; + created_at: Date; + updated_at: Date; + deleted_at: null; +} + +export interface PostList { + id: number; + user_id: number; + category_id: number; + privacy: number; + status: number; + description: string; + created_by: Category; + updated_by: Category; + location: string; + created_at: Date; + updated_at: Date; + is_liked: boolean; + likes_count: number; + comments_count: number; + tag_users: TagUser[]; + post_images: PostImage[]; + category: Category; + created_ago: string; + type: number; + type_id: number; + sangh_details?: any; + showMore?: boolean; + post_type?: string; + lat?: string; + long?: string; + subject?: { + id: string | number; + }; + hide?: boolean; + mentions: Array<{ + id: number; + name: string; + type: 'user' | 'sangh' | 'sant'; + }>; +} + +export interface SantActivityList { + id: number; + log_name: string; + description: string; + subject_type: string; + subject_id: number; + causer_type: string; + causer_id: number; + properties: Properties; + created_at: Date; + updated_at: Date; + causer: Causer; + subject: Subject; + created_ago?: string; + updated_ago?: string; + hide?: boolean; +} + +export interface Causer { + id: number; + name: string; + avatar: string; + is_friends: number; +} + +export interface Properties { + attributes: Attributes; +} + +export interface Attributes { + message: string; + sant_id: string; + chaturmas_information: ChaturmasInformation; +} + +export interface ChaturmasInformation { + id: number; + place: string; + sangh: null; + sant_id: string; + sangh_id: null; + created_at: Date; + created_by: CreatedBy; + updated_at: Date; + updated_by: null; + created_ago: string; + is_approved: number; + updated_ago: string; + chaturmas_info: ChaturmasInfo; + chaturmas_date_id: number; +} + +export interface ChaturmasInfo { + id: number; + to: Date; + from: Date; + year: number; + created_at: Date; + created_by: number; + updated_at: Date; + updated_by: null; + sant: any; +} + +export interface CreatedBy { + id: number; + name: string; + mobile: string; + is_friends: number; + country_code: string; +} + +export interface Subject { + id: number; + name: string; + avatar: string; + age: number; + diksha_year: number; + is_user_following: boolean; + profile_statistics?: { + basic_info: number; + contact_info: number; + location: number; + profile_completion_percentage: number; + qualification: number; + total_filled: number; + work: number; + }; +} + +export interface CommentList { + id: number; + post_id: number; + user_id: number; + reply_id: null; + comment: string; + created_at: Date; + updated_at: Date; + is_edited: boolean; + created_ago: string; + user: User; + showMore?: boolean; +} + +export interface User { + id: number; + avatar: string; + name: string; + is_friends: number; +} + +export interface Category { + id: number; + parent_id?: number; + name: string; + created_at: Date; + updated_at: Date; + avatar?: string; +} + +export interface PostImage { + id: number; + post_id: number; + image_name: string; + created_at: Date; + updated_at: Date; +} + +export interface TagUser { + id: number; + name: string; + avatar: string; + pivot: Pivot; +} + +export interface Pivot { + post_id: number; + user_id: number; + created_at: Date; + updated_at: Date; +} + + +export interface DesignationList { + id: number; + name: string; + created_by: null; + updated_by: null; + created_at: Date; + updated_at: Date; +} + +export interface ProfessionList { + id: number; + name: string; + created_by: null; + updated_by: null; + created_at: Date; + updated_at: Date; +} + +export interface FriendList { + id: number; + name: string; + avatar: string; + is_friend_request_sent: boolean; + pivot: Pivot; + user_detail: UserFriendDetail[]; +} + +export interface Pivot { + sender_id: number; + receiver_id: number; + created_at: Date; + updated_at: Date; + status: number; +} + +export interface UserFriendDetail { + id: number; + user_id: number; + jati_id: number; + profession: string; + profession_speciality: string; + location: null; + longitude: null; + latitude: null; + native_place: null; + native_longitude: null; + native_latitude: null; + mother_tongue: null; + marital_status: null; + marriage_anniversary: null; + qualification: null; + company_name: null; + mother_tongue_privacy: number; + jati_privacy: number; + marital_status_privacy: number; + marriage_anniversary_privacy: number; + location_privacy: number; + native_place_privacy: number; + qualification_privacy: number; + profession_privacy: number; + company_name_privacy: number; + profession_speciality_privacy: number; + created_at: Date; + updated_at: Date; + deleted_at: null; +} + +export interface NotificationResponse { + current_page: number; + last_page: number; + per_page: number; + next_page_url: null; + last_page_url: string; + total: number; + count: number; + prev_page_url: null; + hasMorePages: boolean; + data: Notification; + status: number; +} + +export interface Notification { + current_page: number; + data: NotificationList[]; + first_page_url: string; + from: number; + last_page: number; + last_page_url: string; + links: Link[]; + next_page_url: null; + path: string; + per_page: number; + prev_page_url: null; + to: number; + total: number; +} + +export interface NotificationList { + id: number; + user_id: number; + title: string; + type: string; + message: string; + extra_fields: ExtraFields; + status: string; + created_at: string; + updated_at: Date; + sant: any; + user: any; +} + +export interface ExtraFields { + name: string; + avatar: string; + from_id: number; + created_at: string; + relation_id: number; + relation_request_status: number; + notification_type?: number; + user_type?: string; + user_id?: number; + role?: string; +} + +export interface Link { + url: null | string; + label: string; + active: boolean; +} + +export interface SanghData { + id: number; + sangh_type: string; + user_id: number; + name: string; + dharma_id: number; + sampraday_id: number; + reg_number: string; + reg_date: string; + address: string; + city: string; + pincode: number; + longitude: string; + latitude: string; + about: string; + avatar: string; + created_by: number; + updated_by: number; + created_at: string; + updated_at: string; + is_user_following?: boolean; + is_requested?: boolean; + is_member: number; + sangh_member_status: number; +} + +export interface SanghProfileData { + id: number; + sangh_type: number; + user_id: number; + name: string; + dharma_id: number; + sampraday_id: number; + reg_number: string; + reg_date: Date; + address: string; + city: string; + pincode: number; + longitude: string; + latitude: string; + about: string; + avatar: string; + created_by: CreatedByUser; + updated_by: number; + created_at: Date; + updated_at: Date; + followers_count: number; + sangh_members_count: number; + followers: any[]; + dharma: Dharma; + sampraday: Dharma; + is_member: number; + is_user_following?: boolean; + is_requested?: boolean; + karma_points: number; + sangh_member_status: number; + state: string; + number_of_members: number; + apartment_name: string; + email: string; + mobile_number: string; + sangh_website: string; + bank_qr_code: string; + bank_account_number: string; + bank_ifsc: string; + bank_account_holder_name: string; + bank_branch: string; + bank_upi_id: string; + no_of_students: number; + aaradhana_bhavan_status: number; + pathshala_status: number; + number_of_books: number; + bhojanshala_status: number; + mulnayak_bhagwan_name: number; + sangh_status: number; + tifin_service_status: number; + librarian_mobile_number: string; + librarian_name: string; + library_name: string; + library_status: number + mahila_mandal_status: number + yuva_mandal_status: number + derasar_type: number; + swapna_chadawa_organised_status: number; + aayambilshala_status: number; + type_of_template: number; + chaturmas: ChaturmasInfo[]; + vihar?: viharInfo[]; + reject_reason: string; +} + +export interface CreatedByUser { + id: number; + name: string; + avatar: string; + is_friends: number; +} + +export interface Message { + id: number; + user_id: number | string; + avatar: string; + avatar_url: string; + name: string; + created_at: string; + message: string; + unread_count: number; +} + +export interface GeneralData { + profile_completion_percentage: number; + pending_friend_request: number; + pending_sangh_invitation: number; + pending_sant_action: number; + sangh_menu: number; + sant_menu: number; + shravak_menu: number; + unread_message_count: number; + unread_notification_count: number; +} + +export interface BlockedUser { + id: number; + user_id: number; + blocked_by: number; + created_at: Date; + updated_at: Date; + user: { + id: number; + name: string; + avatar: string; + is_working: boolean; + is_friends: number; + hide_mobile?: any; + is_user_friends: number; + }; +} + +export interface IdName { + id: number; + name: string; +} + + +export class PhotoDetail { + url: string; + size: number; + imageData?: Blob; +} + +export class Photo { + aadharFront = new PhotoDetail(); + aadharBack = new PhotoDetail(); +} + +export interface Hospital { + id: string; + name: string; + contact_name: string; + email: string; + alternative_email: string; + address: string; + city: string; + state: string; + photo: string | null; + benefits: string; + status: number; + created_at: string; + updated_at: string; + area: string; +} + +export interface CertificateDetail { + id: string; + user_id: number; + hospital_id: string; + full_name: string; + address: string; + email: string; + medical_problem: string; + aadhar_card_number: string; + profile_photo: string; + aadhar_card_front_photo: string; + aadhar_card_back_photo: string; + status: number; + rejection_reason: string | null; + generated_date: string | null; + pdf_url: string | null; + created_at: string; + updated_at: string; + expire_date: string; + is_expired: boolean; + hospital: Hospital; +} + + +export interface MemberUserDetail { + id: number; + user_id: number; + location: string; +} + +export interface MemberUserModel { + id: number; + name: string; + is_working: boolean; + is_friends: number; + hide_mobile: string | null; + is_user_friends: number; + is_blocked: number; + user_detail: MemberUserDetail[]; +} + +export interface MemberSangh { + id: number; + name: string; + avatar: string; + city: string; + state: string; + is_user_following: boolean; + is_member: number; + is_requested: boolean; + sangh_member_status: number; +} + +export interface Member { + member_id: string; + sangh_id: number; + user_id: number; + profile_image: string; + role: string | null; + sangh: MemberSangh; + user: MemberUserModel; +} \ No newline at end of file diff --git a/src/app/interfaces/form.ts b/src/app/interfaces/form.ts new file mode 100644 index 0000000..785d4f7 --- /dev/null +++ b/src/app/interfaces/form.ts @@ -0,0 +1,252 @@ +import { FormControl } from '@angular/forms'; +import { Country, Jaati, ProfessionList, Sampraday } from './common'; + +export interface LoginForm { + phoneCode: FormControl; + phoneNumber: FormControl; +} + +export interface SignupForm { + name: FormControl; + countryCode: FormControl; + mobileNumber: FormControl; + dharma: FormControl; +} + +export interface JoinSanghForm { + joinType: FormControl; + roleName: FormControl; +} + +export interface ReportForm { + type: FormControl; + reported_for: FormControl; + subject: FormControl; + description: FormControl; +} + +export interface SanghAddressForm { + address: FormControl; + city: FormControl; + state: FormControl; + email: FormControl; + apartment_name: FormControl; + mobile_number: FormControl; + phoneCode: FormControl; + sangh_website: FormControl; + number_of_members: FormControl; + longitude: FormControl; + latitude: FormControl; + about: FormControl; +} + +export interface SanghInformationForm { + sangh_type: FormControl; + name: FormControl; + dharma_id: FormControl; + sampraday_id: FormControl; + reg_number: FormControl; + reg_date: FormControl; + address: FormControl; + city: FormControl; + pincode: FormControl; + longitude: FormControl; + latitude: FormControl; + about: FormControl; + mulnayak_bhagwan_name?: FormControl; + type_of_template?: FormControl; +} + +export interface SanghFacilitiesForm { + aaradhana_bhavan_status: FormControl; + pathshala_status: FormControl; + no_of_students: FormControl; + library_status: FormControl; + library_name: FormControl; + librarian_name: FormControl; + librarian_mobile_number: FormControl; + phoneCode: FormControl; + number_of_books: FormControl; + tifin_service_status: FormControl; + bhojanshala_status: FormControl; + aayambilshala_status: FormControl; + mahila_mandal_status: FormControl; + yuva_mandal_status: FormControl; + swapna_chadawa_organised_status: FormControl; +} + +export interface SanghDonationForm { + bank_account_number: FormControl; + bank_ifsc: FormControl; + bank_branch: FormControl; + bank_upi_id: FormControl; + bank_qr_code_url: FormControl; + bank_qr_code: FormControl; + bank_account_holder_name: FormControl; +} + +export interface SanghMemberForm { + fullName: FormControl; + address: FormControl; + profile: FormControl; + memberId: FormControl; + profile_url: FormControl; +} + +export interface DikshaInformationForm { + diksha_date: FormControl; + diksha_place: FormControl; + diksha_place_latitude: FormControl; + diksha_place_longitude: FormControl; + guru: FormControl; + guru_id: FormControl; +} + +export interface SansarikJeevanInformationForm { + father_name: FormControl; + father_id: FormControl; + father_type: FormControl; + mother_name: FormControl; + mother_id: FormControl; + mother_type: FormControl; + about: FormControl; +} + +export interface ChaturmasInfoForm { + chaturmasPlace: FormControl; + sanghId: FormControl; + sanghName: FormControl; + chaturmasYear: FormControl; +} + +export interface SantInformationForm { + name: FormControl; + honor: FormControl; + dharma_id: FormControl; + sampraday_id: FormControl; + birth_date: FormControl; + gender: FormControl; +} + +export interface ViharInfoForm { + viharFromPlace: FormControl; + viharToPlace: FormControl; + startDate: FormControl; + startTime: FormControl; +} + +export interface UserEducationForm { + schoolName: FormControl; + aboutUser: FormControl; +} + +export interface UserInformationForm { + fullName: FormControl; + relationship: FormControl; + birthDate: FormControl; +} + +export interface ContactForm { + country_code: FormControl; + mobile: FormControl; + mobile_privacy: FormControl; + email: FormControl; + email_privacy: FormControl; + otp: FormControl; +} + +export interface CollegeForm { + qualification_id: FormControl; + type: FormControl; + university: FormControl; + qualification: FormControl; + is_graduate: FormControl; + passing_year: FormControl; + privacy: FormControl; +} + +export interface HighSchoolForm { + qualification_id: FormControl; + type: FormControl; + highschool: FormControl; + qualification: FormControl; + passing_year: FormControl; + privacy: FormControl; +} + +export interface FamilyForm { + memberName: FormControl; + relation: FormControl; + relationPrivacy: FormControl; +} + +export interface LocationForm { + location: FormControl; + location_privacy: FormControl; + native_place: FormControl; + native_place_privacy: FormControl; +} + +export interface BasicInfoForm { + name: FormControl; + gender: FormControl; + gender_privacy: FormControl; + birth_date: FormControl; + birth_date_privacy: FormControl; + mother_tongue: FormControl; + mother_tongue_privacy: FormControl; + jati: FormControl; + jati_privacy: FormControl; + dharma: FormControl; + dharma_privacy: FormControl; + blood_group: FormControl; + blood_group_privacy: FormControl; + marital_status: FormControl; + marital_status_privacy: FormControl; + marriage_anniversary: FormControl; + marriage_anniversary_privacy: FormControl; +} + +export interface WorkForm { + work_id: FormControl; + company_name: FormControl; + company_name_privacy: FormControl; + profession_id: FormControl; + profession_privacy: FormControl; + profession: FormControl; + profession_speciality: FormControl; + profession_speciality_privacy: FormControl; + position: FormControl; + position_privacy: FormControl; + website: FormControl; + website_privacy: FormControl; + city: FormControl; + city_privacy: FormControl; + about: FormControl; + about_privacy: FormControl; + is_working: FormControl; + work_duration_privacy: FormControl; + start_year: FormControl; + end_year: FormControl; +} + +export interface SantProfileImageForm { + avatar: FormControl; +} + +export interface SanghProfileImageForm { + avatar: FormControl; +} + +export interface CertificateForm { + hospital: FormControl; + fullName: FormControl; + email: FormControl; + address: FormControl; + aadharNumber: FormControl; + medicalDescription: FormControl; +} + +export interface CertificateTermConditionForm { + termCondition: FormControl; +} \ No newline at end of file diff --git a/src/app/pages/auth/auth.routes.ts b/src/app/pages/auth/auth.routes.ts new file mode 100644 index 0000000..285ed41 --- /dev/null +++ b/src/app/pages/auth/auth.routes.ts @@ -0,0 +1,32 @@ +import { Routes } from '@angular/router'; +import { Roots } from '@enums/root.enum'; +import { GuestGuard } from '@guards/guest.guard'; +import { IntroGuard } from '@guards/intro.guard'; + +export const authRoutes: Routes = [ + { + path: '', + redirectTo: Roots.intro, + pathMatch: 'full', + }, + { + path: Roots.intro, + loadComponent: () => import('./intro/intro.page').then(m => m.IntroPage), + canActivate: [IntroGuard] + }, + { + path: Roots.login, + loadComponent: () => import('./login/login.page').then(m => m.LoginPage), + canActivate: [GuestGuard] + }, + { + path: Roots.register, + loadComponent: () => import('./signup/signup.page').then(m => m.SignupPage), + canActivate: [GuestGuard] + }, + { + path: Roots.otp, + loadComponent: () => import('./otp/otp.page').then(m => m.OtpPage), + canActivate: [GuestGuard] + }, +]; diff --git a/src/app/pages/auth/intro/intro.page.html b/src/app/pages/auth/intro/intro.page.html new file mode 100644 index 0000000..fcdbe0d --- /dev/null +++ b/src/app/pages/auth/intro/intro.page.html @@ -0,0 +1,52 @@ + + + +
+ + +

+ WORLD'S FIRST and LARGEST Religious Social Networking Platform FOR + JAINS +

+
+
+ + + +
+ + +
+

CONNECTING

+
+
 
+
+ sant +
+
 
+
+
+
 
+
+ Sangh +
+
 
+
+
+
 
+
+ Shravak +
+
 
+
+
+
+
+ + + + + +
+
diff --git a/src/app/pages/auth/intro/intro.page.scss b/src/app/pages/auth/intro/intro.page.scss new file mode 100644 index 0000000..ee0dbd8 --- /dev/null +++ b/src/app/pages/auth/intro/intro.page.scss @@ -0,0 +1,105 @@ +ion-content { + --background: none; + + swiper-container { + height: 95vh; + + swiper-slide { + .slide { + height: 100%; + width: 100%; + flex-direction: column; + overflow: hidden; + + p { + font-size: var(--ion-font-size-18); + letter-spacing: 0; + font-weight: 600; + + span { + font-size: var(--ion-font-size-24); + font-weight: 700; + + &:first-child { + color: var(--ion-color); + } + + &:nth-child(2) { + color: var(--ion-color-sant); + } + + &:last-child { + color: var(--ion-color-sangh); + } + } + } + + .connecting-slide { + p { + margin-top: var(--ion-margin-0); + } + + .btn-box { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) -15px; + + .btn-design { + background: var(--ion-background-gray-medium); + width: 200px; + height: 38px; + border-radius: 50px; + margin-right: var(--ion-margin-15); + font-size: var(--ion-font-size-20); + font-weight: 600; + + &.sant { + background: var(--ion-background-content-sant); + color: var(--ion-color-sant); + } + + &.sangh { + background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + } + + &.shravak { + background: var(--ion-background-button); + color: var(--ion-color); + } + + img { + margin-right: var(--ion-margin-10); + } + } + + &:nth-child(3) { + margin-left: 30px; + } + } + } + + .center-img { + width: 75%; + margin: 7vh 0; + } + } + + .last-slide-spinner { + height: 100%; + } + } + + &::part(bullet) { + width: 48px; + height: 4px; + border-radius: 0; + } + + &::part(bullet-active) { + background-color: var(--ion-color); + width: 48px; + height: 4px; + border-radius: 0; + } + + } +} \ No newline at end of file diff --git a/src/app/pages/auth/intro/intro.page.ts b/src/app/pages/auth/intro/intro.page.ts new file mode 100644 index 0000000..40ff063 --- /dev/null +++ b/src/app/pages/auth/intro/intro.page.ts @@ -0,0 +1,45 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Component, ElementRef, NgZone, ViewChild, ViewEncapsulation } from '@angular/core'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { register } from 'swiper/element/bundle'; + +register(); +@Component({ + selector: 'app-intro', + templateUrl: './intro.page.html', + styleUrls: ['./intro.page.scss'], + encapsulation: ViewEncapsulation.None, + standalone: true, + imports: [IonicModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class IntroPage { + @ViewChild('swiper') swiper: ElementRef | undefined; + activeIndex = Number(0); + + constructor( + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private ngZone: NgZone + ) { } + + setSwiperInstance(swiper: any) { + this.swiper = swiper; + } + + slideChange() { + this.activeIndex = this.swiper?.nativeElement.swiper.activeIndex; + } + + goToNextSlide() { + if (this.swiper?.nativeElement.swiper.activeIndex === 2) { + this.ngZone.run(() => { + this.stateManagementService.storage.set(GJainStorage.introScreen, 1); + this.navCtrl.navigateForward(Roots.auth + '/' + Roots.register); + }); + } + } + +} diff --git a/src/app/pages/auth/login/login.page.html b/src/app/pages/auth/login/login.page.html new file mode 100644 index 0000000..4ee7c6c --- /dev/null +++ b/src/app/pages/auth/login/login.page.html @@ -0,0 +1,39 @@ + + + + Welcome to + + + + + +

Sign in

+
+ +
+ +
+
+ + + +
+ + * Mobile number is required. + + + * Please enter {{ numLength }} digit mobile number. + +
+
+ +
+

Don't have an account? Create + account

+
diff --git a/src/app/pages/auth/login/login.page.scss b/src/app/pages/auth/login/login.page.scss new file mode 100644 index 0000000..c0d17c5 --- /dev/null +++ b/src/app/pages/auth/login/login.page.scss @@ -0,0 +1,23 @@ +@import "./../../../../assets/scss/css/form.scss"; + +ion-card { + background: var(--ion-background-card) url(/assets/images/circle-bg.svg) no-repeat bottom 30px center; +} + +p { + &.forgot-btn { + color: var(--ion-color); + } +} + +ion-button { + + &.otp-login { + margin-bottom: var(--ion-margin-20); + + &::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + } + } +} \ No newline at end of file diff --git a/src/app/pages/auth/login/login.page.ts b/src/app/pages/auth/login/login.page.ts new file mode 100644 index 0000000..4aabb5f --- /dev/null +++ b/src/app/pages/auth/login/login.page.ts @@ -0,0 +1,125 @@ +import { NgIf } from '@angular/common'; +import { Component, NgZone, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { Countries, Country, VerifyLoginResponse } from '@interfaces/common'; +import { LoginForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { FirebaseService } from '@services/firebase.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.page.html', + styleUrls: ['./login.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, IonicSelectableComponent] +}) +export class LoginPage implements OnInit { + submitted = Boolean(false); + countryCodes: Array = []; + numLength = 10; + loginForm: FormGroup; + showHideActive = Boolean(false); + + constructor( + private navCtrl: NavController, + private firebaseService: FirebaseService, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private stateManagementService: StateManagementService, + private zone: NgZone + ) { } + + get frm() { + return this.loginForm.controls; + } + + ngOnInit() { + this.loginForm = new FormGroup({ + phoneCode: new FormControl(null, Validators.required), + phoneNumber: new FormControl('', Validators.required), + }); + if (this.stateManagementService.countryDetails.length > 0) { + this.countryCodes = this.stateManagementService.countryDetails; + this.setDefaultCountryCode(); + } else { + this.fetchCountryCodes(); + } + this.loginForm.controls.phoneNumber.setValidators([Validators.required, Validators.pattern('^[0-9]{10}$')]); + } + + setDefaultCountryCode() { + this.countryCodes.forEach((elem) => { + if (elem.iso === 'IN') { + this.loginForm.controls.phoneCode.setValue(elem); + } + }); + } + + fetchCountryCodes() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryCodes = res.countries; + this.stateManagementService.countryDetails = res.countries; + if (this.countryCodes) { + this.setDefaultCountryCode(); + } + }); + } + + async onSubmit(value: any) { + this.submitted = true; + if (this.loginForm.invalid) { + this.loginForm.markAllAsTouched(); + return; + } else { + try { + const codeVal = value.phoneCode.phone_code; + const countryCode = codeVal.replace('(', '').replace(')', ''); + + this.alert.showLoader(); + const res: VerifyLoginResponse = await this.httpRequestService.post(api.login, { + email: value.phoneNumber, + country_code: countryCode, + via: 'OTP', + }); + + if (environment.production) { + await this.firebaseService.signInWithPhoneNumber({ + phoneNumber: countryCode + value.phoneNumber + }); + } + + const navOption = { + state: { + countryCode, + phoneNumber: value.phoneNumber, + redirectionFrom: 'login', + }, + }; + this.navCtrl.navigateForward(Roots.auth + '/' + Roots.otp, navOption); + this.alert.showToaster(res.message); + } catch (error) { + if (!error.error) { this.alert.showToasterError(error.message); } + } finally { + this.alert.hideLoader(); + } + } + } + + goToRegister() { + this.zone.run(() => { + this.navCtrl.navigateForward(Roots.auth + '/' + Roots.register); + }); + } + + codeChange(event) { + this.numLength = event.value.num_length; + this.loginForm.controls.phoneNumber.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } +} diff --git a/src/app/pages/auth/otp/otp.page.html b/src/app/pages/auth/otp/otp.page.html new file mode 100644 index 0000000..e8755c8 --- /dev/null +++ b/src/app/pages/auth/otp/otp.page.html @@ -0,0 +1,40 @@ + + + + Welcome To + + + + + +
+
+ +
+ Done +

OTP verified. Please wait...

+
+
+ +

OTP verification

+

+ We have sent a verification code to your register mobile, please add your verification code +

+ +
+
+ + +
+
+ +

{{timer}}

+

Resend

+
+ Verify and + proceed + +

Sign in

+
+
+
diff --git a/src/app/pages/auth/otp/otp.page.scss b/src/app/pages/auth/otp/otp.page.scss new file mode 100644 index 0000000..ac315f1 --- /dev/null +++ b/src/app/pages/auth/otp/otp.page.scss @@ -0,0 +1,86 @@ +app-otp { + ion-content { + ion-card { + border-radius: 0 0 1.563rem 1.563rem; + margin: var(--ion-margin-0); + background: #F3FAFF url(/assets/images/circle-bg.svg) no-repeat bottom 1.875rem center; + box-shadow: none; + height: 12.563rem; + text-align: var(--ion-text-align-center); + padding-top: 6rem; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-20); + text-transform: uppercase; + margin-bottom: 0.55rem; + } + + ion-card-subtitle { + font-size: 1.063rem; + color: #FF6331; + + span { + color: var(--ion-color); + } + } + } + } + + text-align: center; + + .otp { + display: flex; + align-items: center; + justify-content: center; + padding: var(--ion-padding-15); + flex-direction: column; + + img { + margin: var(--ion-margin-20); + width: 75%; + } + + ion-item { + width: 100%; + margin-bottom: var(--ion-margin-15); + padding: var(--ion-padding-0); + + &.otp-time { + margin-top: var(--ion-margin-5); + justify-content: space-between; + --min-height: auto; + + p { + margin: var(--ion-margin-0); + } + } + } + + .resend-otp { + text-align: right; + margin: 0 var(--ion-margin-30) var(--ion-margin-15) 0; + color: var(--ion-color); + font-size: 12px; + width: 100%; + + &.disable { + pointer-events: none; + opacity: 0.5; + } + } + } + + p { + text-align: var(--ion-text-align-center); + font-size: var(--ion-font-size-14); + + &.signing-btn { + padding: 0 var(--ion-padding-15); + color: var(--ion-color); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/auth/otp/otp.page.ts b/src/app/pages/auth/otp/otp.page.ts new file mode 100644 index 0000000..01ca5f3 --- /dev/null +++ b/src/app/pages/auth/otp/otp.page.ts @@ -0,0 +1,145 @@ +import { NgClass, NgIf } from '@angular/common'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { IonicModule, NavController } from '@ionic/angular'; + +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { VerifyLoginResponse } from '@interfaces/common'; +import { AlertService } from '@services/alert.service'; +import { FirebaseService } from '@services/firebase.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { PushService } from '@services/push.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-otp', + templateUrl: './otp.page.html', + styleUrls: ['./otp.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, NgClass] +}) +export class OtpPage implements OnInit, OnDestroy { + otpUserValue: number; + resendFlag = false; + paramsData: any; + resendEnable = true; + timer: string; + interval: any; + otpVerified = false; + + constructor( + private httpRequestService: HttpRequestService, + private stateManagementService: StateManagementService, + private alert: AlertService, + private navCtrl: NavController, + private pushService: PushService, + private router: Router, + private firebaseService: FirebaseService + ) { } + + ngOnInit() { + this.paramsData = this.router.getCurrentNavigation().extras?.state; + this.initTimer(); + this.firebaseService.otpVerified$.subscribe(() => { + this.otpVerified = true; + this.afterOtpVerified(); + }); + } + + initTimer() { + let seconds = 60; + this.interval = setInterval(() => { + if (seconds > 0) { + seconds--; + this.timer = `00:${(seconds > 10 ? seconds : '0' + seconds)}`; + } else { + this.timer = null; + this.resendEnable = false; + clearInterval(this.interval); + } + }, 1000); + } + + async afterOtpVerified() { + if (!this.otpVerified) { return; } + let loginPayLoad: any = { + email: this.paramsData.phoneNumber, + country_code: this.paramsData.countryCode, + via: 'OTP', + verified: 1, + }; + let apiUrl = ''; + if (this.paramsData.redirectionFrom === 'login') { + apiUrl = api.login; + loginPayLoad = { + ...loginPayLoad, + app_version: 1 + } + } else { + loginPayLoad = { + ...loginPayLoad, + name: this.paramsData.signupData.name, + dharma: this.paramsData.signupData.dharma, + birth_date: this.paramsData.signupData.birth_date + }; + apiUrl = api.signUp; + } + const response: VerifyLoginResponse = await this.httpRequestService.post(apiUrl, loginPayLoad); + if (response.status === 200) { + this.stateManagementService.storage.set(GJainStorage.loginType, 2); + this.stateManagementService.token = response.token; + this.stateManagementService.storage.set(GJainStorage.userData, response.user); + if (this.paramsData.redirectionFrom === 'login') { + this.stateManagementService.fetchNotificationCounts(); + this.navCtrl.navigateRoot(Roots.page + '/' + Roots.shravakFeeds); + } else { + this.navCtrl.navigateRoot(Roots.page + '/' + Roots.createdAccount); + } + this.otpVerified = false; + this.pushService.registerPushToken(); + } + this.alert.showToaster(response.message); + } + + async verifyOtp() { + const otpVal = String(this.otpUserValue); + this.alert.showLoader(); + try { + const auth = environment.production ? (await this.firebaseService.confirmVerificationCode(otpVal)).user : 1; + if (auth) { + this.otpVerified = true; + this.afterOtpVerified(); + } + } catch (error) { + if (!error.error && error.message !== 'signIn failed.') { this.alert.showToasterError(error.message); } + } finally { + this.alert.hideLoader(); + } + } + + resendOtp() { + this.resendFlag = true; + this.firebaseService.signInWithPhoneNumber({ phoneNumber: this.paramsData.countryCode + this.paramsData.phoneNumber }) + .then(() => { + this.resendFlag = false; + this.initTimer(); + this.alert.showToaster('OTP resent successfully!'); + }).catch((error) => { + this.alert.showToasterError(error.message); + this.alert.hideLoader(); + }); + } + + backToLogin() { + this.navCtrl.navigateRoot(Roots.auth + '/' + Roots.login); + } + + ngOnDestroy() { + this.otpVerified = false; + } + +} diff --git a/src/app/pages/auth/signup/signup.page.html b/src/app/pages/auth/signup/signup.page.html new file mode 100644 index 0000000..1d28e63 --- /dev/null +++ b/src/app/pages/auth/signup/signup.page.html @@ -0,0 +1,77 @@ + + + + Welcome To + + + + + +

Create new account

+
+ +
+ + +
+ + * Full Name is required. + +
+
+ +
+ +
+
+ + + +
+ + * Mobile number is required. + + + * Please enter {{ numLength }} digit mobile number. + +
+
+ +
+ + + {{dharma.name}} + +
+ + * Dharm is required. + +
+
+
+

+ + + +

+ +

Already have an account?  Sign + in +

+
\ No newline at end of file diff --git a/src/app/pages/auth/signup/signup.page.scss b/src/app/pages/auth/signup/signup.page.scss new file mode 100644 index 0000000..311205c --- /dev/null +++ b/src/app/pages/auth/signup/signup.page.scss @@ -0,0 +1,5 @@ +@import "./../../../../assets/scss/css/form.scss"; + +ion-card { + background: var(--ion-background-card) url(/assets/images/bg-circle-signup.svg) no-repeat bottom -14px right -174px; +} \ No newline at end of file diff --git a/src/app/pages/auth/signup/signup.page.ts b/src/app/pages/auth/signup/signup.page.ts new file mode 100644 index 0000000..90f952b --- /dev/null +++ b/src/app/pages/auth/signup/signup.page.ts @@ -0,0 +1,145 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { Countries, Country, Dharma } from '@interfaces/common'; +import { SignupForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { FirebaseService } from '@services/firebase.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; +@Component({ + selector: 'app-signup', + templateUrl: './signup.page.html', + styleUrls: ['./signup.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, IonicSelectableComponent, NgFor] +}) +export class SignupPage implements OnInit { + countryDetails: Array = []; + dharmaDetails: Array = []; + maxDate: any; + numLength = 10; + dateValue = ''; + signupForm: FormGroup; + showHideActive = Boolean(false); + showConfirmHideActive = Boolean(false); + confirmationFlag = false; + + constructor( + private navCtrl: NavController, + private alert: AlertService, + private httpRequestService: HttpRequestService, + private stateManagementService: StateManagementService, + private firebaseService: FirebaseService, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.signupForm = new FormGroup({ + name: new FormControl('', Validators.required), + countryCode: new FormControl('', Validators.required), + mobileNumber: new FormControl('', Validators.required), + dharma: new FormControl('', Validators.required) + }); + this.maxDate = this.formatDate(new Date((new Date()).setFullYear((new Date()).getFullYear() - 14)).toISOString()); + if (this.stateManagementService.countryDetails.length > 0) { + this.countryDetails = this.stateManagementService.countryDetails; + this.setDefaultCountryCode(); + } else { + this.getCountryDetails(); + } + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + this.signupForm.controls.mobileNumber.setValidators([Validators.required, Validators.pattern('^[0-9]{10}$')]); + this.signupForm.controls.mobileNumber.updateValueAndValidity(); + } + + setDefaultCountryCode() { + this.countryDetails.forEach((elem) => { + if (elem.iso === 'IN') { + this.signupForm.controls.countryCode.setValue(elem); + } + }); + } + + backToLogin() { + this.navCtrl.navigateRoot(Roots.auth + '/' + Roots.login); + } + + codeChange(event) { + this.numLength = event.value.num_length; + this.signupForm.controls.mobileNumber.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + this.signupForm.controls.mobileNumber.updateValueAndValidity(); + } + + formatDate(value: string) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + getCountryDetails() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryDetails = res.countries; + this.stateManagementService.countryDetails = res.countries; + if (this.countryDetails) { + this.setDefaultCountryCode(); + } + }); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + async onSignUp(form) { + if (!this.signupForm.valid || !this.confirmationFlag) { + this.signupForm.markAllAsTouched(); + return; + } + + const codeVal = form.value.countryCode.phone_code; + const countryCode = codeVal.replace('(', '').replace(')', ''); + + const params = { + name: form.value.name, + email: form.value.mobileNumber, + dharma: form.value.dharma, + country_code: countryCode, + verified: 0, + }; + try { + this.alert.showSpinner(); + await this.httpRequestService.post(api.signUp, params); + await this.firebaseService.signInWithPhoneNumber({ phoneNumber: countryCode + form.value.mobileNumber }); + const navOption = { + state: { + countryCode, + phoneNumber: form.value.mobileNumber, + redirectionFrom: 'register', + signupData: params + }, + }; + this.navCtrl.navigateForward(Roots.auth + '/' + Roots.otp, navOption); + } catch (error) { + if (!error.error) { this.alert.showToasterError(error.message); } + } finally { + this.alert.hideLoader(); + } + } + + async goToPolicy(type: number) { + this.utilityService.openBrowser(type === 1 ? constants.privacyPolicy : constants.termsAndConditions); + } +} diff --git a/src/app/pages/common/certificate-banner/certificate-banner.component.html b/src/app/pages/common/certificate-banner/certificate-banner.component.html new file mode 100644 index 0000000..03d42e9 --- /dev/null +++ b/src/app/pages/common/certificate-banner/certificate-banner.component.html @@ -0,0 +1,21 @@ +
+
+
+ Card Icon +
+
+
+

{{title}}

+

+ {{description}} +

+
+
+
+ + + +
+
+
\ No newline at end of file diff --git a/src/app/pages/common/certificate-banner/certificate-banner.component.scss b/src/app/pages/common/certificate-banner/certificate-banner.component.scss new file mode 100644 index 0000000..9ffc9f3 --- /dev/null +++ b/src/app/pages/common/certificate-banner/certificate-banner.component.scss @@ -0,0 +1,56 @@ +.medical-card { + background: #f0faf1; + box-shadow: 4px 4px 10px var(--ion-shadow) !important; + margin: 16px 0; + box-shadow: none; + padding: 15px; + font-weight: 600; + border: 2px solid var(--ion-color-hospital); + border-right: none; + border-left: none; +} + +.sangh-card { + border-color: var(--ion-color-sangh); + background: #F3E1FC; +} + +.medical-card-content { + display: flex; + align-items: center; + + .next-btn { + position: absolute; + right: 0; + padding-right: 15px; + } +} + +.medical-card-icon { + margin-right: 16px; +} + +.medical-card-icon img { + width: 60px; + height: 60px; +} + +.medical-card-text { + h3 { + margin: 0; + font-size: 16px; + color: var(--ion-color-hospital); + } + + p { + margin: 4px 0 0 0; + font-size: 12px; + color: #333; + } +} + +.sangh-card-text { + h3 { + color: var(--ion-color-sangh); + } +} \ No newline at end of file diff --git a/src/app/pages/common/certificate-banner/certificate-banner.component.ts b/src/app/pages/common/certificate-banner/certificate-banner.component.ts new file mode 100644 index 0000000..03d5d49 --- /dev/null +++ b/src/app/pages/common/certificate-banner/certificate-banner.component.ts @@ -0,0 +1,16 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-certificate-banner', + templateUrl: './certificate-banner.component.html', + styleUrls: ['./certificate-banner.component.scss'], + standalone: true +}) +export class CertificateBannerComponent { + + @Input() dynamicClass: string; + @Input() dynamicColorClass: string; + @Input() icon: string; + @Input() title: string; + @Input() description: string; +} diff --git a/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.html b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.html new file mode 100644 index 0000000..6598138 --- /dev/null +++ b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.html @@ -0,0 +1,84 @@ +
+ +

About Jain Health Care

+
+ + + +

+ "Shree Mumbai Jain Sangh Sangathan" and "Shree Evershine Paradise S.M.T Jain + Sangh" are partnering with + multiple Hospitals to provide discounts on medical facilities exclusively for Jains. +

+
+ + +
+ +

+ Aadhar Card verfication is a mandatory step to generate the JHC letter. +

+
+ +
+ +

+ Once requested, JHC letter will be processed within 24 hours. +

+
+ + +
+ +
+ JHC letter generated will be shared +

a) automatically with the respective Hospital admin and

+

b) User will receive email and can download from the Global Jain app"

+
+
+ + +
+ +

+ JHC letter will be valid for 48 hours from the date and time of Issuance. Post expiration, + the user can + generate a new JHC letter on need basis. +

+
+ + +
+ +

+ Only One JHC letter can be active at any given point in time. +

+
+ + +
+ +

+ Discount % in Hospitals will vary as per the MOU signed with the respective hospital and + the services availed. +

+
+ +
+ +

+ To get the discount on the medical bill, the user has to share the active JHC letter and a copy of + Aadhar + card to the Hospital admin. +

+
+ +
+ +

+ The user can generate the JHC letter only for himself. +

+
+ +
+
\ No newline at end of file diff --git a/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.scss b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.scss new file mode 100644 index 0000000..c289150 --- /dev/null +++ b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.scss @@ -0,0 +1,33 @@ +.certificate-term-policy { + + .border-bottom { + border-bottom: 1px solid rgb(217, 216, 216); + margin-bottom: 15px; + } + + h2 { + color: #449353; + font-weight: 600; + text-align: center; + } +} + +.list-item { + display: flex; + align-items: flex-start; + margin-bottom: 8px; + justify-content: center; + + ion-icon { + margin-right: 10px; + flex: 0 0 4%; + } + + .text { + margin: 0; + font-size: 13px; + color: #333; + flex: 0 0 92%; + } + +} \ No newline at end of file diff --git a/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.ts b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.ts new file mode 100644 index 0000000..d431da4 --- /dev/null +++ b/src/app/pages/common/certificate-term-policy/certificate-term-policy.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { IonicModule } from '@ionic/angular'; + +@Component({ + selector: 'app-certificate-term-policy', + templateUrl: './certificate-term-policy.component.html', + styleUrls: ['./certificate-term-policy.component.scss'], + standalone: true, + imports: [IonicModule] +}) +export class CertificateTermPolicyComponent { } diff --git a/src/app/pages/common/create-account/create-account.page.html b/src/app/pages/common/create-account/create-account.page.html new file mode 100644 index 0000000..439b8a1 --- /dev/null +++ b/src/app/pages/common/create-account/create-account.page.html @@ -0,0 +1,10 @@ + + + diff --git a/src/app/pages/common/create-account/create-account.page.scss b/src/app/pages/common/create-account/create-account.page.scss new file mode 100644 index 0000000..b74b7d6 --- /dev/null +++ b/src/app/pages/common/create-account/create-account.page.scss @@ -0,0 +1,29 @@ +app-create-account { + ion-content { + text-align: center; + .create-account { + display: flex; + height: 100vh; + align-items: center; + justify-content: space-between; + flex-direction: column; + .center-img { + width: 75%; + margin: 6vh 0; + } + p { + font-size: var(--ion-font-size-20); + letter-spacing: 0; + font-weight: 600; + color: #585858; + &.lastchild { + font-size: var(--ion-font-size-16); + } + } + ion-button { + width: 90%; + margin: 0; + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/common/create-account/create-account.page.ts b/src/app/pages/common/create-account/create-account.page.ts new file mode 100644 index 0000000..aca472a --- /dev/null +++ b/src/app/pages/common/create-account/create-account.page.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; + +@Component({ + selector: 'app-create-account', + templateUrl: './create-account.page.html', + styleUrls: ['./create-account.page.scss'], + standalone: true, + imports: [IonicModule] +}) +export class CreateAccountPage { + + constructor(private navCtrl: NavController) { } + + goToDashboard() { + this.navCtrl.navigateRoot(Roots.page + '/' + Roots.shravakFeeds); + } + +} diff --git a/src/app/pages/common/discount-certificate/discount-certificate.page.html b/src/app/pages/common/discount-certificate/discount-certificate.page.html new file mode 100644 index 0000000..6c69a39 --- /dev/null +++ b/src/app/pages/common/discount-certificate/discount-certificate.page.html @@ -0,0 +1,272 @@ + + + + + + About JHC + + + + + +
+ +
+ +
+
+ + + +
+
+
+
+ +
+
+

{{ certificateDetail?.full_name }}

+

{{ certificateDetail?.hospital?.name }}

+
+
+ +

Your Jain Health Care Benefit Letter has been Approved and shared with the hospital + administration. +

+

Wishing {{ certificateDetail?.full_name }} a speedy recovery.

+

+ Valid till: + + {{ certificateDetail.generated_date | addHours:48 }} + +

+ Download letter +
+ + +

Your Jain Health Care Benefit Letter is under verification.

+

It will be processed within 24 hours.

+
+ + +

Your Jain Health Care letter has been Rejected. +

+ +

+ Reason: + + {{ certificateDetail.rejection_reason }} + +

+ + Please resubmit the request +
+
+
+
+
+
+ + + GENERATE JHC + + +
+ + + +

Jain Health Care Form

+
+ +
+ + + +

{{hospital.name}}

+

+ ({{hospital.area}},{{hospital.city}}) +

+
+
+
+ + Hospital is required. + +
+
+ +
+ + + {{facility}} + +
+ + Medical facility is required. + +
+
+ +
+ + +
+ + Full Name is required. + +
+
+ +
+ + +
+ + Address is required. + +
+
+ +
+ + +
+ + Email is required. + + + Email is invalid. + +
+
+ +
+ + +
+ + Aadhar Number is required. + + + Aadhar Number is invalid. + +
+
+ +
+ +
+ + + UPLOAD IMAGE + + +
+ Aadhar front copy + +
+
+
+
+ +
+ +
+ + + UPLOAD BACK COPY + + +
+ Aadhar back copy + +
+
+
+
+
+
+ + + GENERATE JHC + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/app/pages/common/discount-certificate/discount-certificate.page.scss b/src/app/pages/common/discount-certificate/discount-certificate.page.scss new file mode 100644 index 0000000..e6f07ce --- /dev/null +++ b/src/app/pages/common/discount-certificate/discount-certificate.page.scss @@ -0,0 +1,241 @@ +h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color-hospital); +} + +.back { + margin-left: 10px; + font-size: larger; + font-weight: 800; +} + +ion-footer { + padding: 10px; + background-color: #FAFAFA; + box-shadow: none; +} + +.hi { + &::part(native) { + --background: var(--ion-color-hospital) !important; + } +} + +.hmi { + &::part(native) { + --background: var(--ion-color-medium-shade) !important; + } +} + +p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0; + color: var(--ion-content-color); +} + +.agreed-content { + display: flex; + align-items: start; + margin-bottom: 10px; + + label { + padding-left: var(--ion-padding-10); + font-size: 13px; + font-weight: 500; + } + + ion-checkbox { + &.checkbox-checked { + --checkbox-background-checked: var(--ion-color-hospital); + --border-color-checked: var(--ion-color-hospital); + } + } + + a { + color: var(--ion-color-danger); + padding: 0 5px; + cursor: pointer; + } +} + +.container { + padding: 0px 15px; +} + + +.modal-card { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + text-align: center; + padding: 10px; + + ion-card-header { + align-items: center; + display: flex; + flex-direction: column; + gap: 10px; + } + + ion-card-title { + font-size: 18px; + font-weight: 600; + } + + ion-card-content { + p { + color: black; + } + + padding-bottom: 0 !important; + } + + p { + margin-bottom: 20px; + font-size: 14px; + font-weight: 600; + } +} + +.upload-container { + width: 100%; + min-height: 70px; + border: 1.5px dashed #B4B4B4; + text-align: center; + padding: 0.8rem; + color: #4CAF50; + background-color: var(--ion-color-light-dark); + justify-content: center; + align-items: center; + display: flex; + + ion-icon { + margin-right: 0.5rem; + } +} + +.upload-preview { + display: flex; + align-items: center; + padding: 5px; + position: relative; + gap: 10px; + + img { + width: 100px; + height: 80px; + object-fit: cover; + border-radius: 5px; + } + + ion-icon { + position: absolute; + background: var(--ion-color-white); + font-size: 20px; + border-radius: var(--ion-border-radius-100); + color: #343434; + right: 0px; + top: 8px; + } +} + +.button-container { + display: flex; + justify-content: center; + gap: 10px; + + ion-button.hmi { + flex: 0 0 45%; + } + + ion-button.hi { + flex: 0 0 45%; + } +} + + +.hospital-text { + color: var(--ion-color-hospital); +} + +.discount-certificate { + max-width: 400px; + margin: 20px auto; + border-radius: 10px; + background-color: #ffff; + + p { + color: #525252; + } + + &.success { + border: 1px solid #449353; + } + + &.reject { + border: 1px solid #934444; + } +} + +.certificate-header { + padding: 5px 0; + border-top-right-radius: 10px; + border-top-left-radius: 10px; + font-weight: 600; + + &.success-header { + border-bottom: 1px solid var(--ion-color-hospital); + background-color: #E4F4E6; + + p { + color: var(--ion-color-hospital); + } + } + + &.reject-header { + border-bottom: 1px solid #934444; + background-color: #F4E4E4; + + p { + color: #522929; + } + } +} + +.certificate-header h2 { + font-size: 18px; + margin-bottom: 5px; + color: #000000; +} + +.certificate-content { + padding: 10px 0px; + font-weight: 600 +} + +.certificate-link { + padding: 0px 15px; + color: var(--ion-color-hospital); + font-size: 14px; + text-decoration: underline; + cursor: pointer; +} + +.certificate-link:hover { + color: #155724; + text-decoration: underline; +} + +.no-discount-certificate { + h2 { + color: var(--ion-color-hospital); + font-weight: 600; + } +} + +.reject-reason-title { + color: #522929; + font-weight: 600; +} \ No newline at end of file diff --git a/src/app/pages/common/discount-certificate/discount-certificate.page.ts b/src/app/pages/common/discount-certificate/discount-certificate.page.ts new file mode 100644 index 0000000..60bd394 --- /dev/null +++ b/src/app/pages/common/discount-certificate/discount-certificate.page.ts @@ -0,0 +1,236 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { Browser } from '@capacitor/browser'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { CertificateStatus, CertificateStep, constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CertificateDetail, CommonResponse, Hospital, Photo, PhotoDetail, ProfileData } from '@interfaces/common'; +import { CertificateForm, CertificateTermConditionForm } from '@interfaces/form'; +import { IonModal, IonicModule, NavController } from '@ionic/angular'; +import { AddHoursPipe } from '@pipes/add-hours.pipe'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { CertificateTermPolicyComponent } from '../certificate-term-policy/certificate-term-policy.component'; +@Component({ + selector: 'app-discount-certificate', + templateUrl: './discount-certificate.page.html', + styleUrls: ['./discount-certificate.page.scss'], + standalone: true, + imports: [IonicModule, ReactiveFormsModule, CertificateTermPolicyComponent, IonicSelectableComponent, AddHoursPipe, NgFor, NgClass, NgIf, SafeUrlPipe] +}) +export class DiscountCertificatePage implements OnInit { + @ViewChild('confirmModel') confirmModel: IonModal; + @ViewChild('confirmCancelModel') confirmCancelModel: IonModal; + @ViewChild('confirmDetailModel') confirmDetailModel: IonModal; + + readonly certificateStep = CertificateStep; + readonly certificateStatus = CertificateStatus; + + hospitalList: Hospital[] = []; + hospitalFacility: string[] = constants.medicalReason; + certificateInformationForm: FormGroup; + certificateTermConditionForm: FormGroup; + photo = new Photo(); + pageNo = CertificateStep.home; + certificateDetail: CertificateDetail; + + constructor( + public santService: SantInfoService, + private cameraGalleryService: CameraGalleryService, + public utilityService: UtilityService, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private stateManagementService: StateManagementService, + private navCtrl: NavController + ) { } + + ngOnInit(): void { + this.certificateInformationForm = this.santService.certificateForm; + this.certificateTermConditionForm = this.santService.certificateTermConditionForm; + + this.getUserDetails(); + this.getHospitalList(); + } + + ionViewWillEnter(): void { + this.getCertificateDetail(); + } + + getUserDetails(): void { + this.stateManagementService.storage.get(GJainStorage.userData).then((res: ProfileData) => { + if (res) { + this.certificateInformationForm.controls.email.setValue(res.email); + this.certificateInformationForm.controls.fullName.setValue(res.name); + } + }); + } + + getCertificateDetail(): void { + this.httpRequestService.get(api.certificateDetail).then((res: CommonResponse) => { + this.certificateDetail = res.data; + this.certificateDetail && this.setFormValue(); + }) + } + + setFormValue(): void { + this.certificateInformationForm.setValue({ + hospital: this.certificateDetail.hospital_id, + fullName: this.certificateDetail.full_name, + email: this.certificateDetail.email, + address: this.certificateDetail.address, + aadharNumber: this.certificateDetail.aadhar_card_number, + medicalDescription: this.certificateDetail.medical_problem, + }); + } + + getHospitalList(): void { + this.httpRequestService.get(api.hospitalList).then((res: CommonResponse) => { + this.hospitalList = res.data; + }) + } + + onSubmit(): void { + if (this.pageNo === this.certificateStep.home) { + if (!this.certificateTermConditionForm?.value?.termCondition) { + this.alert.showToasterError('Please agree terms and conditions'); + return; + } + this.certificateTermConditionForm.reset(); + this.pageNo = this.certificateStep.info; + } else { + if (this.certificateInformationForm?.invalid) { + this.certificateInformationForm.markAllAsTouched(); + return; + } + if (!this.photo?.aadharFront?.url) { + this.alert.showToasterError('Aadhar card front image is required'); + return; + } + + if (!this.photo?.aadharBack?.url) { + this.alert.showToasterError('Aadhar card back image is required'); + return; + } + this.confirmDetailModel.isOpen = true; + } + } + + onPrevious(): void { + if (this.pageNo === CertificateStep.home) { + this.onCancel() + } + else { + this.onCancel(true) + } + } + + dismissModel(isGenerated = false): void { + if (isGenerated) { + this.pageNo = this.certificateStep.home; + this.resetForm(); + } + this.confirmModel.isOpen = false; + this.getCertificateDetail(); + } + + onConfirmDetail(confirm: boolean): void { + this.confirmDetailModel.isOpen = false; + if (confirm) { + const params = this.getParams(); + this.httpRequestService.post(api.certificate, params).then(res => { + if (res) { + this.confirmModel.isOpen = true; + } + }) + } + } + + getParams() { + const certificateInfoForm = this.certificateInformationForm.value; + + const formData = new FormData(); + formData.append('hospital_id', certificateInfoForm.hospital); + formData.append('full_name', certificateInfoForm.fullName); + formData.append('address', certificateInfoForm.address); + formData.append('email', certificateInfoForm.email); + formData.append('medical_problem', certificateInfoForm.medicalDescription); + formData.append('aadhar_card_number', certificateInfoForm.aadharNumber); + + this.photo?.aadharFront?.imageData && formData.append('aadhar_card_front_photo', this.photo.aadharFront.imageData); + this.photo?.aadharBack?.imageData && formData.append('aadhar_card_back_photo', this.photo.aadharBack.imageData); + this.certificateDetail && formData.append('id', this.certificateDetail.id); + + return formData; + } + + async downloadCertificate(): Promise { + await Browser.open({ url: this.certificateDetail.pdf_url }); + } + + profileView(url: string): void { + this.utilityService.imagePreview(url); + } + + removeImage(front = false): void { + if (front) { + this.photo.aadharFront = new PhotoDetail(); + } + else { + this.photo.aadharBack = new PhotoDetail(); + } + } + + onCancel(home = false): void { + if (home) { + this.confirmCancelModel.isOpen = true; + } + else { + this.navCtrl.navigateForward([Roots.page]); + this.resetForm(); + } + } + + resetForm(): void { + this.certificateInformationForm.reset(); + this.photo = new Photo(); + } + + onConfirmCancel(cancel = false) { + if (cancel) { + this.pageNo = CertificateStep.home; + this.resetForm(); + } + this.confirmCancelModel.isOpen = false; + } + + termsPolicy(terms = false) { + if (terms) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.termsPolicy]); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.visibilityPolicy]); + } + } + + selectImages(isAadhar = 0) { + if (isAadhar) { + this.cameraGalleryService.selectImage(512, 512, false).then((imageData: { imgString: string; itemImage: Blob }) => { + const photo = new PhotoDetail(); + photo.url = imageData.imgString; + photo.imageData = imageData.itemImage; + if (isAadhar === 1) { + this.photo.aadharFront = photo; + } else { + this.photo.aadharBack = photo; + } + }); + } + } +} diff --git a/src/app/pages/common/global-search/global-search.page.html b/src/app/pages/common/global-search/global-search.page.html new file mode 100644 index 0000000..2f6f32c --- /dev/null +++ b/src/app/pages/common/global-search/global-search.page.html @@ -0,0 +1,248 @@ + + + + + + Global search + + + + + + + +
+ + + Sant + + + Sangh + + + Shravak + + +
+ +
+ + + + +

+

No data found. Try again...

+

+
+ + + +
+ +
+ + + +
+ +

{{data?.name}}{{data?.dharma?.name}}

+
+ + + Connected + + + + + Connect + + + + + Requested + + + + + Respond + + +
+
+
Show more + ({{ tabRecordCount }} results)
+ + + + +
+
+ +
+ + + + +

+

No data found. Try again...

+

+
+ + + +
+ +
+ + + +
+ +

{{data?.name}}{{data?.dharma?.name}}({{data?.sampraday?.name}})

+
+ + + Member + + + + + + Accept/Decline + + +
+
+
Show more + ({{ tabRecordCount }} results)
+ + + + +
+
+ +
+ + + + About {{ totalCountSant | number }} + results + +

+

No data found. Try again...

+

+
+ + + + + + +

{{data?.name}}{{data?.dharm?.name}}({{data?.sampraday?.name}})

+
+ + + {{ data.is_user_following ? 'Following' : 'Follow' }} + + +
+
+
Show more + ({{ tabRecordCount }} results)
+ + + + +
+
+
+
+
+ + + +

Sant Filter

+

Sangh Filter

+

Shravak Filter

+ +
+ + +
+ +
+ + +
+ +
+ + + {{dharma.name}} + + +
+ +
+ + + +
+ +
+ + + Male + Female + +
+ +
+ + + Maharaj Saheb + Mahasati Ji + +
+ +
+ + +
+ +
+ Filter + Reset +
+
+
+
diff --git a/src/app/pages/common/global-search/global-search.page.scss b/src/app/pages/common/global-search/global-search.page.scss new file mode 100644 index 0000000..6e82be2 --- /dev/null +++ b/src/app/pages/common/global-search/global-search.page.scss @@ -0,0 +1,435 @@ +app-global-search { + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + margin-right: var(--ion-margin-10); + color: #fff; + float: right; + } + } + + ion-item { + &.search { + margin: var(--ion-margin-0); + + ion-input { + height: inherit; + flex: 0 0 90%; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + + &:last-child { + padding-top: var(--ion-padding-10); + } + } + } + } + + ion-content { + .bg { + background: var(--ion-background-content); + padding-bottom: var(--ion-padding-15); + min-height: 90%; + + ion-segment { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15); + background: var(--ion-color-white); + width: auto; + justify-content: space-between; + box-shadow: 2px 2px 7px #ebebeb; + position: fixed; + width: 100%; + z-index: 9; + + ion-segment-button { + margin: var(--ion-margin-0); + padding: var(--ion-padding-0); + min-width: 33.33%; + width: fit-content; + flex: inherit; + min-height: 40px; + width: 100%; + + ion-label { + margin: 8px var(--ion-margin-0); + text-transform: capitalize; + line-height: inherit; + font-size: var(--ion-font-size-14); + } + + &.segment-button-checked { + color: var(--ion-color-sant); + + &::part(indicator) { + --indicator-color: var(--ion-color-sant); + } + + ion-label { + color: var(--ion-color-sant); + } + } + + &:nth-child(2) { + &.segment-button-checked { + color: var(--ion-color-sangh); + + &::part(indicator) { + --indicator-color: var(--ion-color-sangh); + } + + ion-label { + color: var(--ion-color-sangh); + } + } + } + + &:nth-child(3) { + &.segment-button-checked { + color: var(--ion-color); + + &::part(indicator) { + --indicator-color: var(--ion-color); + } + + ion-label { + color: var(--ion-color); + } + } + } + } + } + + .bottom-bg-location { + padding: var(--ion-padding-40) var(--ion-padding-0) var(--ion-padding-15); + } + + ion-list { + padding: var(--ion-padding-0) !important; + border-top: 1px solid #efefef; + + ion-item { + margin: var(--ion-margin-0); + padding: 5px var(--ion-padding-15); + border-bottom: 1px solid #eee; + + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + background: #efefef; + align-items: center; + overflow: hidden; + width: 40px; + height: 40px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + + ion-label { + margin: var(--ion-margin-0); + line-height: initial; + white-space: normal !important; + + h2 { + font-weight: 600; + font-size: var(--ion-font-size-14); + + span { + display: block; + font-size: var(--ion-font-size-12); + color: #aaa; + text-overflow: inherit; + overflow: inherit; + font-weight: 400; + } + } + } + + ion-chip { + padding: 5px; + height: auto; + margin: 0; + background: var(--ion-color); + color: #fff; + font-size: var(--ion-font-size-12); + border-radius: 5px; + + ion-label { + font-size: var(--ion-font-size-12) !important; + } + + &.friends { + background: var(--ion-color-success); + } + + &.requested { + background: var(--ion-background-button); + color: var(--ion-color); + } + + &.respond { + background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + } + + .sangh { + ion-list { + ion-item { + ion-chip { + background: var(--ion-color-sangh); + + &.requested { + background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + } + + &.member { + background: var(--ion-color-success); + } + } + } + } + } + + .sant { + ion-list { + ion-item { + ion-chip { + background: var(--ion-color-sant); + + &.following { + background: var(--ion-content-color-sant); + color: white; + } + } + } + } + } + } + + h3 { + color: var(--ion-color); + } + } +} + +ion-modal { + &.global-filter { + --height: 350px; + align-items: flex-end; + --height: calc(350px + env(safe-area-inset-bottom)); + + &.sant { + --height: 450px; + --height: calc(450px + env(safe-area-inset-bottom)); + } + + ion-content { + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: var(--ion-color); + } + } + + ion-item { + &:first-child { + margin-top: var(--ion-margin-10); + } + + ion-select, + ionic-selectable { + height: 2.813rem; + } + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.813rem; + background: transparent; + } + + h4 { + font-size: var(--ion-font-size-18); + color: var(--ion-color); + } + + &.sant { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + } + } + + h4 { + color: var(--ion-color-sant); + } + } + + &.sangh { + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + h4 { + color: var(--ion-color-sangh); + } + + ion-item { + + ion-input, + ion-text, + input { + border: 1px solid var(--ion-background-content-sangh); + } + + ion-select, + ion-textarea, + ionic-selectable { + border: 1px solid var(--ion-background-content-sangh); + padding: var(--ion-padding-10) !important; + } + } + } + + .filter-btn { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-button { + width: 48%; + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } + } + } +} + +.auto-location { + .pac-container { + bottom: 125px !important; + top: auto !important; + } + + ionic-selectable-modal { + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + ion-content { + ion-list { + ion-item { + ion-icon { + &.ion-color-primary { + --ion-color-base: var(--ion-color-sangh) !important; + } + } + + ion-label { + white-space: normal !important; + } + } + } + } + } +} + +.search-selectable { + ionic-selectable-modal { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + } + } + + ion-content { + ion-list { + ion-item { + ion-icon { + &.ion-color-primary { + --ion-color-base: var(--ion-color-sant) !important; + } + } + + ion-label { + white-space: normal !important; + } + } + } + } + } +} + +.show-more { + display: flex; + align-items: center; + justify-content: center; + color: var(--ion-color); + font-size: 16px; + font-weight: 600; + text-align: center; + min-height: 46px; + border-bottom: 1px solid #eeeeee; + background: var(--ion-color-white); +} + +.sant-available-count { + display: block; + font-size: var(--ion-font-size-12); + color: #aaa; + text-align: center; + padding: 10px; +} \ No newline at end of file diff --git a/src/app/pages/common/global-search/global-search.page.ts b/src/app/pages/common/global-search/global-search.page.ts new file mode 100644 index 0000000..8af79b0 --- /dev/null +++ b/src/app/pages/common/global-search/global-search.page.ts @@ -0,0 +1,459 @@ +import { DOCUMENT, DecimalPipe, NgClass, NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; +import { Component, ElementRef, Inject, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; + +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { JoinSanghButtonComponent } from '@components/join-sangh-button/join-sangh-button.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { + CommonResponse, Dharma, GlobalSearchDataSangh, GlobalSearchDataSant, + GlobalSearchDataShravak, + Sampraday, UserData +} from '@interfaces/common'; +import { IonicModule, ModalController, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-global-search', + templateUrl: './global-search.page.html', + styleUrls: ['./global-search.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgSwitch, NgSwitchCase, NgIf, NgFor, NgClass, + AvatarPercentageComponent, IonicSelectableComponent, DecimalPipe, JoinSanghButtonComponent] +}) +export class GlobalSearchPage implements OnInit, OnDestroy { + @ViewChild('personalLocation') personalLocation: ElementRef; + @ViewChild('currentLocation') currentLocation: ElementRef; + @ViewChild('nativeLocation') nativeLocation: ElementRef; + searchSegment: 'sant' | 'shravak' | 'sangh' = 'sant'; + searchedShravakData: Array = []; + searchedSantData: Array = []; + searchedSanghData: Array = []; + pageNumberShravak = 1; + totalPageShravak = 1; + pageNumberSant = 1; + totalPageSant = 1; + pageNumberSangh = 1; + totalPageSangh = 1; + totalCountShravak: number; + totalCountSangh: number; + totalCountSant: number; + searchValue = ''; + noDataFlagShravak: boolean; + noDataFlagSant: boolean; + noDataFlagSangh: boolean; + userData: UserData; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + dharma_id: any; + sampraday_id: any; + gender_id: any; + location: any; + longitude = ''; + latitude = ''; + currentLongitude = ''; + currentLatitude = ''; + nativeLongitude = ''; + nativeLatitude = ''; + current_location: any; + native_location: any; + sampradayData = []; + seeMoreShravak = false; + seeMoreSangh = false; + seeMoreSant = false; + prevValue: string; + + constructor( + @Inject(DOCUMENT) private document: Document, + private navCtrl: NavController, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private stateManagementService: StateManagementService, + private modalCtrl: ModalController, + private renderer: Renderer2, + private utilityService: UtilityService, + private router: Router + ) { } + + get tabRecordCount() { + return this.searchValue.trim() ? + this.searchSegment === 'shravak' ? this.totalCountShravak - 3 : + this.searchSegment === 'sangh' ? this.totalCountSangh - 3 : + this.searchSegment === 'sant' ? this.totalCountSant - 3 : 0 + : 0; + } + + get shravakAll() { + return !this.seeMoreShravak && this.tabRecordCount > 0 ? this.searchedShravakData.slice(0, 3) : this.searchedShravakData; + } + + get sanghAll() { + return !this.seeMoreSangh && this.tabRecordCount > 0 ? this.searchedSanghData.slice(0, 3) : this.searchedSanghData; + } + + get santAll() { + return !this.seeMoreSant && this.tabRecordCount > 0 ? this.searchedSantData.slice(0, 3) : this.searchedSantData; + } + + ngOnInit(): void { + if (this.router.getCurrentNavigation().extras.state?.activeTab) { + this.searchSegment = this.router.getCurrentNavigation().extras.state?.activeTab; + } + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + } else { + this.getSampradayDetails(); + } + } + + async ionViewWillEnter() { + this.advanceSearch(); + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + globalSearchShravak(isFirstLoad, event) { + this.noDataFlagShravak = false; + if (this.pageNumberShravak <= this.totalPageShravak) { + this.httpRequestService.post(api.globalSearchShravak, { + page: this.pageNumberShravak, + limit: 15, + name: this.searchValue.trim(), + longitude: this.current_location ? this.currentLongitude : '', + latitude: this.current_location ? this.currentLatitude : '', + native_longitude: this.native_location ? this.nativeLongitude : '', + native_latitude: this.native_location ? this.nativeLatitude : '', + gender_id: this.gender_id ? [this.gender_id] : [] + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { + this.seeMoreShravak = false; + this.searchedShravakData = []; + } + this.searchedShravakData.push(...res.data.data); + this.totalPageShravak = res.data.last_page; + this.noDataFlagShravak = true; + this.totalCountShravak = res.data.total; + this.pageNumberShravak++; + }); + } else { + if (event) { event.target.complete(); } + this.noDataFlagShravak = true; + } + } + + globalSearchSangh(isFirstLoad, event) { + this.noDataFlagSangh = false; + if (this.pageNumberSangh <= this.totalPageSangh) { + this.httpRequestService.post(api.globalSearchSangh, { + page: this.pageNumberSangh, + limit: 15, + name: this.searchValue.trim(), + dharma_id: this.dharma_id ? [this.dharma_id] : [], + sampraday_id: this.sampradayData, + latitude: this.location ? this.latitude : '', + longitude: this.location ? this.longitude : '', + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { + this.seeMoreSangh = false; + this.searchedSanghData = []; + } + this.searchedSanghData.push(...res.data.data); + this.totalPageSangh = res.data.last_page; + this.noDataFlagSangh = true; + this.totalCountSangh = res.data.total; + this.pageNumberSangh++; + }); + } else { + if (event) { event.target.complete(); } + this.noDataFlagSangh = true; + } + } + + globalSearchSant(isFirstLoad, event) { + this.noDataFlagSant = false; + if (this.pageNumberSant <= this.totalPageSant) { + this.httpRequestService.post(api.globalSearchSant, { + page: this.pageNumberSant, + limit: 15, + name: this.searchValue.trim(), + dharma_id: this.dharma_id ? [this.dharma_id] : [], + sampraday_id: this.sampradayData, + gender_id: this.gender_id ? [this.gender_id] : [], + longitude: this.current_location ? this.currentLongitude : '', + latitude: this.current_location ? this.currentLatitude : '', + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { + this.seeMoreSant = false; + this.searchedSantData = []; + } + this.searchedSantData.push(...res.data.data); + this.totalPageSant = res.data.last_page; + this.noDataFlagSant = true; + this.totalCountSant = res.data.total; + this.pageNumberSant++; + }); + } else { + if (event) { event.target.complete(); } + this.noDataFlagSant = true; + } + } + + loadShravakData($event) { + this.globalSearchShravak(true, $event); + } + + loadSanghData($event) { + this.globalSearchSangh(true, $event); + } + + loadSantData($event) { + this.globalSearchSant(true, $event); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + const params = { + dharma_id: this.dharma_id + }; + this.httpRequestService.get(api.sampradayDetails, params).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + }); + } + + viewPublicProfile(id: number, type: string) { + if (type === 'user') { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } else if (type === 'sant') { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.santViewProfile, { santId: id }]); + } else if (type === 'sangh') { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(id))); + } + } + + sendConnectionRequest(id: number, data: GlobalSearchDataShravak) { + this.httpRequestService.post(api.connectionRequestSend, { receiver_id: id }) + .then((res: CommonResponse) => { + data.is_friends = 2; + this.alert.showToaster(res.message); + }); + } + + acceptDeclineRequest(id: number, data: GlobalSearchDataShravak, status: number, type?: number) { + if (status === 1) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status }) + .then((res: CommonResponse) => { + data.is_friends = 1; + this.alert.showToaster(res.message); + }); + } else { + this.confirmationAlert(id, data, type); + } + } + + async confirmationAlert(id, data: GlobalSearchDataShravak, type: number) { + const message = + type === 1 ? `Are you sure you want to remove User ${data.name} from your connection?` : + type === 2 ? ` 'Are you sure about to cancel this request?` : + ''; + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + const res: CommonResponse = await this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status: 2 }); + data.is_friends = 0; + this.alert.showToaster(res.message); + } + } + + async followSant(id: number, data: GlobalSearchDataSant, event) { + const params = { + sant_id: id, + }; + if (data.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + event.stopPropagation(); + await this.httpRequestService.post(api.followSant, params); + data.is_user_following = !data.is_user_following; + } + } else { + event.stopPropagation(); + await this.httpRequestService.post(api.followSant, params); + data.is_user_following = !data.is_user_following; + } + } + + searchName($event) { + this.searchValue = $event.detail.value; + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.advanceSearch(); + } + } + + + onDharmChange() { + this.sampraday_id = []; + if (this.searchSegment !== 'shravak') { + this.getSampradayDetails(); + } + } + + onSampradayChange() { + this.sampradayData = []; + for (const data of this.sampraday_id) { + this.sampradayData.push(data.id); + } + } + + async advanceSearch() { + if (this.searchSegment === 'shravak') { + this.searchedShravakData = []; + this.pageNumberShravak = 1; + this.totalPageShravak = 1; + this.globalSearchShravak(false, ''); + } else if (this.searchSegment === 'sangh') { + this.searchedSanghData = []; + this.pageNumberSangh = 1; + this.totalPageSangh = 1; + this.globalSearchSangh(false, ''); + } else if (this.searchSegment === 'sant') { + this.searchedSantData = []; + this.pageNumberSant = 1; + this.totalPageSant = 1; + this.globalSearchSant(false, ''); + } + const isOpen = await this.modalCtrl.getTop(); + if (isOpen) { this.modalCtrl.dismiss(); } + } + + initAutocompleteCurrent(): void { + this.utilityService.createAutocomplete(this.currentLocation.nativeElement, []).subscribe((details) => { + this.current_location = this.currentLocation.nativeElement.value; + this.currentLongitude = details.geometry.location.lng(); + this.currentLatitude = details.geometry.location.lat(); + }); + } + + initAutocompleteNative(): void { + this.utilityService.createAutocomplete(this.nativeLocation.nativeElement, []).subscribe((details) => { + this.native_location = this.nativeLocation.nativeElement.value; + this.nativeLongitude = details.geometry.location.lng(); + this.nativeLatitude = details.geometry.location.lat(); + }); + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.personalLocation.nativeElement, []).subscribe((details) => { + this.location = this.personalLocation.nativeElement.value; + this.longitude = details.geometry.location.lng(); + this.latitude = details.geometry.location.lat(); + }); + } + + changeSegment(event) { + this.resetSantFilter(); + this.resetSanghFilter(); + this.resetShravakFilter(); + this.sampradayData = []; + this.renderer.removeClass(this.document.body, 'auto-location'); + this.renderer.removeClass(this.document.body, 'search-selectable'); + if (event.detail.value === 'sant') { + this.searchedSantData = []; + this.globalSearchSant(false, ''); + this.renderer.addClass(this.document.body, 'search-selectable'); + } else if (event.detail.value === 'sangh') { + this.searchedSanghData = []; + this.globalSearchSangh(false, ''); + this.renderer.addClass(this.document.body, 'auto-location'); + } else if (event.detail.value === 'shravak') { + this.searchedShravakData = []; + this.globalSearchShravak(false, ''); + } + } + + // --- Reset sant filter + resetSantFilter() { + this.pageNumberSant = this.totalPageSant = 1; + this.dharma_id = this.sampraday_id = this.gender_id = this.current_location = ''; + this.sampradayData = []; + } + + // --- reset sangh filter + resetSanghFilter() { + this.pageNumberSangh = this.totalPageSangh = 1; + this.location = this.longitude = this.latitude = this.dharma_id = this.sampraday_id = ''; + this.sampradayData = []; + } + + resetShravakFilter() { + this.current_location = this.currentLatitude = this.currentLongitude = this.native_location = this.nativeLatitude = + this.nativeLongitude = this.gender_id = ''; + this.pageNumberShravak = this.totalPageShravak = 1; + } + + resetFilter() { + if (this.searchSegment === 'sant') { + this.resetSantFilter(); + this.searchedSantData = []; + this.globalSearchSant(false, ''); + } else if (this.searchSegment === 'sangh') { + this.resetSanghFilter(); + this.searchedSanghData = []; + this.globalSearchSangh(false, ''); + } else if (this.searchSegment === 'shravak') { + this.resetShravakFilter(); + this.searchedShravakData = []; + this.globalSearchShravak(false, ''); + } + } + + acceptDecline(sangh) { + this.utilityService.presentAcceptDecline(`Please confirm`) + .then(action => { + if (action) { + this.alert.showLoader(); + this.httpRequestService.post(api.acceptDeclineSanghRequest, { + sangh_id: sangh.id, + user_id: sangh.user_id, + status: action, // 1-accept, 2-decline/cancel + is_commiittee: sangh.is_member === 0 ? 0 : 1, + }).then((res: CommonResponse) => { + this.alert.showToaster(res.message); + sangh.sangh_member_status = (action === 1 ? 1 : 0); // 1-accept, 0-reset + }).finally(() => { + this.alert.hideLoader(); + }); + } + }); + } + + ngOnDestroy(): void { + this.renderer.removeClass(this.document.body, 'auto-location'); + this.renderer.removeClass(this.document.body, 'search-selectable'); + } + +} diff --git a/src/app/pages/common/image-view/image-view.page.html b/src/app/pages/common/image-view/image-view.page.html new file mode 100644 index 0000000..1038c92 --- /dev/null +++ b/src/app/pages/common/image-view/image-view.page.html @@ -0,0 +1,9 @@ + + + image-view + + + + + + diff --git a/src/app/pages/common/image-view/image-view.page.ts b/src/app/pages/common/image-view/image-view.page.ts new file mode 100644 index 0000000..2c9b86f --- /dev/null +++ b/src/app/pages/common/image-view/image-view.page.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { IonicModule } from '@ionic/angular'; + +@Component({ + selector: 'app-image-view', + templateUrl: './image-view.page.html', + standalone: true, + imports: [IonicModule] +}) +export class ImageViewPage { + +} diff --git a/src/app/pages/common/menu/menu.page.html b/src/app/pages/common/menu/menu.page.html new file mode 100644 index 0000000..c4c2c38 --- /dev/null +++ b/src/app/pages/common/menu/menu.page.html @@ -0,0 +1,100 @@ + + + Menu + + + + + + + + + + Settings + + + + + + + Privacy policy + + + + + + + Terms & conditions + + + + + + + + Log out + + \ No newline at end of file diff --git a/src/app/pages/common/menu/menu.page.scss b/src/app/pages/common/menu/menu.page.scss new file mode 100644 index 0000000..000f02d --- /dev/null +++ b/src/app/pages/common/menu/menu.page.scss @@ -0,0 +1,345 @@ +app-menu { + background: var(--ion-background-content); + + app-message-notification-badge { + float: right; + } + + h3 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.25rem var(--ion-margin-0); + font-weight: 700; + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + --background: var(--ion-background-content); + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + .follow-box { + padding: 0.75rem var(--ion-padding-15) var(--ion-padding-15); + position: relative; + + ion-card { + padding: var(--ion-padding-10); + box-shadow: 0px 0px 12px #ebebeb; + margin: var(--ion-margin-0); + border-radius: 8px; + position: relative; + + ion-card-header { + padding: var(--ion-padding-0); + display: flex; + justify-content: space-between; + + ion-card-title { + font-size: var(--ion-font-size-14); + margin: var(--ion-margin-0); + display: flex; + align-items: center; + font-weight: 700; + + ion-icon { + color: var(--ion-card-color, var(--ion-item-color, var(--ion-color-step-550, #737373))); + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-weight: 400; + font-size: var(--ion-font-size-12) !important; + } + + .view { + width: calc(100% - 58px); + word-break: break-word; + + p { + font-size: var(--ion-font-size-14); + } + } + + &.top-header { + font-size: var(--ion-font-size-16); + color: var(--ion-color); + } + + } + + ion-thumbnail { + margin-right: var(--ion-margin-10); + } + } + + img { + border-radius: 50%; + overflow: hidden; + background: var(--ion-background-content); + } + + &.profile-box { + ion-card-header { + margin: var(--ion-margin-0); + } + } + + } + + >p { + font-size: var(--ion-font-size-16); + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) var(--ion-margin-0) 6px var(--ion-margin-0); + display: flex; + justify-content: space-between; + align-items: baseline; + + span { + color: var(--ion-color); + + &:last-child { + font-size: var(--ion-font-size-12); + color: #000; + } + } + } + + ion-item { + padding: var(--ion-padding-10); + margin-bottom: 0; + background: var(--ion-color-white); + border-radius: 5px; + align-items: flex-start; + overflow: auto; + + >div { + margin: var(--ion-margin-0) 10px var(--ion-margin-0) var(--ion-margin-0); + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: var(--ion-font-size-14); + flex-wrap: wrap; + width: 4.438rem; + word-break: break-word; + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + text-align: center; + } + } + + ion-thumbnail { + height: 3.438rem; + width: 3.438rem; + border-radius: var(--ion-border-radius-100); + background: var(--ion-background-content); + + img { + border-radius: 50%; + overflow: hidden; + } + } + + &::part(native) { + --background: none; + } + } + + ion-card { + ion-card-header { + margin: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10) var(--ion-padding-0); + + &:last-child { + margin: var(--ion-padding-0); + } + } + } + + .points { + font-size: var(--ion-font-size-16); + border: 1px solid #FFA500; + padding: 0 8px; + border-radius: 8px; + margin: var(--ion-margin-15) auto; + width: 100%; + color: #000; + font-weight: 600; + vertical-align: middle; + background: #FFF9ED; + display: flex; + align-items: center; + justify-content: space-between; + line-height: 40px; + + div { + display: flex; + align-items: center; + } + + ion-icon { + color: #FFA500; + margin-right: 10px; + font-size: 24px; + } + + span { + color: #FFA500; + margin-left: 10px; + float: right; + font-size: var(--ion-font-size-24); + line-height: 23px; + font-weight: 500; + } + } + + .follow-box-common { + font-size: 15px; + font-weight: 600; + margin: 10px 0 0 0; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + height: 45px; + padding: 10px 25px 10px 10px; + + border-radius: 8px; + letter-spacing: 0; + + img { + display: block; + } + } + + .contribution { + background: rgba(251, 244, 236, 1) url(/assets/images/black.svg) center right 10px no-repeat; + color: #000; + } + + .certificate { + background: #E4F4E6 url(/assets/images/black.svg) center right 10px no-repeat; + color: #000000; + } + + .youtube { + background: rgba(255, 0, 0, 0.10) url(/assets/images/red.svg) center right 10px no-repeat; + color: #f00; + } + + .invite { + background: rgba(254, 165, 1, 0.12) url(/assets/images/yellow.svg) center right 10px no-repeat; + color: #FF8000; + } + + } + + ion-button { + height: 30px; + --padding-top: 8px; + --padding-bottom: 8px; + + &::part(native) { + height: 20px !important; + } + } + + ion-list { + margin: var(--ion-margin-0) var(--ion-margin-15) !important; + padding: var(--ion-padding-0) !important; + box-shadow: 0px 0px 12px #ebebeb; + border-radius: 8px !important; + + ion-accordion { + ion-item { + font-size: var(--ion-font-size-14); + margin-bottom: var(--ion-margin-0); + align-items: flex-end; + + ion-icon { + font-size: var(--ion-font-size-14); + } + + ion-label { + display: flex !important; + align-items: center; + + .settings-common { + padding: 5px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + + ion-icon { + width: 21px; + height: 21px; + } + + img { + width: 31px; + height: 31px; + object-fit: none; + } + } + + &:last-child, + &:nth-child(3), + &:nth-child(2) { + .ion-accordion-toggle-icon { + display: none; + } + } + } + + ion-list { + border-top: 1px solid #eee; + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-15) !important; + margin: var(--ion-margin-0) !important; + } + + ul { + margin: var(--ion-margin-0); + padding: var(--ion-padding-0); + list-style: none; + + li { + border-bottom: 1px solid #eee; + padding: 10px 0; + font-size: var(--ion-font-size-14); + + &::before { + content: "\2022"; + color: var(--ion-color); + font-weight: 900; + display: inline-block; + width: 0.5em; + } + } + } + } + } + + ion-item { + --border-width: 0px !important; + } + } + + .divider { + display: block; + border: 1px solid; + margin: 16px 0; + opacity: 0.13; + } +} \ No newline at end of file diff --git a/src/app/pages/common/menu/menu.page.ts b/src/app/pages/common/menu/menu.page.ts new file mode 100644 index 0000000..31b0851 --- /dev/null +++ b/src/app/pages/common/menu/menu.page.ts @@ -0,0 +1,131 @@ +import { Component, OnInit } from '@angular/core'; +import { Share, ShareOptions } from '@capacitor/share'; +import { IonicModule, NavController } from '@ionic/angular'; + +import { NgFor, NgIf } from '@angular/common'; +import { FooterComponent } from '@components/footer/footer.component'; +import { MessageNotificationBadgeComponent } from '@components/message-notification-badge/message-notification-badge.component'; +import { ProfileCompleteIndicatorComponent } from '@components/profile-complete-indicator/profile-complete-indicator.component'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, FriendList, ProfileData, ProfileResponse, UserData } from '@interfaces/common'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { CertificateBannerComponent } from '../certificate-banner/certificate-banner.component'; + +@Component({ + selector: 'app-menu', + templateUrl: './menu.page.html', + styleUrls: ['./menu.page.scss'], + standalone: true, + imports: [IonicModule, MessageNotificationBadgeComponent, NgIf, CertificateBannerComponent, ProfileCompleteIndicatorComponent, NgFor, FooterComponent] +}) +export class MenuPage implements OnInit { + userProfileData: ProfileData; + friendList: Array = []; + friendListArray: Array = []; + userData: UserData; + + constructor( + private stateManagementService: StateManagementService, + private navController: NavController, + private httpRequestService: HttpRequestService, + public utilityService: UtilityService + ) { } + + ngOnInit() { + this.getFriendList(); + } + + ionViewWillEnter() { + this.getProfileInfo(); + } + + getProfileInfo() { + this.httpRequestService.get(api.shravakProfile).then((res: ProfileResponse) => { + this.userProfileData = res.data; + this.stateManagementService.userProfileData = res.data; + this.stateManagementService.storage.set(GJainStorage.profileData, res.data); + }); + } + + getFriendList() { + this.httpRequestService.get(api.friendList).then((res: CommonResponse) => { + this.friendListArray = res.data; + if (res.data.length > 3) { + res.data.forEach((element, i) => { + if (i < 3) { + this.friendList.push(element); + } + }); + } else { + this.friendList = res.data; + } + }); + } + + async logout() { + const isYes = await this.utilityService.presentConfirm('Are you sure to logout?'); + if (isYes) { + this.utilityService.logout(); + } + } + + goToProfile() { + this.navController.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } + + viewPublicProfile(id: number) { + this.navController.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + + visibilityPolicy() { + this.navController.navigateForward([Roots.page + '/' + Roots.visibilityPolicy]); + } + + termsPolicy() { + this.navController.navigateForward([Roots.page + '/' + Roots.termsPolicy]); + } + + goToFriendList() { + this.navController.navigateForward([Roots.page + '/' + Roots.friendRequest]); + } + + goToSettings() { + this.navController.navigateForward([Roots.page + '/' + Roots.settings]); + } + + async inviteUser() { + const options: ShareOptions = { + text: 'Global Jain lets you follow Sant real time,' + + ' stay tuned with Sangh events and will also let us follow each other\'s activities.' + + ' Click here to join - It\'s free: ', + url: constants.inviteLink, + }; + await Share.share(options); + } + + goToYoutube() { + this.utilityService.openBrowser(constants.youtubeLink); + } + + goToContribution() { + this.utilityService.openBrowser(constants.contributionLink); + } + + goToCertificate() { + this.navController.navigateForward([Roots.page + '/' + Roots.certificate]); + } + + editProfile() { + this.navController.navigateForward([Roots.page, Roots.shravakAbout], { + state: { + from: 'edit' + }, + }); + } + +} diff --git a/src/app/pages/common/notification/notification.page.html b/src/app/pages/common/notification/notification.page.html new file mode 100644 index 0000000..1eaf9fd --- /dev/null +++ b/src/app/pages/common/notification/notification.page.html @@ -0,0 +1,71 @@ + + + + + + Notification + + + + +

+

Oops....no notifications to ring the bell

+

+ + +
+
+ + + + +
+
+ +

+

+ {{notification.extra_fields.name}} +

+

+

{{notification.extra_fields.name}}

+
+ + Confirm + Delete + Accept + Decline + Accept + Decline +
+
+
+ + + + + +
+ + + + +
+
+ \ No newline at end of file diff --git a/src/app/pages/common/notification/notification.page.scss b/src/app/pages/common/notification/notification.page.scss new file mode 100644 index 0000000..a19cbf1 --- /dev/null +++ b/src/app/pages/common/notification/notification.page.scss @@ -0,0 +1,142 @@ +app-notification { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + + h3 { + p { + color: var(--ion-color); + text-transform: uppercase; + } + } + + ion-list { + background: none !important; + padding: var(--ion-padding-0) !important; + + ion-item-sliding { + padding: var(--ion-padding-0); + border-bottom: 1px solid #ededed; + + ion-item { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + --min-height: auto; + transition: 0.2s ease-in-out; + overflow: visible; + background: #fff; + z-index: 2; + } + + ion-item-options { + top: 0; + transition: 0.2s ease-in-out; + display: flex; + height: 100%; + } + + &.item-sliding-active-options-end { + &.item-sliding-active-slide { + ion-item-options { + display: flex; + transition: 0.2s ease-in-out; + } + } + } + } + } + + h5 { + color: var(--ion-color); + font-weight: 600; + padding: var(--ion-padding-10); + margin: var(--ion-margin-0); + border-bottom: 1px solid #efefef; + + span { + float: right; + font-size: var(--ion-font-size-12); + color: #000; + } + } + + .left-data { + display: flex; + align-items: center; + width: 100%; + + .icons { + width: 40px; + height: 40px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + + &.heart { + color: #f00; + } + } + } + + .content { + width: calc(100% - 60px); + + ion-button { + height: 25px; + margin: var(--ion-margin-10) 4% 0 0; + width: 48%; + + &:last-child { + margin-right: 0; + } + + &::part(native) { + text-transform: capitalize; + } + + &.cancel-btn::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 700; + word-break: break-word; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + font-weight: 400; + } + } + } + } + + &.unread { + background: var(--ion-background-content); + } + } +} \ No newline at end of file diff --git a/src/app/pages/common/notification/notification.page.ts b/src/app/pages/common/notification/notification.page.ts new file mode 100644 index 0000000..1bcffc0 --- /dev/null +++ b/src/app/pages/common/notification/notification.page.ts @@ -0,0 +1,223 @@ +import { NgFor, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FooterComponent } from '@components/footer/footer.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, NotificationList, NotificationResponse } from '@interfaces/common'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { SafeHtmlPipe } from '@pipes/safe-html.pipe'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-notification', + templateUrl: './notification.page.html', + styleUrls: ['./notification.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, NgSwitch, NgSwitchCase, NgSwitchDefault, FooterComponent, SafeHtmlPipe] +}) +export class NotificationPage implements OnInit { + notificationList: Array = []; + pageNumber = 1; + totalPage = 1; + noDataFlag: boolean; + totalCount: number; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private alertController: AlertController, + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.stateManagementService.generalData.unread_notification_count = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + } + + ionViewWillEnter() { + this.getNotificationList(false, ''); + } + + getNotificationList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const params = { + page: this.pageNumber, + limit: 18 + }; + this.httpRequestService.get(api.notificationList, params).then((res: NotificationResponse) => { + this.totalPage = res.data.last_page; + this.noDataFlag = true; + this.totalCount = res.data.total; + this.notificationList.push(...res.data.data); + if (isFirstLoad) { event?.target?.complete(); } + this.pageNumber++; + }); + } else { + event?.target?.complete(); + } + } + + loadNotificationData($event) { + this.getNotificationList(true, $event); + } + + async acceptDeclineFamilyStatus(notId: number, id: number, status: number, index: number) { + if (status === 2) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about cancel this request?', + 'No', 'Yes', 'Cancel Request' + ); + if (isYes) { + const res: any = await this.httpRequestService.post(api.relationshipRequestChange, { + from_id: id, + status, + }); + this.notificationList.splice(index, 1); + this.alert.showToaster(res.message); + } + } else { + this.presentAlertPrompt(notId, id, index); + } + } + + sendConnectionRequest(notId: number, userId: number, actionStatus: number, index: number) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: userId, status: actionStatus }) + .then((res: CommonResponse) => { + this.notificationList.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + + notificationDelete(id, type?: number, index?: number) { + this.httpRequestService.get(api.deleteNotification.replace('{id}', id)) + .then(() => { + if (type === 1) { + this.notificationList.splice(index, 1); + } + }); + } + + async presentAlertPrompt(notId: number, id: number, index: number) { + const alert = await this.alertController.create({ + cssClass: 'my-custom-class', + header: 'Add Relation', + message: 'Please add your relation with this person!', + inputs: [ + { + name: 'familyRelation', + type: 'text', + placeholder: 'Relation' + }, + ], + buttons: [{ + text: 'Ok', + handler: async (data) => { + const params = { + from_id: id, + status: 1, + relation: data.familyRelation + }; + const res: any = await this.httpRequestService.post(api.relationshipRequestChange, params); + this.notificationList.splice(index, 1); + this.alert.showToaster(res.message); + } + }, { + text: 'Cancel', + role: 'cancel', + cssClass: 'secondary', + }] + }); + + await alert.present(); + } + + viewPublicProfile(notification: any, type: string, notificationType: string) { + if (['CommentPost', 'LikePost', 'TagPost', 'NewSanghPost', 'NewFriendPost'].includes(notificationType)) { + const navOption = { + state: { + postId: notification.extra_fields.from_id, + type: type === 'shravak' ? '1' : '3' + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postDetail, navOption); + } else { + if (type === 'shravak') { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: notification.extra_fields.user_id }]); + } else if (type === 'sant') { + if (notificationType === 'SantSendBack') { + const navOption = { + state: { + updatedSantId: notification.extra_fields.from_id, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', notification.extra_fields.from_id) + , navOption); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.santViewProfile, { santId: notification.extra_fields.from_id }]); + } + } else if (type === 'sangh') { + const sanghId: number = notification.extra_fields.sangh_id; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(sanghId))); + } else if (notificationType === 'SanghMemberID') { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghFeeds); + } + } + } + + async acceptDeclineSanghMember(notification: any, status: number, index: number) { + if (status === 2) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about decline this request?', + 'No', 'Yes', 'Decline' + ); + if (isYes) { + const params = { + sangh_id: notification.extra_fields.sangh_id, + user_id: notification.extra_fields.from_id, + status, + is_commiittee: notification.type === 'UserSentMemberRequest' ? 1 : 0, + }; + this.httpRequestService.post(api.acceptDeclineSanghRequest, params).then((res: any) => { + this.notificationList.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + } else { + const params = { + sangh_id: notification.extra_fields.sangh_id, + user_id: notification.extra_fields.from_id, + status, + is_commiittee: notification.type === 'UserSentMemberRequest' ? 1 : 0, + }; + this.httpRequestService.post(api.acceptDeclineSanghRequest, params).then((res: any) => { + this.notificationList.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + } + + moveToProfile(notification) { + if ([ + 'AdminAcceptedMemberRequest', + 'AdminRemovedMember', + 'SanghAddedMember', + 'AdminDeclinedMemberRequest', + 'NewSanghPost', + 'SanghUpdatedMember', + 'SanghApproved', + 'SanghRejected' + ].includes(notification.type)) { + const sanghId: number = notification.extra_fields.sangh_id; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(sanghId))); + } else if (notification.extra_fields.user_type === 'shravak' || notification.extra_fields.user_type === 'sangh') { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: notification.extra_fields.user_id }]); + } else if (notification.extra_fields.user_type === 'sant') { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.santViewProfile, { santId: notification.extra_fields.from_id }]); + } + } +} diff --git a/src/app/pages/common/terms-policy/terms-policy.page.html b/src/app/pages/common/terms-policy/terms-policy.page.html new file mode 100644 index 0000000..f86405d --- /dev/null +++ b/src/app/pages/common/terms-policy/terms-policy.page.html @@ -0,0 +1,13 @@ + + + + + + Terms & Conditions + + + +
+
+
+
diff --git a/src/app/pages/common/terms-policy/terms-policy.page.scss b/src/app/pages/common/terms-policy/terms-policy.page.scss new file mode 100644 index 0000000..f6d770c --- /dev/null +++ b/src/app/pages/common/terms-policy/terms-policy.page.scss @@ -0,0 +1,109 @@ +app-terms-policy { + .inner-html { + padding: 0 16px 16px 16px; + } + + .m-0 { + margin: 0 !important; + } + + .page-title { + color: #555; + font-size: 1.5em; + + span { + color: var(--ion-color); + } + } + + h2 { + color: var(--ion-color); + font-size: 1.15em; + text-transform: uppercase; + } + + .privacy-policy-list { + padding: var(--ion-padding-15) var(--ion-padding-0) var(--ion-padding-0); + + strong { + color: var(--ion-color); + } + + p { + color: #777; + margin: 0 0 10px; + font-size: 0.90em; + line-height: 18px; + + span { + display: block; + } + } + + .listing { + counter-reset: item; + padding-left: 0; + margin: 0 0 10px 0; + + p { + font-size: 0.90rem; + font-weight: 400; + } + + li { + color: var(--ion-color); + display: block; + font-size: 0.90em; + line-height: 18px; + font-weight: 700; + } + + &.no-count { + li { + &::before { + display: none; + } + } + } + + &.bullate { + li { + background-image: url(/assets/images/bullet-point-red.svg); + list-style: none; + background-repeat: no-repeat; + padding-left: 20px; + background-position: 0 3px; + + &::before { + display: none; + } + } + } + } + + .alphabates { + li { + list-style-type: lower-alpha !important; + } + } + + .privacy-number { + li { + list-style-type: decimal !important; + } + } + + .listing-inner { + padding-left: 16px; + } + + ul { + &.listing { + li { + list-style: inside; + display: list-item; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/common/terms-policy/terms-policy.page.ts b/src/app/pages/common/terms-policy/terms-policy.page.ts new file mode 100644 index 0000000..c36ed52 --- /dev/null +++ b/src/app/pages/common/terms-policy/terms-policy.page.ts @@ -0,0 +1,33 @@ +import { Component, OnInit } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { IonicModule } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; + +@Component({ + selector: 'app-terms-policy', + templateUrl: './terms-policy.page.html', + styleUrls: ['./terms-policy.page.scss'], + standalone: true, + imports: [IonicModule] +}) +export class TermsPolicyPage implements OnInit { + termsandcondition: any; + constructor(private httpRequestService: HttpRequestService, + ) { } + + ngOnInit() { + this.getPolicyContent(); + } + + getPolicyContent() { + const params = { + page: 'terms_and_condition' + }; + this.httpRequestService.post(api.getPrivacyValue, params).then((res: any) => { + if (res.status_code === 200) { + this.termsandcondition = res.content; + } + }); + } + +} diff --git a/src/app/pages/common/visibility-policy/visibility-policy.page.html b/src/app/pages/common/visibility-policy/visibility-policy.page.html new file mode 100644 index 0000000..ff955ca --- /dev/null +++ b/src/app/pages/common/visibility-policy/visibility-policy.page.html @@ -0,0 +1,13 @@ + + + + + + Privacy policy + + + +
+
+
+
diff --git a/src/app/pages/common/visibility-policy/visibility-policy.page.scss b/src/app/pages/common/visibility-policy/visibility-policy.page.scss new file mode 100644 index 0000000..1c2618f --- /dev/null +++ b/src/app/pages/common/visibility-policy/visibility-policy.page.scss @@ -0,0 +1,109 @@ +app-visibility-policy { + .inner-html { + padding: 0 16px 16px 16px; + } + + .m-0 { + margin: 0 !important; + } + + .page-title { + color: #555; + font-size: 1.5em; + + span { + color: var(--ion-color); + } + } + + h2 { + color: var(--ion-color); + font-size: 1.15em; + text-transform: uppercase; + } + + .privacy-policy-list { + padding: var(--ion-padding-15) var(--ion-padding-0) var(--ion-padding-0); + + strong { + color: var(--ion-color); + } + + p { + color: #777; + margin: 0 0 10px; + font-size: 0.90em; + line-height: 18px; + + span { + display: block; + } + } + + .listing { + counter-reset: item; + padding-left: 0; + margin: 0 0 10px 0; + + p { + font-size: 0.90rem; + font-weight: 400; + } + + li { + color: var(--ion-color); + display: block; + font-size: 0.90em; + line-height: 18px; + font-weight: 700; + } + + &.no-count { + li { + &::before { + display: none; + } + } + } + + &.bullate { + li { + background-image: url(/assets/images/bullet-point-red.svg); + list-style: none; + background-repeat: no-repeat; + padding-left: 20px; + background-position: 0 3px; + + &::before { + display: none; + } + } + } + } + + .alphabates { + li { + list-style-type: lower-alpha !important; + } + } + + .privacy-number { + li { + list-style-type: decimal !important; + } + } + + .listing-inner { + padding-left: 16px; + } + + ul { + &.listing { + li { + list-style: inside; + display: list-item; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/common/visibility-policy/visibility-policy.page.ts b/src/app/pages/common/visibility-policy/visibility-policy.page.ts new file mode 100644 index 0000000..e21852e --- /dev/null +++ b/src/app/pages/common/visibility-policy/visibility-policy.page.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { IonicModule } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; + +@Component({ + selector: 'app-visibility-policy', + templateUrl: './visibility-policy.page.html', + styleUrls: ['./visibility-policy.page.scss'], + standalone: true, + imports: [IonicModule] +}) +export class VisibilityPolicyPage implements OnInit { + privacypolicy: any; + constructor(private httpRequestService: HttpRequestService,) { } + + ngOnInit() { + this.getPolicyContent(); + } + + getPolicyContent() { + const params = { + page: 'privacy_policy' + }; + this.httpRequestService.post(api.getPrivacyValue, params).then((res: any) => { + if (res.status_code === 200) { + this.privacypolicy = res.content; + } + }); + } + +} diff --git a/src/app/pages/messages/message-chat/message-chat.page.html b/src/app/pages/messages/message-chat/message-chat.page.html new file mode 100644 index 0000000..c3c7636 --- /dev/null +++ b/src/app/pages/messages/message-chat/message-chat.page.html @@ -0,0 +1,56 @@ + + + + + + {{userName}} + + + + + + + + + + +
+ +
+ + + + + +
+
+ {{ isTodayOrYesterDay(item) }} + + + {{ item | localDate | date: 'dd/MM/yyyy' }} + +
+
+
+ +
+
+

{{ msg?.message }} {{ + (msg?.created_at) | localDate | + date: 'hh:mm a' + }}

+
+
+
+
+ +

Conversation not started yet.

+
+
+ + + + \ No newline at end of file diff --git a/src/app/pages/messages/message-chat/message-chat.page.scss b/src/app/pages/messages/message-chat/message-chat.page.scss new file mode 100644 index 0000000..dde7ef3 --- /dev/null +++ b/src/app/pages/messages/message-chat/message-chat.page.scss @@ -0,0 +1,176 @@ +app-message-chat { + ion-header { + ion-icon { + margin-right: 5px !important; + } + + ion-accordion-group { + width: auto; + margin: auto; + + ion-accordion { + background: none; + text-align: right; + + ion-item { + --background: none; + margin: var(--ion-margin-0); + padding: var(--ion-padding-0); + width: auto; + --min-height: auto; + + ion-label { + margin: var(--ion-margin-0); + padding: 6px 10px; + font-size: var(--ion-font-size-14) !important; + } + + .ion-accordion-toggle-icon { + display: none; + } + } + + >ion-item { + width: 25px; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + display: inline-block; + + ion-icon { + color: #fff; + } + } + } + } + + ion-toolbar { + ion-title { + &.back-btn { + padding-right: 35px; + } + } + } + } + + ion-content { + + .left-right-p { + display: flex; + padding: 6px 8px; + background: #e7f7fe; + border-radius: 4px; + width: fit-content; + } + + + .msg-content { + color: var(--ion-content-color); + font-size: 10px; + font-weight: 400; + margin: 5px 0 0 10px; + display: flex; + white-space: nowrap; + align-items: flex-end; + } + + .chat-data { + margin: 0; + font-size: var(--ion-font-size-14) !important; + color: #000 !important; + display: flex; + word-break: break-word; + white-space: normal; + padding-bottom: 5px; + } + + + .left-data { + display: flex; + margin-top: var(--ion-margin-10); + + .icons { + width: 30px; + height: 30px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + + .content { + width: calc(100% - 40px); + + p { + margin: var(--ion-margin-0); + justify-content: flex-start; + } + } + } + + .right-data { + display: flex; + justify-content: flex-end; + + p { + margin: var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + justify-content: flex-end; + } + } + + ion-list { + background: transparent !important; + + .separator { + span { + font-size: var(--ion-font-size-12); + margin-top: 10px; + display: inline-block; + background: #ececec; + padding: 5px 10px; + border-radius: 10px; + } + } + } + } + + ion-footer { + position: relative; + margin-bottom: 10px; + + ion-textarea { + background: #e7f7fe !important; + padding: 10px; + margin: var(--ion-margin-0) !important; + + &.has-focus { + --highlight-color-focused: none; + --highlight-color-valid: none; + } + + .textarea-wrapper { + min-height: 30px !important; + max-height: 120px !important; + } + + textarea { + padding: 10px 40px 10px 10px !important; + border: 1px solid #aeb6bf !important; + border-radius: 5px !important; + } + } + + ion-icon { + position: absolute; + right: 18px; + bottom: 18px; + z-index: 9; + font-size: 27px; + color: var(--ion-color); + } + } +} \ No newline at end of file diff --git a/src/app/pages/messages/message-chat/message-chat.page.ts b/src/app/pages/messages/message-chat/message-chat.page.ts new file mode 100644 index 0000000..afc2dca --- /dev/null +++ b/src/app/pages/messages/message-chat/message-chat.page.ts @@ -0,0 +1,273 @@ +import { DatePipe, NgClass, NgFor, NgIf, formatDate } from '@angular/common'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { MessagePopoverComponent } from '@components/message-popover/message-popover.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { Message } from '@interfaces/common'; +import { IonContent, IonTextarea, IonicModule, NavController, PopoverController } from '@ionic/angular'; +import { LocalDatePipe } from '@pipes/local-date.pipe'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'app-message-chat', + templateUrl: './message-chat.page.html', + styleUrls: ['./message-chat.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, NgClass, FormsModule, DatePipe, LocalDatePipe] +}) +export class MessageChatPage implements OnInit, OnDestroy { + @ViewChild('text') textElement: IonTextarea; + @ViewChild('content', { + static: false + }) content: IonContent; + backURL = '/message'; + messages: { + [timeStr: string]: Array; + } = null; + page = 1; + lastPage = 1; + total = 0; + loader: boolean; + userId: number; + currentUser: any; + imageURL: string; + messageInput: string; + userName: string; + destroy$: Subject = new Subject(); + isEnabledTopInfiniteScroll: boolean; + today: string; + popover: HTMLIonPopoverElement = null; + allDates: Array = []; + isBlocked: number; + + constructor( + private popoverCtrl: PopoverController, + private httpService: HttpRequestService, + private cRoute: ActivatedRoute, + private stateManagementService: StateManagementService, + private changeRef: ChangeDetectorRef, + private navCtrl: NavController, + ) { } + + + ngOnInit() { + this.userId = +this.cRoute.snapshot.paramMap.get('userId') || 0; + this.userName = this.cRoute.snapshot.paramMap.get('name') === 'null' ? + 'Global Jain Member' : this.cRoute.snapshot.paramMap.get('name'); + this.fetchMessages(); + this.getStorage(); + this.today = formatDate(new Date(), 'yyyy/MM/dd', 'en-US'); + this.stateManagementService.messageDetailObservable.pipe( + takeUntil(this.destroy$) + ).subscribe((res: Message) => { + if (res.user_id !== this.userId) { + return; + } + if (!Object.hasOwn(this.messages, this.today)) { + this.messages = { ...this.messages, ...{ [this.today]: [] } }; + } + this.messages[this.today].push({ + id: res.id, + avatar: res.avatar, + avatar_url: res.avatar_url, + name: res.name, + user_id: res.user_id, + message: res.message, + created_at: res.created_at, + unread_count: res.unread_count + }); + this.changeRef.detectChanges(); + setTimeout(() => { + this.content.scrollToBottom(200); + }, 200); + }); + this.stateManagementService.messageClearObservable.pipe( + takeUntil(this.destroy$) + ).subscribe(() => { + this.messages = null; + this.allDates = []; + this.popover.dismiss(); + this.changeRef.detectChanges(); + }); + this.stateManagementService.messageThreadRemoveObservable.pipe( + takeUntil(this.destroy$) + ).subscribe(() => { + this.popover.dismiss(); + this.navCtrl.navigateBack(this.backURL); + }); + } + + async messagePopup(ev: any) { + this.popover = await this.popoverCtrl.create({ + component: MessagePopoverComponent, + event: ev, + cssClass: 'message-popover', + animated: true, + showBackdrop: true, + mode: 'md', + componentProps: { + shravakId: this.userId, + messageExist: (this.messages && Object.keys(this.messages).length) ? true : false + } + }); + return await this.popover.present(); + } + + async getStorage() { + this.currentUser = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + loadData(event: any) { + if (this.page === this.lastPage) { + event.target.disabled = true; + return; + } + this.page++; + this.fetchMessages().then(() => { + event.target.complete(); + this.isEnabledTopInfiniteScroll = false; + }); + } + + fetchMessages(loader = true) { + if (this.page === 1 && loader) { + this.loader = true; + } + const params = { + page: this.page, + user_id: null, + id: null + }; + if (+this.cRoute.snapshot.paramMap.get('userId')) { + params.user_id = +this.cRoute.snapshot.paramMap.get('userId'); + } + if (+this.cRoute.snapshot.paramMap.get('id')) { + params.id = +this.cRoute.snapshot.paramMap.get('id'); + } + return new Promise((resolve, reject) => { + this.httpService.get(api.messageList, params) + .then((res: any) => { + this.isBlocked = res.data.is_blocked; + this.imageURL = res.data.receiver_image; + this.loader = false; + if (!Array.isArray(res.data)) { + for (const key in res.data.data) { + if (Object.hasOwn(res.data.data, key)) { + if (!this.messages) { + this.messages = {}; + } + if (Object.hasOwn(this.messages, key)) { + this.messages[key] = [...res.data.data[key], ...this.messages[key]]; + } else { + this.allDates.push(key); + this.messages[key] = res.data.data[key]; + } + } + } + this.allDates.sort((a, b) => new Date(a).valueOf() - new Date(b).valueOf()); + this.total = res.data.total; + this.lastPage = res.data.last_page; + if (this.page === this.lastPage) { + this.isEnabledTopInfiniteScroll = false; + } + if (this.page === 1) { + setTimeout(() => { + this.content.scrollToBottom(); + }, 300); + } + } + resolve(true); + }, (err) => { + this.loader = false; + reject(err); + }); + }); + } + + onScroll(event: any) { + if (event.detail.deltaY < 0) { + this.isEnabledTopInfiniteScroll = true; + } + } + + sendMessage() { + this.today = formatDate(new Date(), 'yyyy/MM/dd', 'en-US'); + const now = new Date(); + const createdAt = formatDate(new Date(now.getTime()), 'yyyy/MM/dd HH:mm:ss', 'en-US'); + if (this.messageInput && this.messageInput.trim()) { + if (!this.messages) { + this.messages = {}; + } + if (!Object.hasOwn(this.messages, this.today)) { + this.allDates.push(this.today); + this.messages = { ...this.messages, ...{ [this.today]: [] } }; + } + this.messages[this.today].push({ + id: 0, + avatar: '', + avatar_url: '', + name: this.currentUser.name, + user_id: this.currentUser.id, + message: this.messageInput, + created_at: createdAt, + unread_count: 0 + }); + const messageToSend = this.messageInput; + this.messageInput = ''; + setTimeout(() => { + this.content.scrollToBottom(200); + }, 200); + this.httpService.post(api.sendMessage, { + receiver_id: this.userId, + message: messageToSend + }).then((res: any) => { + this.stateManagementService.messageObservable.next({ + id: +res.data, + avatar: '', + avatar_url: this.imageURL, + message: messageToSend, + user_id: this.userId, + created_at: createdAt, + name: this.userName, + unread_count: 0 + }); + }, () => { + this.messageInput = messageToSend; + this.messages[this.today].pop(); + }); + } + } + + isTodayOrYesterDay(dt: string): string { + const cdt = new Date(); + const yesterday = new Date((cdt.setDate(cdt.getDate() - 1))); + if (new Date(dt).toDateString() === new Date().toDateString()) { + return 'Today'; + } else if (new Date(dt).toDateString() === yesterday.toDateString()) { + return 'Yesterday'; + } else { + return null; + } + } + + async goToShravakProfile() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: this.userId }]); + } + + scrollToBottom() { + setTimeout(() => { + this.content.scrollToBottom(); + }, 300); + } + + ngOnDestroy() { + this.destroy$.next(true); + this.destroy$.complete(); + } +} diff --git a/src/app/pages/messages/message/message.page.html b/src/app/pages/messages/message/message.page.html new file mode 100644 index 0000000..6629509 --- /dev/null +++ b/src/app/pages/messages/message/message.page.html @@ -0,0 +1,45 @@ + + + + + + Message + + + + + + +
+ +
+ + + +
+
+ +
+
+

{{ item?.name ? item.name : 'Global Jain Member' }}{{ item?.message }}

+
+
+
+

{{ item.created_at | localDate | messageTime}} + + {{ item?.unread_count }} + +

+
+
+
+
+ +

No messages to list

+
+ + + + +
diff --git a/src/app/pages/messages/message/message.page.scss b/src/app/pages/messages/message/message.page.scss new file mode 100644 index 0000000..2a0de2e --- /dev/null +++ b/src/app/pages/messages/message/message.page.scss @@ -0,0 +1,160 @@ +app-message { + ion-header { + ion-item { + padding: var(--ion-padding-10) var(--ion-padding-15); + background: var(--ion-background-content); + + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + } + + &::part(native) { + --min-height: auto; + } + } + } + + ion-content { + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--ion-padding-15); + border-bottom: 1px solid #efefef; + margin: var(--ion-margin-0); + + ion-icon { + width: 27px; + height: 33px; + padding: 3px 6px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + font-weight: 400; + white-space: nowrap; + } + + ion-chip { + margin: var(--ion-margin-0); + float: right; + padding: var(--ion-padding-0); + height: 18px; + width: 18px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + background: var(--ion-color); + color: #fff; + font-size: var(--ion-font-size-12); + line-height: 18px; + } + } + + .left-data { + display: flex; + align-items: center; + + .icons { + width: 39px; + height: 39px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + + &.family-members { + padding: var(--ion-padding-0); + overflow: hidden; + } + } + + .content { + width: calc(100% - 49px); + max-width: 210px; + + p { + span { + white-space: normal; + word-break: break-word; + font-weight: 400; + display: block; + text-overflow: ellipsis; + overflow: hidden; + } + } + } + } + + &.unread { + background: #e7f2ff; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/messages/message/message.page.ts b/src/app/pages/messages/message/message.page.ts new file mode 100644 index 0000000..96cd234 --- /dev/null +++ b/src/app/pages/messages/message/message.page.ts @@ -0,0 +1,168 @@ +import { NgFor, NgIf } from '@angular/common'; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { Message } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { LocalDatePipe } from '@pipes/local-date.pipe'; +import { MessageTimePipe } from '@pipes/message-time.pipe'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'app-message', + templateUrl: './message.page.html', + styleUrls: ['./message.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgIf, NgFor, LocalDatePipe, MessageTimePipe] +}) +export class MessagePage implements OnInit, OnDestroy { + messages: Array = []; + page = 1; + total = 0; + loader: boolean; + destroy$: Subject = new Subject(); + days: Array = ['Son', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + messageDateArr: Array = []; + searchValue: string; + prevValue: string; + + constructor( + private httpService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private changeRef: ChangeDetectorRef, + private ngZone: NgZone, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.fetchMessages(); + this.stateManagementService.messageObservable.pipe( + takeUntil(this.destroy$) + ).subscribe((res: Message) => { + this.messages = this.messages.filter((m) => +m.user_id !== +res.user_id); + this.messages.unshift(res); + this.changeRef.detectChanges(); + }); + this.stateManagementService.messageClearObservable.pipe( + takeUntil(this.destroy$) + ).subscribe((userId: number) => { + this.messages.forEach(m => { + if (m.user_id === userId) { + m.message = null; + } + }); + this.changeRef.detectChanges(); + }); + this.stateManagementService.messageThreadRemoveObservable.pipe( + takeUntil(this.destroy$) + ).subscribe((userId: number) => { + this.messages = this.messages.filter((m) => m.user_id !== userId); + this.changeRef.detectChanges(); + }); + this.stateManagementService.generalData.unread_message_count = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + } + + + searchConversion(searchValue) { + this.searchValue = searchValue; + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.page = 1; + this.messages = []; + this.fetchMessages(); + } + } + + loadData(event) { + if (this.messages.length === 0 || this.messages.length === this.total) { + event.target.disabled = true; + return; + } + this.page++; + this.fetchMessages().then(() => { + event.target.complete(); + }); + } + + fetchMessages(loader = true) { + if (this.page === 1 && loader) { + this.loader = true; + } + return new Promise((resolve, reject) => { + const params = { + name: this.searchValue, + page: this.page + }; + this.httpService.get(api.messageThread, params) + .then((res: any) => { + this.loader = false; + res.data.data.forEach(message => { + const dtString = this.formatDate(message); + if (!this.messageDateArr.includes(dtString)) { + this.messageDateArr.push(dtString); + } + }); + this.messages = this.messages.concat(res.data.data); + this.total = res.data.total; + resolve(true); + }, (error) => { + this.loader = false; + this.alert.showToaster(error.error.message); + reject(false); + }); + }); + } + + goToDetail(item: { + id: number; + user_id: string | number; + name: string; + unread_count: number; + }) { + item.unread_count = 0; + const params = { + id: null, + userId: null, + name: item.name + }; + if (item.user_id) { + params.userId = item.user_id; + } else { + params.id = item.id; + } + this.ngZone.run(() => this.navCtrl.navigateForward([Roots.page + '/' + Roots.messageChat, params])).then(); + } + + formatDate(someDateTimeStamp: Date) { + const dt = new Date(someDateTimeStamp); + const date = dt.getDate(); + const today = new Date(); + const yesterday = new Date(Date.now() - 86400000); + if (date === today.getDate() && + dt.getMonth() === today.getMonth() && + dt.getFullYear() === today.getFullYear()) { + return 'Today'; + } else if (date === yesterday.getDate() && + dt.getMonth() === yesterday.getMonth() && + dt.getFullYear() === yesterday.getFullYear()) { + return 'Yesterday'; + } else { + return this.days[dt.getDay()] + ', ' + this.days[dt.getMonth()] + ' ' + (date > 9 ? date : '0' + date); + } + } + + ngOnDestroy() { + this.destroy$.next(true); + this.destroy$.complete(); + } +} diff --git a/src/app/pages/pages.routes.ts b/src/app/pages/pages.routes.ts new file mode 100644 index 0000000..5dc0083 --- /dev/null +++ b/src/app/pages/pages.routes.ts @@ -0,0 +1,300 @@ +import { Routes } from '@angular/router'; +import { Roots } from '@enums/root.enum'; + +export const pagesRoutes: Routes = [ + { + path: '', + redirectTo: Roots.shravakFeeds, + pathMatch: 'full', + }, + { + path: Roots.shravakFeeds, + loadComponent: () => import('./shravak/shravak-feeds/shravak-feeds.page').then(m => m.ShravakFeedsPage) + }, + { + path: Roots.sanghFeeds, + loadComponent: () => import('./shravak/shravak-feeds/shravak-feeds.page').then(m => m.ShravakFeedsPage) + }, + { + path: Roots.santInfo, + loadComponent: () => import('./sant/sant-information/sant-information.page').then(m => m.SantInformationPage) + }, + { + path: Roots.aboutDiksha, + loadComponent: () => import('./sant/about-diksha/about-diksha.page').then(m => m.AboutDikshaPage) + }, + { + path: Roots.aboutSansarikJeevan, + loadComponent: () => import('./sant/about-sansarik-jeevan/about-sansarik-jeevan.page').then(m => m.AboutSansarikJeevanPage) + }, + { + path: Roots.santProfileImage, + loadComponent: () => import('./sant/sant-profile-image/sant-profile-image.page').then(m => m.SantProfileImagePage) + }, + { + path: Roots.santViewProfile, + loadComponent: () => import('./sant/sant-view-profile/sant-view-profile.page').then(m => m.SantViewProfilePage) + }, + { + path: Roots.santBio, + loadComponent: () => import('./sant/sant-bio/sant-bio.page').then(m => m.SantBioPage) + }, + { + path: Roots.viharInfo, + loadComponent: () => import('./sant/vihar-info/vihar-info.page').then(m => m.ViharInfoPage) + }, + { + path: Roots.chaturmasInfo, + loadComponent: () => import('./sant/chaturmas-info/chaturmas-info.page').then(m => m.ChaturmasInfoPage) + }, + { + path: Roots.createdAccount, + loadComponent: () => import('./common/create-account/create-account.page').then(m => m.CreateAccountPage) + }, + { + path: Roots.menu, + loadComponent: () => import('./common/menu/menu.page').then(m => m.MenuPage) + }, + { + path: Roots.shravakViewProfile, + loadComponent: () => import('./shravak/shravak-view-profile/shravak-view-profile.page').then(m => m.ShravakViewProfilePage) + }, + { + path: Roots.shravakAbout, + loadComponent: () => import('./shravak/shravak-about/shravak-about.page').then(m => m.ShravakAboutPage) + }, + { + path: Roots.createNewSant, + loadComponent: () => import('./sant/create-new-sant/create-new-sant.page').then(m => m.CreateNewSantPage) + }, + { + path: Roots.shravakOtherProfile, + loadComponent: () => import('./shravak/shravak-other-profile/shravak-other-profile.page').then(m => m.ShravakOtherProfilePage) + }, + { + path: Roots.passiveUserInformation, + loadComponent: () => import('./shravak/passive-user-information/passive-user-information.page') + .then(m => m.PassiveUserInformationPage) + }, + { + path: Roots.passiveUserEducation, + loadComponent: () => import('./shravak/passive-user-education/passive-user-education.page').then(m => m.PassiveUserEducationPage) + }, + { + path: Roots.passiveUserProfileImage, + loadComponent: () => import('./shravak/passive-user-profile-image/passive-user-profile-image.page').then(m => + m.PassiveUserProfileImagePage) + }, + { + path: Roots.shravakEditProfile, + loadComponent: () => import('./shravak/shravak-edit-profile/shravak-edit-profile.page').then(m => m.ShravakEditProfilePage) + }, + { + path: Roots.postFeed, + loadComponent: () => import('./post/post-feed/post-feed.page').then(m => m.PostFeedPage) + }, + { + path: Roots.postType, + loadComponent: () => import('./post/post-type/post-type.page').then(m => m.PostTypePage) + }, + { + path: Roots.globalSearch, + loadComponent: () => import('./common/global-search/global-search.page').then(m => m.GlobalSearchPage) + }, + { + path: Roots.shravakAboutOther, + loadComponent: () => import('./shravak/shravak-other-about/shravak-other-about.page').then(m => m.ShravakOtherAboutPage) + }, + { + path: Roots.shravakEditLocation, + loadComponent: () => import('./shravak/shravak-edit-location/shravak-edit-location.page').then(m => m.ShravakEditLocationPage) + }, + { + path: Roots.shravakEditContactInfo, + loadComponent: () => import('./shravak/shravak-edit-contact-info/shravak-edit-contact-info.page') + .then(m => m.ShravakEditContactInfoPage) + }, + { + path: Roots.shravakEditFamilyMembers, + loadComponent: () => import('./shravak/shravak-edit-family-members/shravak-edit-family-members.page') + .then(m => m.ShravakEditFamilyMembersPage) + }, + { + path: Roots.shravakEditWork, + loadComponent: () => import('./shravak/shravak-edit-work/shravak-edit-work.page').then(m => m.ShravakEditWorkPage) + }, + { + path: Roots.shravakEditEducation, + loadComponent: () => import('./shravak/shravak-edit-education/shravak-edit-education.page').then(m => m.ShravakEditEducationPage) + }, + { + path: Roots.message, + loadComponent: () => import('./messages/message/message.page').then(m => m.MessagePage) + }, + { + path: Roots.messageChat, + loadComponent: () => import('./messages/message-chat/message-chat.page').then(m => m.MessageChatPage) + }, + { + path: Roots.notification, + loadComponent: () => import('./common/notification/notification.page').then(m => m.NotificationPage) + }, + { + path: Roots.friendRequest, + loadComponent: () => import('./shravak/friend-request/friend-request.page').then(m => m.FriendRequestPage) + }, + { + path: Roots.viharModal, + loadComponent: () => import('./sant/vihar-modal/vihar-modal.page').then(m => m.ViharModalPage) + }, + { + path: Roots.viewAll, + loadComponent: () => import('./sant/view-all/view-all.page').then(m => m.ViewAllPage) + }, + { + path: Roots.sanghTermPolicy, + loadComponent: () => import('./sangh/sangh-term-policy/sangh-term-policy.component').then(m => m.SanghTermPolicyComponent) + }, + { + path: Roots.sanghInformation, + loadComponent: () => import('./sangh/sangh-information/sangh-information.page').then(m => m.SanghInformationPage) + }, + { + path: Roots.sanghAddress, + loadComponent: () => import('./sangh/sangh-address/sangh-address.page').then(m => m.SanghAddressPage) + }, + { + path: Roots.sanghFacilities, + loadComponent: () => import('./sangh/sangh-facilities/sangh-facilities.page').then(m => m.SanghFacilitiesPage) + }, + { + path: Roots.sanghDonation, + loadComponent: () => import('./sangh/sangh-donation/sangh-donation.page').then(m => m.SanghAddressPage) + }, + { + path: Roots.sanghProfileImage, + loadComponent: () => import('./sangh/sangh-profile-image/sangh-profile-image.page').then(m => m.SanghProfileImagePage) + }, + { + path: Roots.chaturmasVihar, + loadComponent: () => import('./sangh/chaturmas-vihar/chaturmas-vihar.page').then(m => m.ViharSanghPage) + }, + { + path: Roots.inviteMembers, + loadComponent: () => import('./sangh/invite-members/invite-members.page').then(m => m.InviteMembersPage) + }, + { + path: Roots.sanghProfile, + loadComponent: () => import('./sangh/sangh-profile/sangh-profile.page').then(m => m.SanghProfilePage) + }, + { + path: Roots.sanghMemberCard, + loadComponent: () => import('./sangh/sangh-member-card/sangh-member-card.page').then(m => m.SanghMemberCardPage) + }, + { + path: Roots.sanghMembersAdminView, + loadComponent: () => import('./sangh/sangh-members-admin-view/sangh-members-admin-view.page') + .then(m => m.SanghMembersAdminViewPage) + }, + { + path: Roots.sanghSearchMember, + loadComponent: () => import('./sangh/sangh-search-member/sangh-search-member.page').then(m => m.SanghSearchMemberPage) + }, + { + path: Roots.sanghRoleSelect, + loadComponent: () => import('./sangh/sangh-role-select/sangh-role-select.page').then(m => m.SanghRoleSelectPage) + }, + { + path: Roots.sanghEditProfile, + loadComponent: () => import('./sangh/sangh-edit-profile/sangh-edit-profile.page').then(m => m.SanghEditProfilePage) + }, + { + path: Roots.addLocation, + loadComponent: () => import('./post/add-location/add-location.page').then(m => m.AddLocationPage) + }, + { + path: Roots.taggedUsers, + loadComponent: () => import('./post/tagged-user/tagged-user.page').then(m => m.TaggedUserPage) + }, + { + path: Roots.searchSant, + loadComponent: () => import('./sant/search-sant/search-sant.page').then(m => m.SearchSantPage) + }, + { + path: Roots.postDetail, + loadComponent: () => import('./post/post-detail/post-detail.page').then(m => m.PostDetailPage) + }, + { + path: Roots.postDetailURL, + loadComponent: () => import('./post/post-detail/post-detail.page').then(m => m.PostDetailPage) + }, + { + path: Roots.selectSangh, + loadComponent: () => import('./post/select-sangh/select-sangh.page').then(m => m.SelectSanghPage) + }, + { + path: Roots.createNewSangh, + loadComponent: () => import('./sangh/create-new-sangh/create-new-sangh.page').then(m => m.CreateNewSanghPage) + }, + { + path: Roots.addChaturmas, + loadComponent: () => import('./sant/add-chaturmas/add-chaturmas.page').then(m => m.AddChaturmasPage) + }, + { + path: Roots.viewAllSangh, + loadComponent: () => import('./sangh/view-all-sangh/view-all-sangh.page').then(m => m.ViewAllSanghPage) + }, + { + path: Roots.addCommitteeMember, + loadComponent: () => import('./sangh/add-committee-member/add-committee-member.page').then(m => m.AddCommitteeMemberPage) + }, + { + path: Roots.invitations, + loadComponent: () => import('./sangh/invitations/invitations.page').then(m => m.InvitationsPage) + }, + { + path: Roots.aboutSangh, + loadComponent: () => import('./sangh/about-sangh/about-sangh.page').then(m => m.AboutSanghPage) + }, + { + path: Roots.visibilityPolicy, + loadComponent: () => import('./common/visibility-policy/visibility-policy.page').then(m => m.VisibilityPolicyPage) + }, + { + path: Roots.termsPolicy, + loadComponent: () => import('./common/terms-policy/terms-policy.page').then(m => m.TermsPolicyPage) + }, + { + path: Roots.thanaList, + loadComponent: () => import('./sant/thana-list/thana-list.page').then(m => m.ThanaListPage) + }, + { + path: Roots.addThana, + loadComponent: () => import('./sant/add-thana/add-thana.page').then(m => m.AddThanaPage) + }, + { + path: Roots.friendList, + loadComponent: () => import('./shravak/friend-list/friend-list.page').then(m => m.FriendListPage) + }, + { + path: Roots.friendsSuggestionsViewAll, + loadComponent: () => import('./shravak/friends-suggestions-view-all/friends-suggestions-view-all.page') + .then(m => m.FriendsSuggestionsViewAllPage) + }, + { + path: Roots.searchFriend, + loadComponent: () => import('./shravak/search-friend/search-friend.page').then(m => m.SearchFriendPage) + }, + { + path: Roots.imageView, + loadComponent: () => import('./common/image-view/image-view.page').then(m => m.ImageViewPage) + }, + { + path: Roots.settings, + loadComponent: () => import('./settings/settings.page').then(m => m.SettingsPage) + }, + { + path: Roots.certificate, + loadComponent: () => import('./common/discount-certificate/discount-certificate.page').then(m => m.DiscountCertificatePage) + }, +]; diff --git a/src/app/pages/post/add-location/add-location.page.html b/src/app/pages/post/add-location/add-location.page.html new file mode 100644 index 0000000..0ceb0d0 --- /dev/null +++ b/src/app/pages/post/add-location/add-location.page.html @@ -0,0 +1,17 @@ + + + + + + Add location + + + + + + + + + Add location + \ No newline at end of file diff --git a/src/app/pages/post/add-location/add-location.page.scss b/src/app/pages/post/add-location/add-location.page.scss new file mode 100644 index 0000000..1b03217 --- /dev/null +++ b/src/app/pages/post/add-location/add-location.page.scss @@ -0,0 +1,57 @@ +app-add-location { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + --padding-top: var(--ion-padding-15); + + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 22.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #FF6331; + } + } + } + + ion-item::part(detail-icon) { + display: none; + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.813rem; + } + } + + ion-footer { + padding: var(--ion-padding-0); + margin-bottom: 10px; + } +} \ No newline at end of file diff --git a/src/app/pages/post/add-location/add-location.page.ts b/src/app/pages/post/add-location/add-location.page.ts new file mode 100644 index 0000000..aa752db --- /dev/null +++ b/src/app/pages/post/add-location/add-location.page.ts @@ -0,0 +1,60 @@ +import { NgClass } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-add-location', + templateUrl: './add-location.page.html', + styleUrls: ['./add-location.page.scss'], + standalone: true, + imports: [IonicModule, NgClass, FormsModule] +}) +export class AddLocationPage implements OnInit { + @ViewChild('Location') location: ElementRef; + addLocation = ''; + addLocationLat = ''; + addLocationLong = ''; + type: number; + constructor( + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private router: Router, + private utilityService: UtilityService, + ) { + if (this.router.getCurrentNavigation().extras.state) { + if (this.router.getCurrentNavigation().extras.state.type) { + this.type = this.router.getCurrentNavigation().extras.state.type; + } + } + } + + ngOnInit() { + this.addLocation = this.router.getCurrentNavigation().extras.state.addLocation; + this.addLocationLat = this.router.getCurrentNavigation().extras.state.addLocationLat; + this.addLocationLong = this.router.getCurrentNavigation().extras.state.addLocationLong; + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.location.nativeElement, []).subscribe((details) => { + this.addLocation = this.location.nativeElement.value; + this.addLocationLat = details.geometry.location.lat(); + this.addLocationLong = details.geometry.location.lng(); + }); + } + + removeLatAndLong() { + this.addLocationLat = ''; + this.addLocationLong = ''; + } + + submitLocation() { + this.stateManagementService.postLocationSubject.next(this.addLocation); + this.stateManagementService.postLocationLatSubject.next(this.addLocationLat); + this.stateManagementService.postLocationLongSubject.next(this.addLocationLong); + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed); + } +} diff --git a/src/app/pages/post/post-detail/post-detail.page.html b/src/app/pages/post/post-detail/post-detail.page.html new file mode 100644 index 0000000..1a68d96 --- /dev/null +++ b/src/app/pages/post/post-detail/post-detail.page.html @@ -0,0 +1,64 @@ + + + + + + Post detail + + + +
+
+ + + + + + + +
+
+ {{comment?.user?.name}}{{ comment?.created_ago }} +
+ {{comment.showMore ? comment.comment : trimString(comment.comment,100)}} + Show + + + +
+ + +
+ + + + + + + Report comment + + + + + +
+ + + + +
+
+
+
+
+ + + + diff --git a/src/app/pages/post/post-detail/post-detail.page.scss b/src/app/pages/post/post-detail/post-detail.page.scss new file mode 100644 index 0000000..ef0b043 --- /dev/null +++ b/src/app/pages/post/post-detail/post-detail.page.scss @@ -0,0 +1,228 @@ +app-post-detail { + ion-content { + .bg { + background: var(--ion-background-content); + padding-bottom: var(--ion-padding-15); + padding-top: var(--ion-padding-15); + min-height: 90%; + + .img-common { + background: var(--ion-background-content); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + object-fit: cover; + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15); + border-radius: 0; + + ion-card-header { + ion-card-title { + display: flex; + + ion-icon { + width: 23px; + height: 23px; + padding: 3px 6px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + } + + img { + width: 2.625rem !important; + height: 2.625rem !important; + } + + &:first-child { + background: #e7f7fe; + border-top: 2px solid var(--ion-color); + border-bottom: 2px solid var(--ion-color); + } + } + + ion-card-content { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0); + display: flex; + justify-content: space-between; + + p { + padding: var(--ion-padding-0); + + span { + color: var(--ion-color); + } + + a { + span { + color: var(--ion-color, #3880ff); + } + } + } + } + + &.detail { + ion-card-header { + align-items: flex-start; + + ion-card-title { + font-size: var(--ion-font-size-14); + position: relative; + width: 100%; + align-items: center; + margin: var(--ion-margin-0); + + ion-icon { + margin: var(--ion-margin-0); + background: none; + color: var(--ion-content-color); + } + } + + &.comment { + padding: var(--ion-padding-10); + + ion-card-title { + >div { + background: #f3f3f3; + padding: 7px; + border-radius: 5px; + width: auto; + margin-left: var(--ion-margin-10); + + span { + color: #000; + word-break: break-word; + font-weight: 400; + font-size: var(--ion-font-size-12); + margin-top: 0.113rem; + + span { + display: inline; + color: var(--ion-color, #3880ff); + } + } + + div { + word-break: break-word; + width: auto; + font-weight: 600; + + span { + color: var(--ion-content-color); + margin-left: var(--ion-margin-10); + font-weight: 400; + float: right; + } + } + } + } + } + } + + ion-card-content { + display: block; + border-bottom: 1px solid #ddd; + + p { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10); + color: #000; + } + + .img-upload { + text-align: center; + flex-wrap: wrap; + + swiper-container { + &::part(pagination) { + width: 100%; + height: 21px; + background-color: var(--ion-color); + bottom: 0px; + } + + &::part(bullet) { + background-color: var(--ion-background-gray); + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + } + } + } + } + + &.sangh { + ion-card { + &.detail { + ion-card-header { + &:first-child { + background: #f3e1fc; + border-top: 2px solid var(--ion-color-sangh); + border-bottom: 2px solid var(--ion-color-sangh); + + ion-card-title { + div { + p { + color: #000; + } + + span { + color: var(--ion-color-sangh); + } + } + } + + p { + color: var(--ion-color-sangh); + } + } + } + } + } + } + } + } + } + + ion-footer { + position: relative; + margin-bottom: 10px; + + ion-textarea { + padding: 10px; + + .textarea-wrapper { + min-height: 30px !important; + max-height: 120px !important; + } + + textarea { + padding: var(--ion-padding-10) var(--ion-padding-40) var(--ion-padding-10) var(--ion-padding-10) !important; + border: 1px solid #aeb6bf !important; + border-radius: 5px !important; + } + } + + ion-icon { + position: absolute; + right: 18px; + bottom: 18px; + z-index: 9; + font-size: 27px; + color: var(--ion-color); + } + } +} \ No newline at end of file diff --git a/src/app/pages/post/post-detail/post-detail.page.ts b/src/app/pages/post/post-detail/post-detail.page.ts new file mode 100644 index 0000000..a2e4442 --- /dev/null +++ b/src/app/pages/post/post-detail/post-detail.page.ts @@ -0,0 +1,150 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { AfterViewInit, Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { PostComponent } from '@components/post/post.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommentList, PostList, UserData } from '@interfaces/common'; +import { IonTextarea, IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-post-detail', + templateUrl: './post-detail.page.html', + styleUrls: ['./post-detail.page.scss'], + encapsulation: ViewEncapsulation.None, + standalone: true, + imports: [IonicModule, NgClass, NgIf, PostComponent, NgFor, FormsModule] +}) +export class PostDetailPage implements OnInit, AfterViewInit { + @ViewChild('text') textElement: IonTextarea; + postDetail: PostList; + postId: string; + commentValue: string; + userData: UserData; + pageNumber = 1; + totalPage = 1; + commentList: Array = []; + totalCommentCount: number; + type: string; + + constructor( + private router: Router, + private route: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private utilityService: UtilityService + ) { + if (this.router.getCurrentNavigation().extras.state) { + this.postId = this.router.getCurrentNavigation().extras.state.postId; + if (this.router.getCurrentNavigation().extras.state.type) { + this.type = this.router.getCurrentNavigation().extras.state.type; + } + } + if (this.route.snapshot.params.postId) { + this.postId = this.route.snapshot.params.postId; + this.type = this.route.snapshot.queryParams.type; + } + } + + get postType() { + return (+this.type === 1) ? 'shravak' : (+this.type === 2) ? 'sant' : 'sangh'; + } + + ngOnInit() { + this.getPostDetail(); + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + if (this.type !== '3') { + this.commentListing(false, ''); + } + } + + ngAfterViewInit() { + setTimeout(() => { + if (this.textElement) { + this.textElement.autoGrow = true; + this.textElement.setFocus(); + } + }, 400); + } + + getPostDetail() { + this.httpRequestService.get(api.postDetail + '/' + this.postId).then((res: any) => { + this.postDetail = res.data; + this.type = res.data.type; + }); + } + + addComment() { + if (this.commentValue) { + const params = { + post_id: this.postId, + comment: this.commentValue + }; + this.httpRequestService.post(api.addComment, params).then((res: any) => { + this.commentValue = ''; + if (this.commentList) { + this.commentList.push(res.data.comment); + } else { + this.commentList = [res.data.comment]; + } + if (this.postDetail) { + this.postDetail.comments_count = res.data.comments_count; + } + this.totalCommentCount = res.data.comments_count; + this.alert.showToaster(res.message); + }); + } + } + + moveToProfile(id) { + if (id === this.userData.id) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + } + + commentListing(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const params = { + page: this.pageNumber, + limit: 10 + }; + this.httpRequestService.post(api.commentList.replace('{post_id}', String(this.postId)), params) + .then((res: any) => { + this.totalPage = res.data.last_page; + this.totalCommentCount = res.data.total; + if (this.postDetail) { + this.postDetail.comments_count = this.totalCommentCount; + } + this.commentList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } + } + + loadData($event) { + this.commentListing(true, $event); + } + + trimString(stringValue, length) { + return stringValue && stringValue.length > length ? stringValue.substring(0, length) + '...' : stringValue; + } + + + openReport(id) { + this.utilityService.openReport({ commentId: id, type: this.postType }); + } +} diff --git a/src/app/pages/post/post-feed/post-feed.page.html b/src/app/pages/post/post-feed/post-feed.page.html new file mode 100644 index 0000000..137d9eb --- /dev/null +++ b/src/app/pages/post/post-feed/post-feed.page.html @@ -0,0 +1,140 @@ + + + + + + Create post + Post + + + +
+ + + +
+
+ + +
+
+

{{ userName }} with {{ tagUserList[0]?.name }} and {{ tagUserList.length-1 }} + others in {{ location }}

+
+ + {{privacy.name}} + + + {{ postType }} +
+
+ + On Your Timeline + On Sangh's Timeline + + + {{ selectedSangh.length ? 'Selected('+selectedSangh.length+')': 'Select Sangh' }} + +
+
+
+
+ + +
+ + + +
+ + Add image + + + +
+
+ + + +
+
+
+
+
+
+ + + + + + +

{{ user.name }}

+
+
+ + +

No results for "{{tagUserInput}}"

+
+
+
+
+
+ +
+
+ +
+ + + + + + +

{{ item.name }}

+
+
+
+
+ +
+ + + +

Want to finish your post later? Save it as a draft or you can continue editing it.

+ +
+
+
diff --git a/src/app/pages/post/post-feed/post-feed.page.scss b/src/app/pages/post/post-feed/post-feed.page.scss new file mode 100644 index 0000000..0dff2ba --- /dev/null +++ b/src/app/pages/post/post-feed/post-feed.page.scss @@ -0,0 +1,505 @@ +.post-feed-icons { + width: 30px; + height: 30px; + padding: 8px; + display: flex; + align-items: center; + justify-content: center; +} + +app-post-feed { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + --background: var(--ion-color-white); + box-shadow: 0px 1px 1px #dbdbdb; + color: var(--ion-color); + --min-height: 50px; + border-radius: 0; + + ion-button { + height: 30px; + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + --border-radius: 5px; + } + + ion-buttons { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-15); + } + + ion-title { + color: var(--ion-color); + font-size: var(--ion-font-size-14); + padding-left: var(--ion-padding-0); + + &.ios { + position: relative; + } + } + + ion-icon { + color: var(--ion-color); + margin: var(--ion-margin-0); + vertical-align: middle; + font-size: 25px; + } + } + } + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15); + padding: var(--ion-padding-15) var(--ion-padding-15) 0; + box-shadow: 0px 0px 12px #ebebeb; + border-radius: 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin-bottom: var(--ion-margin-10); + align-items: center; + + &:last-child { + margin-bottom: var(--ion-margin-0); + } + + .left-data { + display: flex; + width: 100%; + + .icons { + width: 39px; + height: 39px; + + &.family-members { + padding: var(--ion-padding-0); + overflow: hidden; + + img { + border-radius: 100%; + height: inherit; + width: 100%; + } + } + } + + .inner-data { + width: calc(100% - 50px); + + .select-group { + display: flex; + + &+.select-group { + margin-top: 10px; + } + + .select-sangh { + &::part(native) { + color: var(--ion-content-color); + } + + &.selected { + &::part(native) { + color: var(--ion-color); + } + } + } + } + + .w-50 { + width: 50%; + min-height: 20px; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-16); + color: #000; + font-weight: 600; + + span { + color: var(--ion-content-color); + } + } + + ion-select { + font-size: var(--ion-font-size-14); + color: var(--ion-content-color); + padding: var(--ion-padding-0) 7px; + width: fit-content; + border: 1px solid #dbdbdb; + border-radius: 12px; + margin-right: var(--ion-margin-10); + + &+ion-select { + margin-right: var(--ion-margin-0); + + :not(.legacy-select) { + min-height: initial; + } + } + } + + ion-button { + color: var(--ion-color); + padding: var(--ion-padding-0); + width: fit-content; + border: 1px solid #dbdbdb; + border-radius: 12px; + height: 20px; + line-height: 20px !important; + margin: var(--ion-margin-0); + + &::part(native) { + font-size: 14px; + background: none; + text-transform: capitalize; + font-weight: 600; + box-shadow: none; + padding: var(--ion-padding-0) 8px; + } + } + } + + .custom-select { + --border-width: 0; + border-width: 0; + font-size: 14px; + border-radius: 5px; + overflow: hidden; + border-radius: 0.25rem; + height: initial !important; + + &::part(icon) { + display: none; + } + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-input { + border: 1px solid #e9e9e9; + margin-top: var(--ion-margin-10); + border-radius: 8px; + + input { + padding-right: var(--ion-padding-10) !important; + padding-left: var(--ion-padding-10); + } + } + } + } + + .bg { + height: 76%; + + ion-card { + padding: var(--ion-padding-10); + + .img-upload { + display: flex; + flex-wrap: wrap; + + div { + display: flex; + width: 48%; + margin-bottom: var(--ion-margin-10); + position: relative; + + &:nth-child(odd) { + margin-right: var(--ion-margin-10); + } + + img { + border-radius: 10px; + display: block; + height: 100%; + } + + ion-icon { + position: absolute; + background: var(--ion-color-white); + font-size: 20px; + border-radius: var(--ion-border-radius-100); + color: #343434; + right: 5px; + top: 5px; + } + } + } + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-15); + + &::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + box-shadow: none; + font-size: var(--ion-font-size-14); + } + + ion-icon { + margin-right: 10px; + } + } + } + + .search-data { + position: absolute; + bottom: 0px; + top: auto; + padding: var(--ion-padding-0); + } + } + + ion-footer { + margin-bottom: 15px; + + .footer-icon { + div { + display: flex; + align-items: center; + color: #bdbdbd; + font-weight: 600; + padding: var(--ion-padding-10) var(--ion-padding-15); + border-top: 1px solid #e1e1e1; + font-size: var(--ion-font-size-14); + } + + .tag-shravak-div { + padding: var(--ion-padding-0) var(--ion-padding-15); + } + + ion-icon { + width: 18px; + height: 18px; + padding: 6px; + } + + + ion-text { + width: calc(100% - 40px); + } + } + + input[type="text"] { + padding: var(--ion-padding-0) !important; + font-size: var(--ion-font-size-14) !important; + height: 35px; + width: calc(100% - 30px); + border: 0; + outline: none; + } + } + + .sangh-post { + + ion-title, + ion-buttons ion-icon { + color: var(--ion-color-sangh); + } + + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + .bg { + ion-card { + ion-button { + &::part(native) { + color: var(--ion-color-sangh); + } + } + } + } + + .footer-icon { + .tag-people-sangh { + display: block; + } + + .tag-people-shravak { + display: none; + } + + ion-icon { + color: var(--ion-color-sangh); + } + } + } +} + +.tag-people-sangh { + display: none; +} + +.tag-people-shravak { + display: block; +} + +ion-modal { + &.post-option { + ion-content { + p { + padding: var(--ion-padding-10) var(--ion-padding-15); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + + span { + color: var(--ion-content-color); + display: block; + } + } + + .footer-icon { + >div { + display: flex; + align-items: center; + color: var(--ion-color); + font-weight: 600; + padding: var(--ion-padding-10) var(--ion-padding-15); + border-top: 1px solid #e1e1e1; + font-size: var(--ion-font-size-14); + + &.discardpost { + color: red; + + ion-icon { + color: red; + } + } + } + + ion-icon { + width: 18px; + height: 18px; + padding: 6px; + } + } + + &.sangh-post { + .footer-icon { + >div { + color: var(--ion-color-sangh); + + &.discardpost { + color: red; + + ion-icon { + color: red; + } + } + } + } + + .tag-people-sangh { + display: block; + } + + .tag-people-shravak { + display: none; + } + } + } + } +} + +ion-popover { + &.crop-popover { + overflow: hidden; + + &::part(content) { + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + } + + .popover-viewport { + overflow: hidden; + + .backdrop { + overflow: hidden; + + .modal-body { + padding-bottom: 30px; + overflow: auto; + height: 90vh; + } + + .modal-footer { + position: absolute; + bottom: 0; + height: 40px; + width: 100%; + + button { + background: var(--ion-color); + height: 40px; + width: 100%; + color: #fff; + } + } + } + } + } +} + +.mention-popup { + display: none; + margin: val(--ion-margin-10) auto -10px; + height: 260px; + width: 70%; + background-color: var(--ion-color-white); + border: 1px solid var(--ion-background-gray); + border-radius: 10px; + overflow-y: auto; + box-shadow: 0px -1px 10px 2px var(--ion-background-gray); + transition: 300ms; + + .list-ios { + margin-bottom: var(--ion-margin-0); + } + + &.open { + display: block; + position: sticky; + z-index: 11; + bottom: 0; + } + + ion-label { + border: none; + } + + ion-item { + margin-bottom: var(--ion-margin-0); + } +} + +.icon-common { + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); +} \ No newline at end of file diff --git a/src/app/pages/post/post-feed/post-feed.page.ts b/src/app/pages/post/post-feed/post-feed.page.ts new file mode 100644 index 0000000..3241a26 --- /dev/null +++ b/src/app/pages/post/post-feed/post-feed.page.ts @@ -0,0 +1,509 @@ +import { ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { Capacitor } from '@capacitor/core'; +import { Keyboard } from '@capacitor/keyboard'; +import { IonPopover, IonTextarea, IonicModule, ModalController, NavController, Platform, PopoverController } from '@ionic/angular'; +import { Subject, takeUntil } from 'rxjs'; + +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { PostList, Privacy, ProfileData, ProfileResponse } from '@interfaces/common'; +import { TaggedUserPage } from '@pages/post/tagged-user/tagged-user.page'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +const SANGH_POST_TYPE = 3; +@Component({ + selector: 'app-post-feed', + templateUrl: './post-feed.page.html', + styleUrls: ['./post-feed.page.scss'], + standalone: true, + imports: [IonicModule, NgClass, NgIf, FormsModule, NgFor, SafeUrlPipe] +}) +export class PostFeedPage implements OnInit, OnDestroy { + @ViewChild('fileInput', { static: true }) fileInput: ElementRef; + @ViewChild('personalLocation') personalLocation: ElementRef; + @ViewChild('text') textElement: IonTextarea; + @ViewChild('mentionsPopover') mentionsPopover: IonPopover; + updatePhotos = []; // images which uploaded at update time + imageArray = []; //images which uploaded at create time + removeImageId = []; // id of image which are removed at update time + userList = []; + tagUserList = []; + description = ''; + postPrivacy = 1; // 1 for public , 2 for private + location: string; + locationLat: string; + locationLong: string; + isUpdate = false; + isDraft = false; + statusCode: number; + tagUserInput: string; + post: PostList; + userProfileData: ProfileData; + draftPost: any; + postType = 'General'; + categoryId = null; + privacyList: Privacy[] = constants.postPrivacy; + privacyListSangh: Privacy[] = constants.postPrivacySangh; + redirectTo: string; + type_id: number; + type: number; + userAvatar: string; + userName: string; + uploadedFiles: string[] = []; + selectedSangh: number[] = []; + isSanghMember: number; + openSantSangh = false; + loaderSantSangh = false; + santSanghList = []; + mentions = []; + mentionText: string; + mentionTextIndex: number; + prevValue: string; + private destroy$ = new Subject(); + + constructor( + private alert: AlertService, + private navCtrl: NavController, + private modalController: ModalController, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + private router: Router, + private platform: Platform, + private popoverCtrl: PopoverController, + private cameraGalleryService: CameraGalleryService, + private utilityService: UtilityService, + private change: ChangeDetectorRef, + ) { + this.categoryId = 5; + } + + async ngOnInit() { + if (this.router.getCurrentNavigation().extras.state) { + this.userAvatar = this.router.getCurrentNavigation().extras.state?.userAvatar; + this.userName = this.router.getCurrentNavigation().extras.state?.userName; + this.redirectTo = this.router.getCurrentNavigation().extras.state?.redirectTo; + if (this.router.getCurrentNavigation().extras.state.isUpdate) { + this.isUpdate = this.router.getCurrentNavigation().extras.state.isUpdate; + } + if (this.router.getCurrentNavigation().extras.state.postData) { + this.post = this.router.getCurrentNavigation().extras.state.postData; + } + if (this.router.getCurrentNavigation().extras.state.type) { + this.type = this.router.getCurrentNavigation().extras.state.type; + if (this.type === SANGH_POST_TYPE) { + this.privacyList = this.privacyListSangh; + } + } + if (this.router.getCurrentNavigation().extras.state.type_id) { + if (this.type === SANGH_POST_TYPE) { + this.selectedSangh = [this.router.getCurrentNavigation().extras.state.type_id]; + } else { + this.type_id = this.router.getCurrentNavigation().extras.state.type_id; + } + } + if (this.router.getCurrentNavigation().extras.state.send) { + this.handleSharedData(); + } + } + if (!this.isUpdate && this.type !== SANGH_POST_TYPE) { + await this.getDraftPostList(); + if (this.draftPost.data) { + this.isDraft = true; + this.post = this.draftPost.data; + } + } + const userData = await this.stateManagementService.storage.get(GJainStorage.userData); + if (userData) { + this.userProfileData = userData; + } else { + this.getProfileInfo(); + } + + if (this.stateManagementService?.imageArray?.length > 0) { + this.stateManagementService?.imageArray.forEach((image) => { + this.uploadedFiles.push(image.imgString); + this.imageArray.push(image.itemImage); + }); + } + + if (this.isUpdate || this.isDraft) { + this.description = this.post.description ? this.post.description : ''; + this.postPrivacy = this.post.privacy; + this.location = this.post.location; + this.locationLat = this.post.lat; + this.locationLong = this.post.long; + this.statusCode = this.post.status; + this.updatePhotos = this.post.post_images; + this.uploadedFiles = this.post.post_images.map((img) => img.image_name); + this.tagUserList = this.post.tag_users; + this.categoryId = this.post.category_id; + this.postType = this.post.category.name; + this.type = this.post.type ? this.post.type : 1; + this.type_id = this.post.type_id ? this.post.type_id : this.post.created_by.id; + this.mentions = this.post.mentions; + } + this.stateManagementService.postTypeSubject.pipe(takeUntil(this.destroy$)).subscribe((res: any) => { + this.categoryId = res.id; + this.postType = res.name; + }); + this.stateManagementService.postSelectedSanghSubject.pipe(takeUntil(this.destroy$)).subscribe(res => { + this.selectedSangh = res; + }); + this.stateManagementService.postLocationSubject.pipe(takeUntil(this.destroy$)).subscribe((res: any) => { + this.location = res; + }); + this.stateManagementService.postLocationLatSubject.pipe(takeUntil(this.destroy$)).subscribe((res: any) => { + this.locationLat = res; + }); + this.stateManagementService.postLocationLongSubject.pipe(takeUntil(this.destroy$)).subscribe((res: any) => { + this.locationLong = res; + }); + this.changePostType(); + } + + ionViewDidEnter() { + + // ---- + const checkRouteLinkAndPop = () => { + if (this.router.url === ('/' + Roots.page + '/' + Roots.postFeed)) { + document.getElementById('trigger-button').click(); + } else { + this.navCtrl.pop(); + } + }; + + if (this.platform.is('android')) { + this.platform.backButton.subscribeWithPriority(0, async () => { + if (this.popoverCtrl.getTop()) { + const modal = await this.popoverCtrl.getTop(); + if (modal) { + this.popoverCtrl.dismiss(); + return; + } else { + checkRouteLinkAndPop(); + } + } else { + checkRouteLinkAndPop(); + } + }); + } + + if (Capacitor.isPluginAvailable('Keyboard')) { + Keyboard.addListener('keyboardWillHide', () => { + this.openSantSangh = false; + this.change.detectChanges(); + }); + } + } + + getProfileInfo() { + this.httpRequestService.get(api.shravakProfile).then((res: ProfileResponse) => { + this.userProfileData = res.data; + this.stateManagementService.userProfileData = res.data; + this.stateManagementService.storage.set(GJainStorage.profileData, res.data); + }); + } + + async getDraftPostList() { + try { + this.draftPost = await this.httpRequestService.get(api.draftPostList); + this.isSanghMember = this.draftPost.is_sangh_member; + } catch (e) { + console.log(e); + } + } + + async handleSharedData() { + if (this.stateManagementService.shareData?.length) { + for (const item of this.stateManagementService.shareData) { + if (decodeURIComponent(item.type) === 'text/plain') { + this.description = this.platform.is('android') ? decodeURIComponent(item.url) : decodeURIComponent(item.title); + } else if (decodeURIComponent(item.type).startsWith('image/')) { + const image = await this.cameraGalleryService.resolveURL(decodeURIComponent(item.webPath)); + this.validateAndAddImage(image); + } + } + } + } + + validateAndAddImage(image: { imgString: any; itemImage: any }) { + if (this.uploadedFiles.length === 3) { + this.alert.showToasterError('Max 3 image can be uploaded'); + return; + } + + const imageSize = image.itemImage.size / 1048576; // in MB + if (imageSize > 10) { + this.alert.showToasterError('Image size must be less than 10Mb'); + return; + } + + if ((imageSize <= 10) && (this.uploadedFiles.length < 3)) { + this.uploadedFiles.push(image.imgString); + this.imageArray.push(image.itemImage); + } + } + + selectImages() { + this.cameraGalleryService.selectMultipleImage(512, 512, false).then((imageData: Array<{ imgString: string; itemImage: Blob }>) => { + if (imageData && imageData.length > 0) { + imageData.forEach((image) => { + this.validateAndAddImage(image); + }); + } + }); + } + + removeImage(index) { + this.uploadedFiles.splice(index, 1); + if (index < this.updatePhotos.length) { + this.removeImageId.push(this.updatePhotos[index].id); + this.updatePhotos.splice(index, 1); + } else { + this.imageArray.splice(index, 1); + } + } + + getUserList(event) { + if (!event.value.trim()) { + return this.userList = []; + } + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue, true); + this.prevValue = event.value; + if (!isSameStr) { + const params = { + name: event.value.trim(), + already_tagged: this.tagUserList.map(ele => ele.id) + }; + const apiRoute = (+this.type === SANGH_POST_TYPE) ? api.userList : api.friendList; + this.httpRequestService.post(apiRoute, params).then((res: any) => { + this.userList = res.data; + }); + } + } + + tagUser(user) { + this.tagUserList.push(user); + this.tagUserInput = ''; + this.userList = []; + } + + createPost(statusCode) { + this.statusCode = statusCode; + let errMsg = ''; + if (!(this.description || this.imageArray.length !== 0 || this.updatePhotos.length !== 0)) { + errMsg = 'Please add any image or write something you want to share'; + } else if (!this.categoryId) { + errMsg = 'Please select post type'; + } else if (this.type === SANGH_POST_TYPE && this.selectedSangh.length === 0) { + errMsg = 'Please select sangh'; + } + + if (errMsg) { + this.alert.showToasterError(errMsg); + return; + } + + const formData = new FormData(); + formData.append('description', this.description); + formData.append('privacy', this.postPrivacy.toString()); + formData.append('category_id', this.categoryId); + formData.append('type', this.type.toString()); + formData.append('type_id', this.type === SANGH_POST_TYPE ? this.selectedSangh.join(',') : this.type_id.toString()); + if (this.location) { formData.append('location', this.location); } + if (this.locationLat) { formData.append('latitude', this.locationLat); } + if (this.locationLong) { formData.append('longitude', this.locationLong); } + for (const [index, image] of this.imageArray.entries()) { + formData.append(`images[${index}]`, image); + } + if (this.tagUserList) { + for (const [index, user] of this.tagUserList.entries()) { + formData.append(`user_id[${index}]`, user.id); + } + } + const currentlyMentioned = this.utilityService.extractMentionedNames(this.description, this.mentions); + if (currentlyMentioned.length) { + for (const [index, item] of currentlyMentioned.entries()) { + formData.append(`mentions[${index}][id]`, item.id); + formData.append(`mentions[${index}][type]`, item.type); + } + } + formData.append('status', this.statusCode.toString()); + this.alert.showSpinner(); + if (this.isUpdate || this.isDraft) { + for (const [index, imageId] of this.removeImageId.entries()) { + formData.append(`removed_image_id[${index}]`, imageId); + } + this.httpRequestService.post(api.updatePost + '/' + this.post.id, formData).then((res: any) => { + this.alert.showToaster(res.message); + }).finally(() => { + this.alert.hideLoader(); + this.mentions = []; + this.redirectToPage(this.redirectTo); + }); + } else { + this.httpRequestService.post(api.createPost, formData).then((res: any) => { + this.alert.showToaster(res.message); + if (+statusCode === 1) { + this.modalController.dismiss(); + } + }).finally(() => { + this.alert.hideLoader(); + this.mentions = []; + this.redirectToPage(this.redirectTo); + }); + } + } + + moveToPostType() { + const navOption = { + state: { + postType: this.categoryId ? this.categoryId : null, + isUpdate: this.isUpdate, + type: this.type + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postType, navOption); + } + + goToSelectSangh() { + const navOption = { + state: { + selectedSangh: this.selectedSangh + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.selectSangh, navOption); + } + + redirectToPage(route) { + this.navCtrl.navigateBack(route); + } + + async onModelOpen(taggedUsers) { + const componentProps = { + taggedUsers + }; + const modal = await this.modalController.create({ + component: TaggedUserPage, + componentProps, + mode: 'ios', + backdropDismiss: true, + breakpoints: [0.1, 0.6, 1], + initialBreakpoint: 0.6, + }); + return await modal.present(); + } + + continueEditing() { + this.modalController.dismiss(); + } + + discardPost() { + this.modalController.dismiss(); + if (this.isDraft) { + this.removeFromDraft(); + } + this.redirectToPage(this.redirectTo); + } + + removeFromDraft() { + this.alert.showSpinner(); + this.httpRequestService.delete(api.deletePost + '/' + this.post.id).then(() => { + this.alert.showToaster('Post removed from draft successfully.'); + }).finally(() => { + this.alert.hideLoader(); + }); + } + + addLocation() { + const navOption = { + state: { + addLocation: this.location ? this.location : '', + addLocationLat: this.locationLat ? this.locationLat : '', + addLocationLong: this.locationLong ? this.locationLong : '', + type: this.type, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.addLocation, navOption); + } + + changePostType() { + this.stateManagementService.postTypeSubject.next(this.type === SANGH_POST_TYPE ? { + id: 1, + name: 'Dharmik' + } : { + id: 5, + name: 'General', + }); + } + + searchSantSangh(str: string) { + this.loaderSantSangh = true; + this.httpRequestService + .post(api.globalSearch, { + name: str + }) + .then((res: any) => { + this.santSanghList = res.data; + if (!this.santSanghList.length) { this.openSantSangh = false; } + }).finally(() => { + this.loaderSantSangh = false; + }); + } + + async scanText() { + if (!this.description) { + this.openSantSangh = false; + return false; + } + + const textarea = await this.textElement.getInputElement(); + const startIndex = this.description.lastIndexOf('@', textarea.selectionStart - 1); + + if (startIndex !== -1) { + this.mentionText = this.description.substring(startIndex, textarea.selectionEnd); + this.mentionTextIndex = startIndex; + const wordHasAtSign = this.utilityService.extractWordsAfterAtSign(this.mentionText); + if (wordHasAtSign) { + this.openSantSangh = true; + this.searchSantSangh(wordHasAtSign.substring(1)); + } else { + this.openSantSangh = false; + } + } + } + + async appendToMessage(item: any) { + if (!this.mentions.some(i => i.id === item.id && i.name === item.name && i.type === item.type)) { + this.mentions.push((({ id, name, type }) => ({ id, name, type }))(item)); + } + + this.description = this.description.slice(0, this.mentionTextIndex) + + this.description.slice(this.mentionTextIndex).replace(this.mentionText, '@' + item.name + ' '); + + this.openSantSangh = false; + this.textElement.setFocus(); + } + + ionViewDidLeave() { + this.stateManagementService.imageArray = []; + this.stateManagementService.shareData = null; + this.stateManagementService.userSanghList = []; + } + + ngOnDestroy() { + this.destroy$.next(true); + this.destroy$.complete(); + } + +} diff --git a/src/app/pages/post/post-type/post-type.page.html b/src/app/pages/post/post-type/post-type.page.html new file mode 100644 index 0000000..01a4777 --- /dev/null +++ b/src/app/pages/post/post-type/post-type.page.html @@ -0,0 +1,29 @@ + + + + + + Post type + + + +
+

What is the post type? + Select type for your post +

+ + + + {{type.name}} + +

{{type.description}}

+
+
+
+
+
+
+
+ + Done + \ No newline at end of file diff --git a/src/app/pages/post/post-type/post-type.page.scss b/src/app/pages/post/post-type/post-type.page.scss new file mode 100644 index 0000000..9f669db --- /dev/null +++ b/src/app/pages/post/post-type/post-type.page.scss @@ -0,0 +1,128 @@ +app-post-type { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + --background: var(--ion-color-white); + box-shadow: 0px 1px 1px #dbdbdb; + --min-height: 50px; + border-radius: 0; + + ion-title { + color: #333; + font-size: var(--ion-font-size-14); + } + + ion-back-button { + color: var(--ion-color); + } + } + } + + ion-content { + --background: var(--ion-background-content); + + .bg { + background: var(--ion-color-white); + padding: var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + + ion-card-content { + padding: var(--ion-padding-0) !important; + border-bottom: 1px solid #e5e5e5; + + ion-radio-group { + ion-radio { + font-weight: bold; + margin: var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + --min-height: 40px; + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10); + color: #000; + + .radio-wrapper { + justify-content: flex-end; + } + + p { + font-weight: normal; + white-space: normal; + } + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + font-weight: 700; + + p { + line-height: 16px; + white-space: normal; + font-weight: 400; + } + } + } + + &:last-child { + border: none; + } + } + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: 0; + } + } + + .sangh-post { + ion-title { + color: var(--ion-color-sangh); + } + + ion-buttons { + ion-back-button { + color: var(--ion-color-sangh); + } + } + + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + ion-radio { + &::part(container) { + --ion-color-base: var(--ion-color-sangh); + } + + &::part(mark) { + --ion-color-base: var(--ion-color-sangh); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/post/post-type/post-type.page.ts b/src/app/pages/post/post-type/post-type.page.ts new file mode 100644 index 0000000..5f522a1 --- /dev/null +++ b/src/app/pages/post/post-type/post-type.page.ts @@ -0,0 +1,64 @@ +import { NgClass, NgFor } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-post-type', + templateUrl: './post-type.page.html', + styleUrls: ['./post-type.page.scss'], + standalone: true, + imports: [IonicModule, NgClass, NgFor, FormsModule] +}) +export class PostTypePage implements OnInit { + postTypeList = []; + postTypeId: any; + postType: any; + type: number; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private router: Router + ) { } + + ngOnInit() { + if (this.router.getCurrentNavigation().extras.state?.type) { + this.type = this.router.getCurrentNavigation().extras.state.type; + } + if (this.stateManagementService.postTypeList.length > 0) { + this.postTypeList = this.stateManagementService.postTypeList; + } else { + this.getPostTypes(); + } + this.postTypeId = this.router.getCurrentNavigation().extras.state.postType || 5; + } + + getPostTypes() { + this.httpRequestService.get(api.postTypeList).then((res: any) => { + this.postTypeList = res.data; + this.stateManagementService.postTypeList = res.data; + }); + } + + onTypeChange(type) { + this.postType = type; + } + + onSubmit() { + if (!this.postTypeId) { + this.alert.showToaster('Please select post type'); + return; + } + this.stateManagementService.postTypeSubject.next(this.postType); + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed); + } +} diff --git a/src/app/pages/post/select-sangh/select-sangh.page.html b/src/app/pages/post/select-sangh/select-sangh.page.html new file mode 100644 index 0000000..2707eef --- /dev/null +++ b/src/app/pages/post/select-sangh/select-sangh.page.html @@ -0,0 +1,47 @@ + + + + + + Select Sangh + + + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + ADD + + \ No newline at end of file diff --git a/src/app/pages/post/select-sangh/select-sangh.page.scss b/src/app/pages/post/select-sangh/select-sangh.page.scss new file mode 100644 index 0000000..b91f5be --- /dev/null +++ b/src/app/pages/post/select-sangh/select-sangh.page.scss @@ -0,0 +1,87 @@ +.select-sangh-content { + .top-area { + padding: var(--ion-padding-10) var(--ion-padding-15) var(--ion-padding-0); + --background: transparent; + background: transparent; + border-bottom: 1px var(--ion-background-gray-light) solid; + + .search-input { + background: var(--ion-color-white); + } + + .select-all-label { + font-weight: 600; + } + } + + .content-listing { + padding: 0 var(--ion-padding-15); + --background: transparent; + background: transparent; + + .content-info { + padding: var(--ion-padding-10) 0; + border-bottom: 1px var(--ion-background-gray-light) solid; + + .image-wrapper { + width: 55px; + height: 55px; + border-radius: var(--ion-border-radius-100); + overflow: hidden; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + ion-checkbox { + position: relative; + width: 100%; + margin-inline-start: 0px; + } + + .label { + white-space: normal; + margin-bottom: 0; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: calc(100% - 25px); + + p { + margin-top: 0px; + } + } + + p { + color: var(--ion-color-black); + font-size: 14px; + font-weight: 600; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + margin-bottom: 5px; + } + + span { + color: var(--ion-content-color); + font-size: 12px; + } + } + } +} + +.footer { + padding: var(--ion-padding-10) var(--ion-padding-15); + + .toolbar { + --border-width: 0; + border-width: 0; + --background: transparent; + background: transparent; + } +} \ No newline at end of file diff --git a/src/app/pages/post/select-sangh/select-sangh.page.ts b/src/app/pages/post/select-sangh/select-sangh.page.ts new file mode 100644 index 0000000..b48f481 --- /dev/null +++ b/src/app/pages/post/select-sangh/select-sangh.page.ts @@ -0,0 +1,72 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-select-sangh', + templateUrl: './select-sangh.page.html', + styleUrls: ['./select-sangh.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgFor, NgIf] +}) +export class SelectSanghPage implements OnInit { + sanghList = []; + selectedSangh = []; + checkAll = false; + + constructor( + private navCtrl: NavController, + private router: Router, + private alert: AlertService, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService + ) { } + + ngOnInit() { + if (this.router.getCurrentNavigation().extras.state?.selectedSangh) { + this.selectedSangh = this.router.getCurrentNavigation().extras.state.selectedSangh; + } + if (this.stateManagementService.userSanghList.length > 0) { + this.prepareSanghList(this.stateManagementService.userSanghList); + } else { + this.getSanghList(); + } + } + + prepareSanghList(data) { + this.sanghList = data.map(i => { + i.checked = this.selectedSangh.includes(i.id); + return i; + }); + } + + getSanghList() { + this.httpRequestService.get(api.associatedSanghList).then((res: any) => { + this.stateManagementService.userSanghList = res.data; + this.prepareSanghList(res.data); + }); + } + + onCheckAll() { + this.sanghList.forEach(i => { + i.checked = this.checkAll; + }); + } + + onAdd() { + this.selectedSangh = this.sanghList.filter(i => i.checked).map(i => i.id); + if (!this.selectedSangh.length) { + this.alert.showToasterError('Please select sangh.'); + return; + } + this.stateManagementService.postSelectedSanghSubject.next(this.selectedSangh); + this.navCtrl.back(); + } + +} diff --git a/src/app/pages/post/tagged-user/tagged-user.page.html b/src/app/pages/post/tagged-user/tagged-user.page.html new file mode 100644 index 0000000..458fc63 --- /dev/null +++ b/src/app/pages/post/tagged-user/tagged-user.page.html @@ -0,0 +1,20 @@ + + + + +
+ +
+ + + +
+ +

{{data?.name}}

+
+
+
+

+

No data found

+

+
diff --git a/src/app/pages/post/tagged-user/tagged-user.page.scss b/src/app/pages/post/tagged-user/tagged-user.page.scss new file mode 100644 index 0000000..591cff5 --- /dev/null +++ b/src/app/pages/post/tagged-user/tagged-user.page.scss @@ -0,0 +1,49 @@ +app-tagged-user { + ion-content { + ion-list { + padding: var(--ion-padding-0) !important; + border-top: 1px solid #efefef; + ion-item { + margin: var(--ion-margin-0); + padding: 5px var(--ion-padding-15); + border-bottom: 1px solid #eee; + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + display: flex; + background: #efefef; + align-items: center; + overflow: hidden; + img { + display: block; + width: 100%; + height: 100%; + } + } + ion-label { + margin: var(--ion-margin-0); + h2 { + span { + display: block; + font-size: var(--ion-font-size-14); + color: #aaa; + } + } + } + ion-chip { + padding: 5px var(--ion-padding-10); + height: auto; + margin: 0; + background: var(--ion-color); + color: #fff; + font-size: var(--ion-font-size-14); + } + } + } + h3 { + p { + color: var(--ion-color); + text-transform: uppercase; + } + } + } +} diff --git a/src/app/pages/post/tagged-user/tagged-user.page.ts b/src/app/pages/post/tagged-user/tagged-user.page.ts new file mode 100644 index 0000000..213e659 --- /dev/null +++ b/src/app/pages/post/tagged-user/tagged-user.page.ts @@ -0,0 +1,25 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, ModalController, NavController } from '@ionic/angular'; + +@Component({ + selector: 'app-tagged-user', + templateUrl: './tagged-user.page.html', + styleUrls: ['./tagged-user.page.scss'], + standalone: true, + imports: [IonicModule, NgFor, NgIf] +}) +export class TaggedUserPage { + @Input() taggedUsers: any[]; + + constructor( + private navCtrl: NavController, + private modalController: ModalController + ) { } + + moveToProfile(id) { + this.modalController.dismiss(); + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } +} diff --git a/src/app/pages/sangh/about-sangh/about-sangh.page.html b/src/app/pages/sangh/about-sangh/about-sangh.page.html new file mode 100644 index 0000000..8313cd0 --- /dev/null +++ b/src/app/pages/sangh/about-sangh/about-sangh.page.html @@ -0,0 +1,356 @@ + + + + + + About sangh + + + +
Basic Info
+
+ + + + + + + + + + + + + + + + + +
+ + + +
Additional Details
+
+ + + + + + + + + + + + + +
+ + + + +
Facilities Of Sangh
+
+ + + + + +
+ + + +
+ +
+ + + + + + + + + +
+ + + + + + + + + + +
+
+ + +
Sangh Bank details
+
+ + + + + +
+
+ + +
QR code
+
+ +
+
+ + + +
More About Sangh
+
+

{{sanghData.about}}

+
+
+ +
\ No newline at end of file diff --git a/src/app/pages/sangh/about-sangh/about-sangh.page.scss b/src/app/pages/sangh/about-sangh/about-sangh.page.scss new file mode 100644 index 0000000..7b7fa81 --- /dev/null +++ b/src/app/pages/sangh/about-sangh/about-sangh.page.scss @@ -0,0 +1,106 @@ +app-about-sangh { + ion-content { + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + h5 { + color: var(--ion-color-sangh); + font-weight: 600; + } + + p { + font-size: var(--ion-font-size-14); + margin: var(--ion-margin-0); + color: var(--ion-content-color); + padding: var(--ion-padding-15); + } + + .bg { + background: #fff; + border-radius: 8px; + box-shadow: 2px 2px 7px #ebebeb; + + .follow-box { + // border-top: 1px solid #EFEFEF; + padding: 0.75rem var(--ion-padding-10) var(--ion-padding-10); + position: relative; + display: flex; + align-items: center; + + div { + width: calc(100% - 49px); + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + color: var(--ion-content-color); + font-size: var(--ion-font-size-12); + font-weight: 400; + + &:first-child { + color: #000; + font-weight: 600; + font-size: var(--ion-font-size-14); + } + } + + .icon-common { + background: #F3E1FC; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sangh); + margin-right: var(--ion-margin-10); + } + + ion-icon { + width: 19px; + height: 19px; + padding: 10px; + } + + .icons { + width: 2.188rem; + height: 2.188rem; + padding: 8px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + + &:first-child { + border: none; + } + } + } + + .qr-section { + display: flex; + justify-content: center; + align-items: center; + padding: 10px; + + .qr-img { + height: 200px; + width: 200px; + object-fit: cover; + } + } + + .b-t { + border-top: 1px solid #d8d8d8; + } + + .b-b { + border-bottom: 1px solid #d8d8d8; + } + } +} + +.available { + color: var(--ion-color-sant); +} + +.not-available { + color: var(--ion-color-danger); +} \ No newline at end of file diff --git a/src/app/pages/sangh/about-sangh/about-sangh.page.ts b/src/app/pages/sangh/about-sangh/about-sangh.page.ts new file mode 100644 index 0000000..d145f51 --- /dev/null +++ b/src/app/pages/sangh/about-sangh/about-sangh.page.ts @@ -0,0 +1,74 @@ +import { NgClass, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { constants } from '@enums/constants.enum'; +import { SanghProfileData } from '@interfaces/common'; +import { IonicModule } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-about-sangh', + templateUrl: './about-sangh.page.html', + styleUrls: ['./about-sangh.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgClass] +}) +export class AboutSanghPage implements OnInit { + sanghData: SanghProfileData; + + constructor( + private router: Router, + private utilityService: UtilityService, + private stateManagementService: StateManagementService + ) { } + + get sanghType() { + return constants.sanghTypes.find(i => i.value === this.sanghData?.sangh_type)?.text; + } + + get bhagwanName() { + return this.stateManagementService?.common?.data?.mulnayak_bhagwan?.find(i => i.id === this.sanghData?.mulnayak_bhagwan_name)?.value; + } + + get derasarType() { + return this.stateManagementService?.common?.data?.derasar_type?.find(i => i.id === this.sanghData?.type_of_template)?.value; + } + + get numberOfMember() { + return this.stateManagementService?.common?.data?.number_of_members?.find(i => i.id === +this.sanghData?.number_of_members)?.value; + } + + get numberOfStudent() { + return this.stateManagementService?.common?.data?.number_of_students?.find(i => i.id === +this.sanghData?.no_of_students)?.value; + } + + get numberOfBook() { + return this.stateManagementService?.common?.data?.number_of_books?.find(i => i.id === +this.sanghData?.number_of_books)?.value; + } + + get isLibraryActive(): boolean { + return +this.sanghData.library_status > 0; + } + + get isPathshalaActive(): boolean { + return +this.sanghData.pathshala_status > 0; + } + + get isPathshalaInactive(): boolean { + return +this.sanghData.pathshala_status <= 0; + } + + ngOnInit() { + if (this.router.getCurrentNavigation().extras.state) { + if (this.router.getCurrentNavigation().extras.state.sanghData) { + this.sanghData = this.router.getCurrentNavigation().extras.state.sanghData; + } + } + } + + address() { + this.utilityService.openGoogleMap(this.sanghData.latitude, this.sanghData.longitude); + } + +} diff --git a/src/app/pages/sangh/add-committee-member/add-committee-member.page.html b/src/app/pages/sangh/add-committee-member/add-committee-member.page.html new file mode 100644 index 0000000..c5a8afa --- /dev/null +++ b/src/app/pages/sangh/add-committee-member/add-committee-member.page.html @@ -0,0 +1,29 @@ + + + + + + Add committee member + + + + + + + + + + + +

{{user.name}}

+
+
+
+
+
+ + Next + diff --git a/src/app/pages/sangh/add-committee-member/add-committee-member.page.scss b/src/app/pages/sangh/add-committee-member/add-committee-member.page.scss new file mode 100644 index 0000000..73f02c8 --- /dev/null +++ b/src/app/pages/sangh/add-committee-member/add-committee-member.page.scss @@ -0,0 +1,129 @@ +app-add-committee-member { + ion-header { + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + } + } + } + + ion-content { + ion-item { + width: 100%; + margin-bottom: 0; + --min-height: inherit; + padding: var(--ion-padding-15) var(--ion-padding-15) var(--ion-padding-0); + + ion-input { + margin: var(--ion-margin-0); + height: 30px; + border-radius: 8px; + + input[type=text] { + padding: 8px !important; + } + } + + ion-icon { + position: absolute; + right: 10px; + font-size: var(--ion-font-size-14); + } + } + + ion-list { + padding: var(--ion-padding-15) !important; + border-radius: 8px; + + ion-radio { + margin: var(--ion-margin-0); + --color-checked: var(--ion-color-sangh) !important; + width: 100%; + + &::part(container) { + border-radius: 5px; + --border-width: 1px; + border-color: var(--ion-color-sangh); + padding: 2px; + width: 21px; + height: 21px; + } + + &::part(mark) { + width: 100%; + height: 100%; + border-radius: 5px; + } + + .div-img-common { + background: var(--ion-background-content); + border-radius: 100%; + display: flex; + } + + img { + width: 40px; + height: 40px; + margin-right: var(--ion-margin-10); + align-items: center; + justify-content: center; + object-fit: cover; + } + + ion-label { + display: flex; + align-items: center; + + p { + text-overflow: ellipsis; + overflow: hidden; + } + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: 0; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/add-committee-member/add-committee-member.page.ts b/src/app/pages/sangh/add-committee-member/add-committee-member.page.ts new file mode 100644 index 0000000..55f07ab --- /dev/null +++ b/src/app/pages/sangh/add-committee-member/add-committee-member.page.ts @@ -0,0 +1,89 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-add-committee-member', + templateUrl: './add-committee-member.page.html', + styleUrls: ['./add-committee-member.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgFor, NgIf] +}) +export class AddCommitteeMemberPage { + sanghId: string; + userList = []; + searchValue: string; + prevValue: string; + pageNumber = 1; + totalPage = 1; + postTypeId: any; + userData: any; + constructor( + private cRoute: ActivatedRoute, + private navCtrl: NavController, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private utilityService: UtilityService + ) { } + + ionViewWillEnter() { + this.sanghId = this.cRoute.snapshot.paramMap.get('id'); + this.getUserList(false, ''); + } + + searchSangh() { + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.userList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getUserList(false, ''); + } + } + + getUserList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const params = { + page: this.pageNumber, + limit: 15, + name: this.searchValue ? this.searchValue.trim() : '', + sangh_id: this.sanghId, + }; + this.httpRequestService.post(api.memberListForAddInSangh, params).then((res: any) => { + this.totalPage = res.data.last_page; + this.userList = res.data.data; + if (isFirstLoad) { + event.target.complete(); + } + this.pageNumber++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + } + } + + onTypeChange(type) { + this.userData = type; + } + + goToAddRole() { + const navOption = { + state: { + userValue: this.userData, + id: this.cRoute.snapshot.paramMap.get('id') + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghRoleSelect, navOption); + } + +} diff --git a/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.html b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.html new file mode 100644 index 0000000..20a6f48 --- /dev/null +++ b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.html @@ -0,0 +1,77 @@ + + + + + + Chaturmas Vihaar Information + + + + + + + +
+ ADD CHATURMAS / VIHAR +
+ + + + Chaturmas + + + Vihar + + + +
+
+

+ +

No Chaturmas details found. If you know, please add and admin will verify.

+

+ + + + + Silhouette of a person's head + + +

{{ item?.sant?.name }} +

Year: + + {{item.year}} + +

+

+
+
+
+
+
+
+

+ +

No upcoming Vihaar. If you know, please add as it will benefit all Shravaks.

+

+ + + + + Silhouette of a person's head + + +

{{ item?.sant?.name }} +

Date: + + {{item.start_date}} + +

+

+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.scss b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.scss new file mode 100644 index 0000000..436c92d --- /dev/null +++ b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.scss @@ -0,0 +1,64 @@ +ion-segment { + padding: var(--ion-padding-10) var(--ion-padding-15); + background: var(--ion-color-white); + margin-top: var(--ion-margin-15); + + ion-segment-button { + min-height: 30px; + --indicator-height: 0; + background: #efefef; + text-transform: capitalize; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + letter-spacing: 0; + } + + &.segment-button-checked { + border-radius: 5px; + background: var(--ion-color-sangh); + color: #fff; + + ion-label { + color: #fff; + } + } + + &:first-child { + border-radius: 8px 0 0 8px; + + &.segment-button-checked { + border-radius: 5px; + } + } + + &:last-child { + border-radius: 0 8px 8px 0; + + &.segment-button-checked { + border-radius: 5px; + } + } + } +} + +.add-vihar { + background-color: white; + + ion-button { + margin: var(--ion-margin-15); + --border-radius: 0.313rem; + } + + .si { + &::part(native) { + --background: var(--ion-color-sangh) !important; + } + } +} + +ion-item { + box-shadow: none; + border-bottom: 1px solid #EFEFEF; +} \ No newline at end of file diff --git a/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.ts b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.ts new file mode 100644 index 0000000..2b6cb71 --- /dev/null +++ b/src/app/pages/sangh/chaturmas-vihar/chaturmas-vihar.page.ts @@ -0,0 +1,48 @@ +import { NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { SanghProfileData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; + + +@Component({ + selector: 'app-create-new-sangh', + templateUrl: './chaturmas-vihar.page.html', + styleUrls: ['./chaturmas-vihar.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, FormsModule, NgSwitch, NgSwitchCase] +}) +export class ViharSanghPage { + viharType = 'chaturmas'; + sanghData: SanghProfileData; + sanghId: string; + + constructor( + private activatedRoute: ActivatedRoute, + private navCtrl: NavController, + private httpRequestService: HttpRequestService + ) { } + + ngOnInit() { + this.getProfileInfo(); + } + + getProfileInfo() { + this.httpRequestService.get(api.sanghProfile.replace('{id}', this.activatedRoute.snapshot.paramMap.get('sanghId'))).then((res: any) => { + this.sanghData = res.data; + }); + } + + santProfile(santId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } + + onSant(): void { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.searchSant); + } + +} \ No newline at end of file diff --git a/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.html b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.html new file mode 100644 index 0000000..02b2dbe --- /dev/null +++ b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.html @@ -0,0 +1,79 @@ + + + Sangh + + + + + + + +
+
In ReviewView + all
+ +
+
+ + + +

{{sangh.name}}

+ +
+
+
+ +
+
Member of sangh View + all
+
+

+ +

Add Sangh

+

+
+ + + +

{{sangh.name}}

+
+
+
+ +
Following View all
+ + + + + + +

{{sangh.name}}

+ View +
+
+
+
Suggestion View all
+ + + + + + +

{{sangh.name}}

+ +
+
+
+
+ \ No newline at end of file diff --git a/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.scss b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.scss new file mode 100644 index 0000000..d4d40cf --- /dev/null +++ b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.scss @@ -0,0 +1,288 @@ +app-create-new-sangh { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-content { + --background: var(--ion-background-content); + + .header-search { + padding: var(--ion-padding-10) var(--ion-padding-10) var(--ion-padding-0); + background: var(--ion-color-white); + flex-wrap: wrap; + justify-content: space-between; + display: flex; + border-bottom: 1px solid #efefef; + + ion-icon { + background: var(--ion-color-white); + color: var(--ion-color); + height: 18px; + width: 20px; + padding: 5px; + margin-left: var(--ion-margin-0); + border-radius: 50px; + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10); + height: 30px; + flex: 0 0 98.5%; + + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + box-shadow: none; + border-radius: 5px; + } + } + } + + h5 { + color: var(--ion-color-sangh); + font-weight: 600; + display: flex; + justify-content: space-between; + margin-top: 0; + padding: var(--ion-padding-0) var(--ion-padding-15); + + span { + color: #000; + font-size: var(--ion-font-size-12); + } + } + + .following { + background: var(--ion-color-white); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + .sangh-profile { + h3 { + color: var(--ion-color-sangh); + margin: var(--ion-margin-0); + text-transform: uppercase; + } + + div { + display: flex; + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10); + align-items: center; + + ion-avatar { + width: 50px; + height: 50px; + text-align: center; + margin-right: var(--ion-margin-10); + background: #e2f0ff; + } + + h3 { + width: calc(100% - 60px); + text-transform: none; + color: #000; + font-size: var(--ion-font-size-14); + font-weight: 600; + } + } + } + + h5 { + color: var(--ion-color-sangh); + font-weight: 600; + display: flex; + justify-content: space-between; + margin-top: var(--ion-margin-0); + padding: var(--ion-padding-0); + + span { + color: #000; + font-size: var(--ion-font-size-12); + } + } + } + + ion-list { + background: none !important; + padding: var(--ion-padding-0) var(--ion-padding-15) !important; + + ion-item { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10); + padding: var(--ion-padding-10); + background: var(--ion-color-white); + border-radius: 8px; + + ion-avatar { + width: 50px; + height: 50px; + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + + p { + font-weight: 400; + color: #999; + margin: var(--ion-margin-0); + } + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15); + min-height: 30px; + height: 30px; + + &::part(native) { + --background: var(--ion-color-sangh); + } + + &.view { + &::part(native) { + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + } + } + } + } + } + + &.sangh { + .header-search { + ion-button { + &::part(native) { + color: var(--ion-color-sangh); + --background: var(--ion-background-content-sangh); + border: 1px solid; + } + } + } + + .following { + h5 { + color: var(--ion-color-sangh); + } + } + } + } + + .in-review { + ion-list { + background: none !important; + padding: 0px !important; + + ion-item-sliding { + padding: var(--ion-padding-0); + + ion-item { + margin: var(--ion-margin-0); + padding: 10px 0px !important; + --min-height: auto; + transition: 0.2s ease-in-out; + overflow: visible; + background: #fff; + z-index: 2; + border-radius: 0px !important; + } + + ion-item-options { + top: 0; + transition: 0.2s ease-in-out; + display: flex; + height: 100%; + } + + &.item-sliding-active-options-end { + &.item-sliding-active-slide { + ion-item-options { + display: flex; + transition: 0.2s ease-in-out; + } + } + } + } + } + + .left-data { + display: flex; + align-items: center; + width: 100%; + + .icons { + width: 50px; + height: 50px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + height: 50px; + + &.heart { + color: #f00; + } + } + + img { + height: 100%; + } + } + + .content { + width: calc(100% - 60px); + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + word-break: break-word; + } + } + } + + ion-item-options { + padding: 0 !important; + height: 80%; + border: 1px solid white !important; + } + } + + .delete-sangh { + color: #ef4a4a; + font-size: 22px; + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.ts b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.ts new file mode 100644 index 0000000..c19b16f --- /dev/null +++ b/src/app/pages/sangh/create-new-sangh/create-new-sangh.page.ts @@ -0,0 +1,147 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FooterComponent } from '@components/footer/footer.component'; +import { JoinSanghButtonComponent } from '@components/join-sangh-button/join-sangh-button.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { SanghData, UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-create-new-sangh', + templateUrl: './create-new-sangh.page.html', + styleUrls: ['./create-new-sangh.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, JoinSanghButtonComponent, FooterComponent] +}) +export class CreateNewSanghPage implements OnInit, OnDestroy { + sanghList: Array = []; + inReviewSangh: Array = []; + suggestedSanghList: Array = []; + followedSanghList: Array = []; + noSanghFlag: boolean; + userData: UserData; + sanghListTotalCount: number; + inReviewSanghTotalCount: number; + suggestedSanghListTotalCount: number; + followedSanghListTotalCount: number; + $subscription: Subscription; + hasNewInvite = 0; + + constructor( + private navCtrl: NavController, + private httpRequestService: HttpRequestService, + private santService: SantInfoService, + private stateManagementService: StateManagementService, + private alert: AlertService, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.$subscription = this.stateManagementService.pushNotyObservable.subscribe(res => { + this.hasNewInvite = res.pending_sangh_invitation; + }); + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + this.santService.sanghInformationForm.reset(); + this.getMemberSanghList(); + this.getFollowedSanghList(); + this.getSuggestedSanghList(); + this.getInReviewSangh(); + } + + getMemberSanghList() { + const params = { + page: 1, + limit: 3 + }; + this.httpRequestService.post(api.sanghList, params).then((res: any) => { + this.sanghList = res.data.data; + this.sanghListTotalCount = res.data.total; + this.noSanghFlag = true; + }); + } + + getInReviewSangh() { + const params = { + page: 1, + limit: 3 + }; + this.httpRequestService.post(api.inReviewUserSanghList, params).then((res: any) => { + this.inReviewSangh = res.data.data; + this.inReviewSanghTotalCount = res.data.total; + }); + } + + getFollowedSanghList() { + const params = { + page: 1, + limit: 3 + }; + this.httpRequestService.post(api.followedSanghList, params).then((res: any) => { + this.followedSanghList = res.data.data; + this.followedSanghListTotalCount = res.data.total; + this.noSanghFlag = true; + }); + } + + getSuggestedSanghList() { + const params = { + page: 1, + limit: 5 + }; + this.httpRequestService.post(api.suggestedSanghList, params).then((res: any) => { + this.suggestedSanghList = res.data.data; + this.suggestedSanghListTotalCount = res.data.total; + }); + } + + addSangh() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghTermPolicy); + } + + sanghProfile(sanghId: number) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(sanghId))); + } + + viewAllSangh(sanghListType) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.viewAllSangh.replace(':sanghListType', sanghListType)); + } + + sanghSearch() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghSearchMember); + } + + invitations() { + this.stateManagementService.generalData.pending_sangh_invitation = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.navCtrl.navigateForward(Roots.page + '/' + Roots.invitations); + } + + async deleteSangh(id: number) { + const isYes = await this.utilityService.presentConfirm( + `Are you sure want to delete Sangh?`, + 'No', 'Yes' + ); + if (isYes) { + this.httpRequestService.delete(api.deleteSangh + id).then(() => { + this.alert.showToaster('Sangh deleted successfully'); + this.getInReviewSangh(); + }); + } + } + + ngOnDestroy() { + this.$subscription?.unsubscribe(); + } + +} diff --git a/src/app/pages/sangh/invitations/invitations.page.html b/src/app/pages/sangh/invitations/invitations.page.html new file mode 100644 index 0000000..6f57ea2 --- /dev/null +++ b/src/app/pages/sangh/invitations/invitations.page.html @@ -0,0 +1,48 @@ + + + + + + Invitations + + + + + + +

+

Please request Sangh's core committee to send Invitation.

+

+ + + +
+
+ + + +
+ +
+
+
+

{{invitation.extra_fields.name}} {{invitation.message}} +

+ Accept + + Decline +
+
+
+ + + + +
+
+
diff --git a/src/app/pages/sangh/invitations/invitations.page.scss b/src/app/pages/sangh/invitations/invitations.page.scss new file mode 100644 index 0000000..526b8a9 --- /dev/null +++ b/src/app/pages/sangh/invitations/invitations.page.scss @@ -0,0 +1,132 @@ +app-invitations { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + + h3 { + p { + color: var(--ion-color); + text-transform: uppercase; + } + } + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin: var(--ion-margin-0); + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + .left-data { + display: flex; + align-items: center; + width: 100%; + + .icons { + color: var(--ion-color); + margin-right: var(--ion-margin-10); + position: relative; + + span { + overflow: hidden; + width: 50px; + height: 50px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + } + + div { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + width: 20px; + height: 20px; + box-shadow: 0px 0px 2px #000; + display: flex; + align-items: center; + justify-content: center; + + img { + width: auto; + height: 100%; + } + } + } + + .content { + width: calc(100% - 60px); + + ion-button { + height: 25px; + margin: var(--ion-margin-10) 4% 0 0; + width: 48%; + + &:last-child { + margin-right: 0; + } + + &::part(native) { + text-transform: capitalize; + --background: var(--ion-color-sangh); + } + + &.delete-btn::part(native) { + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 700; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + font-weight: 400; + } + } + } + } + } + } + + &:first-child { + margin-top: var(--ion-margin-15); + } + + &:last-child { + margin-bottom: var(--ion-margin-15); + } + } + + h3 { + p { + color: var(--ion-color-sangh); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/invitations/invitations.page.ts b/src/app/pages/sangh/invitations/invitations.page.ts new file mode 100644 index 0000000..7990066 --- /dev/null +++ b/src/app/pages/sangh/invitations/invitations.page.ts @@ -0,0 +1,95 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-invitations', + templateUrl: './invitations.page.html', + styleUrls: ['./invitations.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor] +}) +export class InvitationsPage { + invitationList = []; + invitationPageNumber = 1; + invitationTotalPage = 1; + invitationTotalCount: number; + noDataFlag: boolean; + spinnerFlag = false; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private utilityService: UtilityService, + private navCtrl: NavController + ) { } + + ionViewWillEnter() { + this.getInvitationList(false, ''); + } + + getInvitationList(isFirstLoad, event) { + if (this.invitationPageNumber <= this.invitationTotalPage) { + const params = { + page: this.invitationPageNumber, + limit: 15, + }; + this.httpRequestService.get(api.getSanghInvitationsList, params).then((res: any) => { + this.invitationTotalPage = res.data.last_page; + this.invitationTotalCount = res.data.total; + this.noDataFlag = true; + this.invitationList.push(...res.data.data); + this.spinnerFlag = true; + if (isFirstLoad) { event.target.complete(); } + this.invitationPageNumber++; + }); + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + loadData($event) { + this.getInvitationList(true, $event); + } + + moveToSangh(id) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(id))); + } + + moveToShravakProfile(shravakId) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: shravakId }]); + } + + async acceptDeclineSanghMember(data: any, status: number, index: number) { + + const acceptDeclineSanghMember = () => { + const params = { + sangh_id: data.extra_fields.sangh_id, + user_id: data.extra_fields.from_id, + status, + is_commiittee: data.type === 'UserSentMemberRequest' ? 1 : 0, + }; + this.httpRequestService.post(api.acceptDeclineSanghRequest, params).then((res: any) => { + this.invitationList.splice(index, 1); + this.alert.showToaster(res.message); + }); + }; + + if (status === 2) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about decline this request?', + 'No', 'Yes', 'Decline' + ); + if (isYes) { acceptDeclineSanghMember(); } + } else { + acceptDeclineSanghMember(); + } + } + +} diff --git a/src/app/pages/sangh/invite-members/invite-members.page.html b/src/app/pages/sangh/invite-members/invite-members.page.html new file mode 100644 index 0000000..2a403f6 --- /dev/null +++ b/src/app/pages/sangh/invite-members/invite-members.page.html @@ -0,0 +1,35 @@ + + + + + + {{type === 'member' ? 'Add members' : 'Invite members'}} + + + + + + + +
+ + +
+ +
+

{{user.name}}

+
+
+
+
+ + + + +
+ + Add Member + diff --git a/src/app/pages/sangh/invite-members/invite-members.page.scss b/src/app/pages/sangh/invite-members/invite-members.page.scss new file mode 100644 index 0000000..7977984 --- /dev/null +++ b/src/app/pages/sangh/invite-members/invite-members.page.scss @@ -0,0 +1,115 @@ +app-invite-members { + ion-header { + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + } + } + } + + ion-content { + ion-item { + width: 100%; + margin-bottom: 0; + --min-height: inherit; + padding: var(--ion-padding-15); + + ion-input { + margin: var(--ion-margin-0); + height: 30px; + border-radius: 8px; + + input[type=text] { + padding: 8px !important; + } + } + + ion-icon { + position: absolute; + right: 10px; + font-size: var(--ion-font-size-14); + } + } + + ion-list { + padding: var(--ion-padding-0) !important; + background: none !important; + + div { + ion-checkbox { + margin: var(--ion-margin-0); + width: 100%; + + &::part(container) { + border-radius: 5px; + --border-width: 1px; + padding: 2px; + width: 21px; + height: 21px; + } + + &.ion-color-primary { + --ion-color-base: var(--ion-color-sangh) !important; + } + + div { + background: var(--ion-background-content); + border-radius: 100%; + overflow: hidden; + display: flex; + margin-right: var(--ion-margin-10); + + } + + img { + width: 40px; + height: 40px; + margin: var(--ion-margin-0); + background: var(--ion-background-content); + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; + object-fit: cover; + } + + ion-label { + display: flex; + align-items: center; + + p { + text-overflow: ellipsis; + overflow: hidden; + } + } + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: 0; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/invite-members/invite-members.page.ts b/src/app/pages/sangh/invite-members/invite-members.page.ts new file mode 100644 index 0000000..4cd7f08 --- /dev/null +++ b/src/app/pages/sangh/invite-members/invite-members.page.ts @@ -0,0 +1,103 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-invite-members', + templateUrl: './invite-members.page.html', + styleUrls: ['./invite-members.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgFor, NgIf] +}) +export class InviteMembersPage { + sanghId: string; + type: string; + userList = []; + searchValue: string; + prevValue: string; + pageNumber = 1; + totalPage = 1; + selectedUserList = []; + constructor( + private navCtrl: NavController, + private cRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private utilityService: UtilityService + ) { } + + ionViewWillEnter() { + this.sanghId = this.cRoute.snapshot.paramMap.get('id'); + this.type = this.cRoute.snapshot.paramMap.get('type'); + this.getUserList(false, ''); + } + + searchSangh() { + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.userList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getUserList(false, ''); + } + } + + getUserList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.memberListForAddInSangh, { + page: this.pageNumber, + limit: 15, + name: this.searchValue ? this.searchValue.trim() : '', + sangh_id: this.sanghId, + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { this.userList = []; } + this.totalPage = res.data.last_page; + this.userList.push(...res.data.data); + this.pageNumber++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + } + } + + loadData($event) { + this.getUserList(true, $event); + } + + onChange(event, index: number, id: number) { + if (event.detail.checked) { + this.userList[index].checked = true; + this.selectedUserList.push(id); + } else { + this.userList[index].checked = false; + const indexValue = this.selectedUserList.indexOf(id); + if (indexValue > -1) { + this.selectedUserList.splice(indexValue, 1); + } + } + } + + addMembers() { + const params = { + sangh_id: this.sanghId, + user_id: this.selectedUserList, + }; + this.httpRequestService.post(api.addMemberForSangh, params).then((res: any) => { + this.alert.showToaster(res.message); + this.navCtrl.navigateBack([Roots.page + '/' + Roots.sanghProfile, { sanghId: this.cRoute.snapshot.paramMap.get('id') }]); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } +} diff --git a/src/app/pages/sangh/sangh-address/sangh-address.page.html b/src/app/pages/sangh/sangh-address/sangh-address.page.html new file mode 100644 index 0000000..b38852b --- /dev/null +++ b/src/app/pages/sangh/sangh-address/sangh-address.page.html @@ -0,0 +1,130 @@ + + + + + + Add Sangh + + + +
+
+
+
+
+
+
+
+
+

Additional Details

+
+ + + +
+ + +
+ + State is required. + +
+
+ + +
+ + +
+ + City is required. + +
+
+ +
+ + +
+ + Apartment is required. + +
+
+ +
+ + +
+ + Please enter valid email. + +
+
+ +
+ +
+ + + +
+ + Mobile is required. + + + Please enter {{ numLength }} digit mobile number. + +
+
+
+ +
+ + +
+ +
+ + + +

{{member.value}}

+
+
+
+ + Member is required. + +
+
+ +
+ + +
+ +
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-address/sangh-address.page.scss b/src/app/pages/sangh/sangh-address/sangh-address.page.scss new file mode 100644 index 0000000..748ebd3 --- /dev/null +++ b/src/app/pages/sangh/sangh-address/sangh-address.page.scss @@ -0,0 +1,69 @@ +app-sangh-address { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0rem; + color: var(--ion-color-sangh); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + .top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } + } + + .search { + input { + width: 100%; + display: flex; + height: 40px; + align-items: center; + padding-left: 5px; + font-size: 16px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + background: transparent; + } + } + + ion-item { + ion-label { + margin-top: var(--ion-margin-0); + } + + ion-select { + margin-bottom: var(--ion-margin-0); + } + } + + ion-item::part(detail-icon) { + display: none; + } + } + + ion-footer { + padding-bottom: env(safe-area-inset-bottom); + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-address/sangh-address.page.ts b/src/app/pages/sangh/sangh-address/sangh-address.page.ts new file mode 100644 index 0000000..a48be8c --- /dev/null +++ b/src/app/pages/sangh/sangh-address/sangh-address.page.ts @@ -0,0 +1,116 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { Countries, Country } from '@interfaces/common'; +import { SanghAddressForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-sangh-address', + templateUrl: './sangh-address.page.html', + styleUrls: ['./sangh-address.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, IonicSelectableComponent, NgFor] +}) +export class SanghAddressPage implements OnInit { + @ViewChild('Location') Location: ElementRef; + sanghAddressForm: FormGroup; + countryCodes: Array = []; + members = []; + numLength = 10; + constructor( + private navCtrl: NavController, + public santService: SantInfoService, + private utilityService: UtilityService, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService + ) { } + + ngOnInit() { + this.sanghAddressForm = this.santService.sanghAddressForm; + this.members = this.stateManagementService?.common?.data?.number_of_members ?? []; + if (this.stateManagementService.countryDetails.length > 0) { + this.countryCodes = this.stateManagementService.countryDetails; + this.setDefaultCountryCode(); + } else { + this.fetchCountryCodes(); + } + } + + setDefaultCountryCode() { + this.countryCodes.forEach((elem) => { + if (elem.iso === 'IN') { + this.sanghAddressForm.controls.phoneCode.setValue(elem); + this.codeChange({ value: { num_length: 10 } }) + } + }); + } + + fetchCountryCodes() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryCodes = res.countries; + this.stateManagementService.countryDetails = res.countries; + if (this.countryCodes) { + this.setDefaultCountryCode(); + } + }); + } + + codeChange(event) { + this.numLength = event.value.num_length; + this.sanghAddressForm.controls.mobile_number.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.Location.nativeElement, []).subscribe((details) => { + const { city, state, apartment } = this.getCityAndState(details.address_components); + + city && this.sanghAddressForm.controls.city.setValue(city); + state && this.sanghAddressForm.controls.state.setValue(state); + apartment && this.sanghAddressForm.controls.apartment_name.setValue(apartment); + this.sanghAddressForm.controls.address.setValue(this.Location.nativeElement.value); + this.sanghAddressForm.controls.latitude.setValue(details.geometry.location.lat()); + this.sanghAddressForm.controls.longitude.setValue(details.geometry.location.lng()); + }); + } + + getCityAndState(addressComponents: any): { city: string, state: string, apartment: string } { + let city = ''; + let state = ''; + let apartment = ''; + + addressComponents.forEach(component => { + const types = component.types; + if (types.includes('locality')) { + city = component.long_name; + } + if (types.includes('administrative_area_level_1')) { + state = component.long_name; + } + if (types.includes('subpremise')) { + apartment = component.long_name; + } + }); + + return { city, state, apartment }; + } + + removeLatAndLong() { + this.sanghAddressForm.controls.latitude.reset(); + this.sanghAddressForm.controls.longitude.reset(); + } + + moveToNext() { + if (!this.sanghAddressForm.valid) { + this.sanghAddressForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghFacilities); + } +} diff --git a/src/app/pages/sangh/sangh-donation/sangh-donation.page.html b/src/app/pages/sangh/sangh-donation/sangh-donation.page.html new file mode 100644 index 0000000..ce4e8c6 --- /dev/null +++ b/src/app/pages/sangh/sangh-donation/sangh-donation.page.html @@ -0,0 +1,93 @@ + + + + + + Add Sangh + + + + + + +
+
+
+
+
+
+
+
+
+

Sangh Bank Details

+
+ +
+ + +
+ + Account number is required. + + + Account number is invalid. + +
+
+ +
+ + +
+ + IFSC code is required. + + + IFSC code is invalid. + +
+
+ +
+ + +
+ + Branch name is required. + +
+
+ +
+ + +
+ +
+ +
+ + + UPLOAD IMAGE + + +
+ Upload QR Code + +
+
+
+
+ +
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-donation/sangh-donation.page.scss b/src/app/pages/sangh/sangh-donation/sangh-donation.page.scss new file mode 100644 index 0000000..042499d --- /dev/null +++ b/src/app/pages/sangh/sangh-donation/sangh-donation.page.scss @@ -0,0 +1,79 @@ +h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 10px; + color: var(--ion-color-sangh); +} + +ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; +} + +.top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } +} + +.upload-container { + width: 100%; + min-height: 50px; + border: 1.5px dashed #B4B4B4; + text-align: center; + padding: 0.8rem; + color: var(--ion-color-sangh); + background-color: var(--ion-color-light-dark); + justify-content: center; + align-items: center; + display: flex; + + ion-icon { + margin-right: 0.5rem; + } +} + +.upload-preview { + display: flex; + align-items: center; + padding: 5px; + position: relative; + gap: 10px; + + img { + width: 100px; + height: 80px; + object-fit: cover; + border-radius: 5px; + } + + ion-icon { + position: absolute; + background: var(--ion-color-white); + font-size: 20px; + border-radius: var(--ion-border-radius-100); + color: #343434; + right: 0px; + top: 8px; + } +} + +ion-footer { + padding-bottom: env(safe-area-inset-bottom); +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-donation/sangh-donation.page.ts b/src/app/pages/sangh/sangh-donation/sangh-donation.page.ts new file mode 100644 index 0000000..0c8fd21 --- /dev/null +++ b/src/app/pages/sangh/sangh-donation/sangh-donation.page.ts @@ -0,0 +1,76 @@ +import { NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Roots } from '@enums/root.enum'; +import { SanghDonationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { UtilityService } from '@services/utility.service'; +import { ifscValidator } from 'src/app/validators/common.validator'; +@Component({ + selector: 'app-sangh-donation', + templateUrl: './sangh-donation.page.html', + styleUrls: ['./sangh-donation.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf] +}) +export class SanghAddressPage implements OnInit { + sanghDonationForm: FormGroup; + constructor( + private navCtrl: NavController, + private utilityService: UtilityService, + private cameraGalleryService: CameraGalleryService, + public santService: SantInfoService + ) { } + + ngOnInit() { + this.sanghDonationForm = this.santService.sanghDonationForm; + + this.sanghDonationForm.get('bank_account_number').valueChanges.subscribe(value => { + this.setConditionalValidators(value); + }); + } + + setConditionalValidators(value: number): void { + const ifscCodeControl = this.sanghDonationForm.get('bank_ifsc'); + const branchNameControl = this.sanghDonationForm.get('bank_branch'); + + if (value) { + ifscCodeControl.setValidators([Validators.required, ifscValidator]); + branchNameControl.setValidators([Validators.required]); + } else { + ifscCodeControl.clearValidators(); + branchNameControl.clearValidators(); + } + + ifscCodeControl.updateValueAndValidity(); + branchNameControl.updateValueAndValidity(); + } + + + moveToNext(form) { + if (!form.valid) { + this.sanghDonationForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfileImage); + } + + selectImages() { + this.cameraGalleryService.selectImage(512, 512, false).then((imageData: { imgString: string; itemImage: Blob }) => { + this.sanghDonationForm.controls.bank_qr_code_url.setValue(imageData.imgString); + this.sanghDonationForm.controls.bank_qr_code.setValue(imageData.itemImage); + }); + } + + profileView(url: string): void { + this.utilityService.imagePreview(url); + } + + removeImage(): void { + this.sanghDonationForm.controls.bank_qr_code_url.setValue(null); + this.sanghDonationForm.controls.bank_qr_code.setValue(null); + } + +} diff --git a/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.html b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.html new file mode 100644 index 0000000..3f5687a --- /dev/null +++ b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.html @@ -0,0 +1,503 @@ + + + + + + Edit profile + + + + +
Profile picture
+ + + +
+
+ + + + +
+
+
+
+ +
Basic Info
+ + +
+ + + {{sangh.text}} + +
+ + Sangh type is required. + +
+
+ +
+ + + +

{{template.value}}

+
+
+
+ + Derasar type is required + +
+
+ + +
Reset
+ +
+ + + {{dharma.name}} + +
+ +
+ + + +
+ +
+ + +
+ + Sangh Name is required. + +
+
+ + + + + + +

{{ sangh.name }}

+
+
+
+
+
+ +
+ + + +
+ + Mulnayak Bhagwan name is required. + +
+
+ + +
+ + +
+ +
+ + {{sanghRegDate ? (sanghRegDate | date: 'dd-MM-yyyy') : + 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + +
+ +
+ + + +

{{member.value}}

+
+
+
+ + Member is required. + +
+
+
+ + +
Additional Details
+ + + + +
+ + +
+ + State is required. + +
+
+ + +
+ + +
+ + City is required. + +
+
+ +
+ + +
+ +
+ + +
+ + Please enter valid email. + +
+
+ +
+ +
+
+ + + +
+
+ + Mobile is required. + + + Please enter {{ numLength }} digit mobile number. + +
+
+
+ +
+ + +
+ +
+ + +
+
+ +
Facilities Of Sangh
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+ +
+ + + +

{{student.value}}

+
+
+
+ + Students counts is required. + +
+
+
+ +
+ + + {{option.text}} + + + +
+ + +
+ + Library name is required. + +
+
+ +
+ + +
+ + Librarian name is required. + +
+
+ +
+ +
+
+ + + +
+
+
+ + Mobile number is required. + + + Please enter {{ numLength }} digit mobile number. + +
+
+ +
+ + + +

{{book.value}}

+
+
+
+ + Books count is required. + +
+
+
+
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
Bank Details
+ +
+ + +
+ + Account number is required. + + + Account number is invalid. + +
+
+ +
+ + +
+ + IFSC code is required. + + + IFSC code is invalid. + +
+
+ +
+ + +
+ + Branch name is required. + +
+
+ +
+ + +
+ +
+ +
+ + + UPLOAD + + +
+ Upload QR Code + +
+
+
+
+
+
+
+ + Save + + + + + + + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.scss b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.scss new file mode 100644 index 0000000..25d2dc2 --- /dev/null +++ b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.scss @@ -0,0 +1,370 @@ +app-sangh-edit-profile { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + ion-button::part(native) { + --background: none !important + } + + ion-icon { + font-size: var(--ion-font-size-24); + } + } + + } + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + h5 { + color: var(--ion-color-sangh); + font-weight: 600; + } + + ion-card { + margin: var(--ion-margin-0); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + border-radius: 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin-bottom: var(--ion-margin-10); + align-items: center; + + ion-icon { + width: 27px; + height: 33px; + padding: 3px 6px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + + &:last-child { + margin-bottom: 0; + } + + .left-data { + display: flex; + align-items: center; + + .icons { + width: 39px; + height: 39px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + + &.family-members { + padding: var(--ion-padding-0); + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + } + + &.points { + font-size: var(--ion-font-size-12); + color: var(--ion-content-color); + display: flex; + margin-top: 2px; + + ion-icon { + background: none; + width: 12px; + height: 12px; + margin: var(--ion-margin-0) 2px var(--ion-margin-0) var(--ion-margin-0); + padding: var(--ion-padding-0); + color: var(--ion-content-color); + } + } + } + + .content { + width: calc(100% - 49px); + } + } + + .edit-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: center; + } + + &.profile-picture { + display: block; + + ion-avatar { + margin: var(--ion-margin-0) auto; + height: 100px; + width: 100px; + } + + .edit-icon { + float: right; + } + } + } + } + + .edit-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sangh); + display: flex; + align-items: center; + justify-content: center; + position: absolute; + right: 0px; + + img { + width: auto; + height: 12px; + } + } + + &.location-box { + border: 1px solid var(--ion-content-color); + + ion-card-header { + ion-card-title { + input { + width: 100%; + border: none; + line-height: 2.2em; + outline: none; + } + } + } + } + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.813rem; + } + + .search-data { + top: auto !important; + + ion-list { + border: 1px solid var(--ion-content-color-sant); + border-radius: 5px; + + ion-item { + ion-label { + max-width: inherit !important; + white-space: normal !important; + width: 69vw; + margin: var(--ion-margin-0); + } + + &:last-child { + border: none; + } + } + } + } + + ion-item::part(detail-icon) { + display: none; + } + + &.sangh { + form { + position: relative; + + .reset-btn { + float: right; + + &.disable-reset { + pointer-events: none !important; + opacity: 0.4; + } + } + } + } + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --border-radius: 8px; + } +} + +ion-radio-group { + display: flex; + gap: 50px; + margin: 10px 0 10px 0; + + ion-label { + margin: var(--ion-margin-0); + } + + ion-radio { + --color-checked: var(--ion-color-sangh) !important; + + &::part(container) { + --border-width: 1px; + border-color: var(--ion-color-sangh); + } + + &.radio-checked { + --color-checked: var(--ion-color-sangh) !important; + } + } +} + +.mobile-input { + display: flex; + justify-content: space-between; + + ion-input { + height: 30px; + } +} + + +.upload-container { + width: 100%; + min-height: 50px; + border: 1.5px dashed #B4B4B4; + text-align: center; + padding: 0.8rem; + color: var(--ion-color-sangh); + background-color: var(--ion-color-light-dark); + justify-content: center; + align-items: center; + display: flex; + + ion-icon { + margin-right: 0.5rem; + } +} + +.upload-preview { + display: flex; + align-items: center; + padding: 5px; + position: relative; + gap: 10px; + + img { + width: 100px; + height: 80px; + object-fit: cover; + border-radius: 5px; + } + + ion-icon { + position: absolute; + background: var(--ion-color-white); + font-size: 20px; + border-radius: var(--ion-border-radius-100); + color: #343434; + right: 0px; + top: 8px; + } +} + +ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; +} + +ion-footer { + padding-bottom: env(safe-area-inset-bottom); +} + +.modal-card { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + text-align: center; + padding: 10px; + + ion-card-header { + align-items: center; + display: flex; + flex-direction: column; + gap: 10px; + } + + ion-card-title { + font-size: 18px; + font-weight: 600; + } + + ion-card-content { + p { + color: black; + } + + padding-bottom: 0 !important; + } + + p { + margin-bottom: 20px; + font-size: 14px; + font-weight: 600; + } + + .hi { + &::part(native) { + --background: var(--ion-color-sangh) !important; + } + } + + .button-container { + display: flex; + justify-content: center; + gap: 5px; + + ion-button.hi { + flex: 0 0 35%; + } + } + +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.ts b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.ts new file mode 100644 index 0000000..3c4b8fa --- /dev/null +++ b/src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.ts @@ -0,0 +1,463 @@ +import { DatePipe, DOCUMENT, NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, Inject, Renderer2, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, Countries, Dharma, PhotoDetail, Sampraday, SanghProfileData } from '@interfaces/common'; +import { IonicModule, IonModal, NavController } from '@ionic/angular'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; +import { accountNumberValidator, ifscValidator } from 'src/app/validators/common.validator'; +@Component({ + selector: 'app-sangh-edit-profile', + templateUrl: './sangh-edit-profile.page.html', + styleUrls: ['./sangh-edit-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgClass, NgFor, GjDatetimeDirective, DatePipe, + SafeUrlPipe, IonicSelectableComponent] +}) +export class SanghEditProfilePage { + @ViewChild('location') location: ElementRef; + @ViewChild('confirmCancelModel') confirmCancelModel: IonModal; + + sanghInformationForm: FormGroup; + sanghData: SanghProfileData; + dateValue = ''; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + sanghList = []; + currentDate = this.formatDate((new Date()).toISOString()); + sanghRegDate: any; + sanghTypes = constants.sanghTypes; + prevValue: string; + members = []; + templeType = []; + mulnayakBhagwan = []; + countryCodes = []; + students = []; + books = []; + confirmOptions = constants.confirmOptions; + qrCode = new PhotoDetail(); + numLength = 10; + + constructor( + private cRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private renderer: Renderer2, + @Inject(DOCUMENT) private document: Document, + private cameraGalleryService: CameraGalleryService, + public utilityService: UtilityService + ) { + this.getProfileInfo(); + this.members = this.stateManagementService?.common?.data?.number_of_members ?? []; + this.templeType = this.stateManagementService?.common?.data?.derasar_type ?? []; + this.mulnayakBhagwan = this.stateManagementService?.common?.data?.mulnayak_bhagwan ?? []; + this.students = this.stateManagementService?.common?.data?.number_of_students ?? []; + this.books = this.stateManagementService?.common?.data?.number_of_books ?? []; + + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + } else { + this.getSampradayDetails(); + } + this.renderer.addClass(this.document.body, 'sangh-selectable'); + } + + setConditionalValidators(value: number): void { + const ifscCodeControl = this.sanghInformationForm?.get('bank_ifsc'); + const branchNameControl = this.sanghInformationForm?.get('bank_branch'); + + if (value) { + ifscCodeControl.setValidators([Validators.required, ifscValidator]); + branchNameControl.setValidators([Validators.required]); + } else { + ifscCodeControl.clearValidators(); + branchNameControl.clearValidators(); + } + + ifscCodeControl.updateValueAndValidity(); + branchNameControl.updateValueAndValidity(); + } + + setDefaultCountryCode() { + this.countryCodes.forEach((elem) => { + if (elem.iso === 'IN') { + this.sanghInformationForm.controls.phoneCode.setValue(elem); + this.codeChange({ value: { num_length: 10 } }) + } + }); + } + + fetchCountryCodes() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryCodes = res.countries; + this.stateManagementService.countryDetails = res.countries; + if (this.countryCodes) { + this.setDefaultCountryCode(); + } + }); + } + + codeChange(event, library = false) { + this.numLength = event.value.num_length; + if (library) { + this.sanghInformationForm.controls.librarian_mobile_number.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } else { + this.sanghInformationForm.controls.mobile_number.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } + } + + ionViewWillEnter() { + this.getProfileInfo(); + } + + getProfileInfo() { + this.httpRequestService.get(api.sanghProfile.replace('{id}', this.cRoute.snapshot.paramMap.get('id'))).then((res: any) => { + this.sanghData = res.data; + this.sanghInformationForm = new FormGroup({ + sangh_type: new FormControl(this.sanghData.sangh_type, Validators.required), + name: new FormControl(this.sanghData.name, Validators.required), + dharma_id: new FormControl(this.sanghData.dharma_id), + sampraday_id: new FormControl(this.sanghData.sampraday_id), + reg_number: new FormControl(this.sanghData.reg_number), + mulnayak_bhagwan_name: new FormControl(null), + type_of_template: new FormControl(this.sanghData.type_of_template), + reg_date: new FormControl(this.sanghData.reg_date), + number_of_members: new FormControl(this.sanghData.number_of_members, Validators.required), + + address: new FormControl(this.sanghData.address, Validators.required), + city: new FormControl(this.sanghData.city, Validators.required), + state: new FormControl(this.sanghData.state, Validators.required), + longitude: new FormControl(this.sanghData.longitude, Validators.required), + latitude: new FormControl(this.sanghData.latitude, Validators.required), + about: new FormControl(this.sanghData.about), + mobile_number: new FormControl(this.sanghData.mobile_number, Validators.required), + email: new FormControl(this.sanghData.email, Validators.email), + sangh_website: new FormControl(this.sanghData.sangh_website), + apartment_name: new FormControl(this.sanghData.apartment_name), + + aaradhana_bhavan_status: new FormControl(this.sanghData.aaradhana_bhavan_status ?? 0, Validators.required), + pathshala_status: new FormControl(this.sanghData.pathshala_status ?? 0, Validators.required), + no_of_students: new FormControl(this.sanghData.no_of_students), + library_status: new FormControl(this.sanghData.library_status ?? 0, Validators.required), + library_name: new FormControl(this.sanghData.library_name), + librarian_name: new FormControl(this.sanghData.librarian_name), + librarian_mobile_number: new FormControl(this.sanghData.librarian_mobile_number), + phoneCode: new FormControl(null), + number_of_books: new FormControl(this.sanghData.number_of_books), + + tifin_service_status: new FormControl(this.sanghData.tifin_service_status ?? 0, Validators.required), + bhojanshala_status: new FormControl(this.sanghData.bhojanshala_status ?? 0, Validators.required), + aayambilshala_status: new FormControl(this.sanghData.aayambilshala_status ?? 0, Validators.required), + mahila_mandal_status: new FormControl(this.sanghData.mahila_mandal_status ?? 0, Validators.required), + yuva_mandal_status: new FormControl(this.sanghData.yuva_mandal_status ?? 0, Validators.required), + swapna_chadawa_organised_status: new FormControl(this.sanghData.swapna_chadawa_organised_status ?? 0), + + bank_account_number: new FormControl(this.sanghData.bank_account_number, accountNumberValidator), + bank_ifsc: new FormControl(this.sanghData.bank_ifsc), + bank_branch: new FormControl(this.sanghData.bank_branch), + bank_upi_id: new FormControl(this.sanghData.bank_upi_id), + bank_qr_code: new FormControl(null) + }, {}); + + this.sanghInformationForm?.get('bank_account_number').valueChanges.subscribe(value => { + this.setConditionalValidators(value); + }); + + this.onSanghTypeChange(); + this.onChangeFields(this.sanghData.pathshala_status, false) + this.onChangeFields(this.sanghData.library_status, true) + + this.sanghRegDate = this.sanghData.reg_date; + + const mulnayak_bhagwan = this.stateManagementService?.common?.data?.mulnayak_bhagwan.find(e => e.id === this.sanghData.mulnayak_bhagwan_name); + this.sanghInformationForm.controls.mulnayak_bhagwan_name.setValue(mulnayak_bhagwan); + + this.qrCode.url = this.sanghData.bank_qr_code; + + this.sampradayDetails.forEach((elem) => { + if (elem.id === this.sanghData.sampraday_id) { + this.sanghInformationForm.controls.sampraday_id.setValue(elem); + } + }); + + if (this.stateManagementService.countryDetails.length > 0) { + this.countryCodes = this.stateManagementService.countryDetails; + this.setDefaultCountryCode(); + } else { + this.fetchCountryCodes(); + } + }); + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.location.nativeElement, []).subscribe((details) => { + const { city, state, apartment } = this.getCityAndState(details.address_components); + + city && this.sanghInformationForm.controls.city.setValue(city); + state && this.sanghInformationForm.controls.state.setValue(state); + apartment && this.sanghInformationForm.controls.apartment_name.setValue(apartment); + this.sanghInformationForm.controls.address.setValue(this.location.nativeElement.value); + this.sanghInformationForm.controls.latitude.setValue(details.geometry.location.lat()); + this.sanghInformationForm.controls.longitude.setValue(details.geometry.location.lng()); + }); + } + + getCityAndState(addressComponents: any): { city: string, state: string, apartment: string } { + let city = ''; + let state = ''; + let apartment = ''; + + addressComponents.forEach(component => { + const types = component.types; + if (types.includes('locality')) { + city = component.long_name; + } + if (types.includes('administrative_area_level_1')) { + state = component.long_name; + } + if (types.includes('subpremise')) { + apartment = component.long_name; + } + }); + + return { city, state, apartment }; + } + + removeLatAndLong() { + this.sanghInformationForm.controls.latitude.reset(); + this.sanghInformationForm.controls.longitude.reset(); + } + + onSubmit(form) { + if (!this.sanghInformationForm.valid) { + this.sanghInformationForm.markAllAsTouched(); + this.alert.showToasterError('Please fill required fields'); + return; + } + + const apiUrl = api.updateSanghProfile.replace('{sangh_id}', String(this.cRoute.snapshot.paramMap.get('id'))); + if (form.value.sampraday_id && form.value.sampraday_id.id) { + form.value.sampraday_id = form.value.sampraday_id.id; + } + + if (form.value.mulnayak_bhagwan_name && form.value.mulnayak_bhagwan_name.id) { + form.value.mulnayak_bhagwan_name = form.value.mulnayak_bhagwan_name.id; + } + + if (form.value.reg_date) { + form.value.reg_date = this.formatDate(form.value.reg_date); + } + this.presentAlertPrompt(apiUrl, form); + } + + selectProfileImage() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (imageData) { + this.sanghData.avatar = imageData.imgString; + const apiUrl = api.updateSanghProfile.replace('{sangh_id}', String(this.cRoute.snapshot.paramMap.get('id'))); + const formdata = new FormData(); + formdata.append('avatar', imageData.itemImage); + this.httpRequestService.post(apiUrl, formdata).then((res: CommonResponse) => { + this.sanghData.avatar = imageData.imgString; + this.alert.showToaster(res.message); + }); + } + }); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + const params = { + dharma_id: (this.sanghInformationForm && this.sanghInformationForm.controls.dharma_id.value) + ? this.sanghInformationForm.controls.dharma_id.value : '' + }; + this.httpRequestService.get(api.sampradayDetails, params).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + }); + } + + getSanghList(event) { + if (!event.value.trim()) { + return this.sanghList = []; + } + + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue, true); + this.prevValue = event.value; + if (!isSameStr) { + const params = { + name: event.value.trim(), + dharma_id: this.sanghInformationForm.controls.dharma_id.value, + sampraday_id: this.sanghInformationForm.controls.sampraday_id.value.id, + page: 1, + limit: 10, + }; + this.httpRequestService.get(api.sanghSearchList, params).then((res: any) => { + if (event.value) { + this.sanghList = res.data.data; + } + }); + } + } + + onDharmChange() { + this.sanghInformationForm.controls.sampraday_id.setValue(null); + this.getSampradayDetails(); + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + async presentAlertPrompt(apiUrl, form) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure that all information is correct?' + ); + if (isYes) { + const formValue = { ...form.value }; + + if (+formValue.sangh_type === 1) { + delete formValue.mulnayak_bhagwan_name; + delete formValue.type_of_template; + delete formValue.swapna_chadawa_organised_status; + } + + const formdata = new FormData(); + for (const [key, value] of Object.entries(formValue)) { + if (value !== null && value !== undefined && value !== '') { + if ((typeof (value) === 'string' || value instanceof Blob)) { + formdata.append(key, value); + } else if ((typeof (value) === 'number' || value instanceof Array)) { + formdata.append(key, value.toString()); + } + } + } + + if (+this.sanghData.sangh_status === 2) { + formdata.append('sangh_status', '0'); + } + + if (!this.sanghInformationForm?.controls?.bank_qr_code?.value) { + formdata.append('bank_qr_code', ''); + } + + if (!this.sanghData?.avatar) { + this.alert.showToasterError("Sangh profile image is required"); + return; + } + + this.httpRequestService.post(apiUrl, formdata).then((res: CommonResponse) => { + this.navCtrl.navigateBack([Roots.page + '/' + Roots.sanghProfile, { sanghId: this.cRoute.snapshot.paramMap.get('id') }]); + this.alert.showToaster(res.message); + }); + } + } + + selectImages() { + this.cameraGalleryService.selectImage(512, 512, false).then((imageData: { imgString: string; itemImage: Blob }) => { + this.qrCode.url = imageData.imgString; + this.qrCode.imageData = imageData.itemImage; + this.sanghInformationForm.controls.bank_qr_code.setValue(imageData.itemImage); + }); + } + + profileView(url: string): void { + this.utilityService.imagePreview(url); + } + + removeImage(): void { + this.qrCode = new PhotoDetail(); + this.sanghInformationForm.controls.bank_qr_code.setValue(null); + } + + onChangeFields(event, library = false): void { + let keys = []; + if (library) { + keys = ['library_name', 'librarian_name', 'librarian_mobile_number', 'number_of_books']; + event ? this.addControlValidation(keys) : this.removeControlValidation(keys); + } else { + keys = ['no_of_students']; + event ? this.addControlValidation(keys) : this.removeControlValidation(keys); + } + } + + onSanghTypeChange(): void { + if (+this.sanghInformationForm?.controls?.sangh_type.value === 1) { + this.sanghInformationForm.get('mulnayak_bhagwan_name').clearValidators(); + this.sanghInformationForm.get('type_of_template').clearValidators(); + this.sanghInformationForm.get('swapna_chadawa_organised_status').clearValidators(); + + } else { + this.sanghInformationForm.get('mulnayak_bhagwan_name').addValidators([Validators.required]); + this.sanghInformationForm.get('type_of_template').addValidators([Validators.required]); + this.sanghInformationForm.get('swapna_chadawa_organised_status').addValidators([Validators.required]); + } + this.sanghInformationForm.get('mulnayak_bhagwan_name').updateValueAndValidity(); + this.sanghInformationForm.get('type_of_template').updateValueAndValidity(); + this.sanghInformationForm.get('swapna_chadawa_organised_status').updateValueAndValidity(); + } + + removeControlValidation(keys: string[]): void { + for (const key of keys) { + if (this.sanghInformationForm.get(key)) { + this.sanghInformationForm.get(key).clearValidators(); + this.sanghInformationForm.get(key).updateValueAndValidity(); + } + } + } + + addControlValidation(keys: string[]): void { + for (const key of keys) { + if (this.sanghInformationForm.get(key)) { + if (key === 'librarian_mobile_number') { + this.sanghInformationForm.get(key).setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } else { + this.sanghInformationForm.get(key).setValidators([Validators.required]); + } + } + } + } + + onConfirm(ok = false) { + this.confirmCancelModel.isOpen = false; + } + + async onDelete() { + this.confirmCancelModel.isOpen = true; + } + + async resetDharm() { + const isYes = await this.utilityService.presentConfirm( + 'Dharm and Sampraday values will reset. Please confirm!' + ); + if (isYes) { + this.sanghInformationForm.controls.dharma_id.setValue(null); + this.sanghInformationForm.controls.sampraday_id.setValue(null); + } + } + +} diff --git a/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.html b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.html new file mode 100644 index 0000000..d7936a8 --- /dev/null +++ b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.html @@ -0,0 +1,196 @@ + + + + + + Add Sangh + + + + +
+
+
+
+
+
+
+
+
+

Facilities of Sangh

+
+ + +
+ + + {{option.text}} + +
+
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + + + +
+ + + +

{{student.value}}

+
+
+
+ + Students counts is required. + +
+
+
+
+
+ +
+ + + {{option.text}} + + + +
+ + +
+ + Library name is required. + +
+
+ +
+ + +
+ + Librarian name is required. + +
+
+ +
+ +
+ + + +
+
+ + Mobile number is required. + + + Please enter {{ numLength }} digit mobile number. + +
+
+ +
+ + + +

{{book.value}}

+
+
+
+ + Books count is required. + +
+
+
+
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+ +
+ + + {{option.text}} + +
+
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.scss b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.scss new file mode 100644 index 0000000..6a8c480 --- /dev/null +++ b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.scss @@ -0,0 +1,75 @@ +h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0rem; + color: var(--ion-color-sangh); +} + +ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; +} + +.top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } +} + +ion-radio-group { + display: flex; + gap: 50px; + margin: 10px 0 10px 0; + + ion-label { + margin: var(--ion-margin-0); + } + + ion-radio { + --color-checked: var(--ion-color-sangh) !important; + + &::part(container) { + --border-width: 1px; + border-color: var(--ion-color-sangh); + } + + &.radio-checked { + --color-checked: var(--ion-color-sangh) !important; + } + } +} + +.temple-list { + ion-radio-group { + display: flex; + flex-direction: column; + gap: 15px; + } +} + +hr { + height: 1px; + background: #E1E1E1; + width: 100%; + margin-top: 20px; +} + +ion-footer { + padding-bottom: env(safe-area-inset-bottom); +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.ts b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.ts new file mode 100644 index 0000000..2684f80 --- /dev/null +++ b/src/app/pages/sangh/sangh-facilities/sangh-facilities.page.ts @@ -0,0 +1,127 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { Countries, Country } from '@interfaces/common'; +import { SanghFacilitiesForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +@Component({ + selector: 'app-sangh-facilities', + templateUrl: './sangh-facilities.page.html', + styleUrls: ['./sangh-facilities.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, IonicSelectableComponent, NgFor] +}) +export class SanghFacilitiesPage implements OnInit { + countryCodes: Array = []; + sanghFacilitiesForm: FormGroup; + confirmOptions = constants.confirmOptions; + numLength = 10; + students = []; + books = []; + + constructor( + private httpRequestService: HttpRequestService, + public santService: SantInfoService, + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private alert: AlertService + ) { } + + ngOnInit() { + this.sanghFacilitiesForm = this.santService.sanghFacilitiesForm; + } + + ionViewWillEnter(): void { + this.sanghFacilitiesForm = this.santService.sanghFacilitiesForm; + if (+this.santService.sanghInfoForm?.controls?.sangh_type.value === 1) { + this.removeControlValidation(['swapna_chadawa_organised_status']); + } else { + this.addControlValidation(['swapna_chadawa_organised_status']); + } + this.students = this.stateManagementService?.common?.data?.number_of_students ?? []; + this.books = this.stateManagementService?.common?.data?.number_of_books ?? []; + + if (this.stateManagementService.countryDetails.length > 0) { + this.countryCodes = this.stateManagementService.countryDetails; + this.setDefaultCountryCode(); + } else { + this.fetchCountryCodes(); + } + this.onChangeFields(this.sanghFacilitiesForm.controls.library_status.value, true); // update validation for library felids + this.onChangeFields(this.sanghFacilitiesForm.controls.pathshala_status.value, false); // update validation for pathsala felids + } + + setDefaultCountryCode() { + this.countryCodes.forEach((elem) => { + if (elem.iso === 'IN') { + this.sanghFacilitiesForm.controls.phoneCode.setValue(elem); + this.codeChange({ value: { num_length: 10 } }) + } + }); + } + + fetchCountryCodes() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryCodes = res.countries; + this.stateManagementService.countryDetails = res.countries; + if (this.countryCodes) { + this.setDefaultCountryCode(); + } + }); + } + + moveToNext(form) { + if (!form.valid) { + this.sanghFacilitiesForm.markAllAsTouched(); + this.alert.showToasterError('Please fill required fields'); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghDonation); + } + + codeChange(event) { + this.numLength = event.value.num_length; + this.sanghFacilitiesForm.controls.librarian_mobile_number.setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } + + onChangeFields(event, library = false): void { + let keys = []; + if (library) { + keys = ['library_name', 'librarian_name', 'librarian_mobile_number', 'number_of_books']; + event ? this.addControlValidation(keys) : this.removeControlValidation(keys); + } else { + keys = ['no_of_students']; + event ? this.addControlValidation(keys) : this.removeControlValidation(keys); + } + } + + removeControlValidation(keys: string[]): void { + for (const key of keys) { + if (this.sanghFacilitiesForm.get(key)) { + this.sanghFacilitiesForm.get(key).clearValidators(); + this.sanghFacilitiesForm.get(key).updateValueAndValidity(); + } + } + } + + addControlValidation(keys: string[]): void { + for (const key of keys) { + if (this.sanghFacilitiesForm.get(key)) { + if (key === 'librarian_mobile_number') { + this.sanghFacilitiesForm.get(key).setValidators([Validators.required, Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + } else { + this.sanghFacilitiesForm.get(key).setValidators([Validators.required]); + } + } + } + } + +} diff --git a/src/app/pages/sangh/sangh-information/sangh-information.page.html b/src/app/pages/sangh/sangh-information/sangh-information.page.html new file mode 100644 index 0000000..c23aacb --- /dev/null +++ b/src/app/pages/sangh/sangh-information/sangh-information.page.html @@ -0,0 +1,143 @@ + + + + + + Add Sangh + + + +
+
+
+
+
+
+
+
+
+

Sangh Information

+
+ +
+ + + {{sangh.text}} + +
+ + Sangh type is required. + +
+
+ +
+ + + {{temple.value}} + +
+ + Derasar type is required. + +
+
+ +
Reset +
+ +
+ + + {{dharma.name}} + +
+ +
+ + + +
+ + + + + +
+
+ + + +
+ + Mulnayak Bhagwan name is required. + +
+
+
+ +
+ + +
+ + Sangh name is required. + +
+
+ + + + + + +

{{ sangh.name }}

+
+
+
+
+
+ +
+ + +
+ +
+ + {{sanghRegDate ? (sanghRegDate | date: 'dd-MM-yyyy') : + 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + +
+ +
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-information/sangh-information.page.scss b/src/app/pages/sangh/sangh-information/sangh-information.page.scss new file mode 100644 index 0000000..0c1216c --- /dev/null +++ b/src/app/pages/sangh/sangh-information/sangh-information.page.scss @@ -0,0 +1,85 @@ +app-sangh-information { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color-sangh); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + .top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } + } + + .search-data { + top: auto !important; + width: calc(100% - 32px) !important; + + ion-list { + border: 1px solid var(--ion-content-color-sant); + border-radius: 5px; + + ion-item { + ion-label { + max-width: inherit !important; + white-space: normal !important; + width: 69vw; + margin: var(--ion-margin-0); + } + + &:last-child { + border: none; + } + } + } + } + + &.sangh { + form { + position: relative; + + .reset-dharm { + float: right; + } + } + } + } + + ion-footer { + padding-bottom: env(safe-area-inset-bottom); + } +} + +.demo-class { + ion-action-sheet { + .action-sheet-button { + height: auto; + contain: content; + padding-top: var(--ion-padding-10); + padding-bottom: var(--ion-padding-10); + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-information/sangh-information.page.ts b/src/app/pages/sangh/sangh-information/sangh-information.page.ts new file mode 100644 index 0000000..3100972 --- /dev/null +++ b/src/app/pages/sangh/sangh-information/sangh-information.page.ts @@ -0,0 +1,161 @@ +import { DOCUMENT, DatePipe, NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, Inject, OnInit, Renderer2 } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { Dharma, Sampraday } from '@interfaces/common'; +import { SanghInformationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; +@Component({ + selector: 'app-sangh-information', + templateUrl: './sangh-information.page.html', + styleUrls: ['./sangh-information.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, NgFor, NgClass, IonicSelectableComponent, GjDatetimeDirective, DatePipe] +}) +export class SanghInformationPage implements OnInit { + sanghInformationForm: FormGroup; + dateValue = ''; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + sanghList = []; + currentDate = this.formatDate((new Date()).toISOString()); + sanghRegDate = ''; + sanghTypes = constants.sanghTypes; + templeType = []; + mulnayakBhagwan = []; + prevValue: string; + + constructor( + private navCtrl: NavController, + public santService: SantInfoService, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + private renderer: Renderer2, + @Inject(DOCUMENT) private document: Document, + public utilityService: UtilityService + ) { } + + ngOnInit() { + this.renderer.addClass(this.document.body, 'demo-class'); + this.sanghInformationForm = this.santService.sanghInfoForm; + this.templeType = this.stateManagementService?.common?.data?.derasar_type ?? []; + this.mulnayakBhagwan = this.stateManagementService?.common?.data?.mulnayak_bhagwan ?? []; + + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + this.sampradayDetails.forEach((elem) => { + if (elem?.id === this.sanghInformationForm.controls.sampraday_id.value?.id) { + this.sanghInformationForm.controls.sampraday_id.setValue(elem); + } + }); + } else { + this.getSampradayDetails(); + } + this.renderer.addClass(this.document.body, 'sangh-selectable'); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + const params = { + dharma_id: this.santService.sanghInfoForm.controls.dharma_id.value + }; + this.httpRequestService.get(api.sampradayDetails, params).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + if (this.sampradayDetails) { + this.sampradayDetails.forEach((elem) => { + if (elem?.id === this.sanghInformationForm.controls.sampraday_id.value?.id) { + this.sanghInformationForm.controls.sampraday_id.setValue(elem); + } + }); + } + }); + } + + getSanghList(event) { + if (!event.value.trim() || !this.sanghInformationForm.controls.dharma_id?.value || + !this.sanghInformationForm?.controls.sampraday_id.value?.id) { + return this.sanghList = []; + } + + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue, true); + this.prevValue = event.value; + if (!isSameStr) { + const params = { + name: event.value.trim(), + dharma_id: this.sanghInformationForm.controls.dharma_id.value, + sampraday_id: this.sanghInformationForm.controls.sampraday_id.value.id, + page: 1, + limit: 10, + }; + this.httpRequestService.get(api.sanghSearchList, params).then((res: any) => { + if (event.value) { + this.sanghList = res.data.data; + } + }); + } + } + + onDharmChange(): void { + this.sanghInformationForm.controls.sampraday_id.setValue(null); + this.getSampradayDetails(); + } + + moveToNext(form) { + if (form.value.reg_date) { + form.value.reg_date = this.formatDate(form.value.reg_date); + } + if (!form.valid) { + this.sanghInformationForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghAddress); + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + onSanghTypeChange(): void { + if (+this.santService.sanghInfoForm?.controls?.sangh_type.value === 1) { + this.sanghInformationForm.get('mulnayak_bhagwan_name').clearValidators(); + this.sanghInformationForm.get('type_of_template').clearValidators(); + + } else { + this.sanghInformationForm.get('mulnayak_bhagwan_name').addValidators([Validators.required]); + this.sanghInformationForm.get('type_of_template').addValidators([Validators.required]); + } + this.sanghInformationForm.get('mulnayak_bhagwan_name').updateValueAndValidity(); + this.sanghInformationForm.get('type_of_template').updateValueAndValidity(); + } + + async resetDharm() { + const isYes = await this.utilityService.presentConfirm( + 'Dharm and Sampraday values will reset. Please confirm!' + ); + if (isYes) { + this.sanghInformationForm.controls.dharma_id.setValue(null); + this.sanghInformationForm.controls.sampraday_id.setValue(null); + } + } +} diff --git a/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.html b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.html new file mode 100644 index 0000000..2fcb4d6 --- /dev/null +++ b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.html @@ -0,0 +1,132 @@ + + + + + + {{haveMemberCard ? 'Member ID card' : 'Sangh Member ID Card Form'}} + + + + + +
+

+

Member ID Card

+

+
+
+
+ + + +
+
+

+ {{memberDetail?.sangh?.name}} +

+

+ {{memberDetail?.sangh?.city}} , + {{memberDetail?.sangh?.state}} +

+
+
+
+
+

Member ID : {{memberDetail?.member_id}}

+

{{memberDetail?.user?.name}}

+

{{currentLocation}}

+
+
+ +
+
+ +
+
+
+ + + +

Sangh Detail

+
+
+
+
+ + + +
+
+

+ {{memberDetail?.sangh?.name}} +

+

+ {{memberDetail?.sangh?.city}} , + {{memberDetail?.sangh?.state}} +

+
+
+
+
+ +

Member Detail

+ +
+ +
+ + +
+ +
+ + +
+ + Full name is required. + +
+
+ + + +
+ +
+ + + UPLOAD IMAGE + + +
+ Upload profile + +
+
+
+

Note : Maximum allowed Image size is 2 MB.

+
+
+
+
+ + + + + Submit + + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.scss b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.scss new file mode 100644 index 0000000..f9f1cf9 --- /dev/null +++ b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.scss @@ -0,0 +1,263 @@ +h2, +h4 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 10px; + color: var(--ion-color-sangh); +} + + +ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; +} + +.top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } +} + +.upload-container { + width: 100%; + min-height: 80px; + border: 1.5px dashed #B4B4B4; + text-align: center; + padding: 0.8rem; + color: var(--ion-color-sangh); + background-color: var(--ion-color-light-dark); + justify-content: center; + align-items: center; + display: flex; + + ion-icon { + margin-right: 0.5rem; + } +} + +.back { + margin-left: 6px; + font-size: 25px; + font-weight: 800; +} + +.upload-preview { + display: flex; + align-items: center; + padding: 5px; + position: relative; + gap: 10px; + + img { + width: 100px; + height: 80px; + object-fit: cover; + border-radius: 5px; + } + + ion-icon { + position: absolute; + background: var(--ion-color-white); + font-size: 20px; + border-radius: var(--ion-border-radius-100); + color: #343434; + right: 0px; + top: 8px; + } +} + +ion-footer { + padding-bottom: env(safe-area-inset-bottom); +} + + + +.search { + input { + width: 100%; + display: flex; + height: 40px; + align-items: center; + padding-left: 5px; + font-size: 14px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + background: transparent; + } +} + +.member-card { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .card-title { + margin-top: 10px; + margin-bottom: 0px; + color: var(--ion-color-sangh); + font-size: 14px; + font-weight: 600; + } + + .card-content { + border: 1px solid var(--ion-color-sangh); + width: 100%; + border-radius: 10px; + margin-top: -5px; + + .header { + display: flex; + background-color: var(--ion-background-content-sangh); + padding: 0px 5px; + align-items: center; + gap: 10px; + border-top-right-radius: 10px; + border-top-left-radius: 10px; + + .sangh-content { + p { + font-size: 12px; + font-weight: 600; + margin: 5px 0px + } + + p:first-child { + color: var(--ion-color-sangh); + font-size: 16px; + } + } + } + + .content { + display: flex; + align-items: center; + border-bottom: 1px solid var(--ion-color-sangh); + } + + .info { + flex: 0 0 75%; + padding-right: 1rem; + + p:first-child { + color: #B4B4B4; + font-size: 12px; + + .text-black { + color: var(--ion-color-black); + font-weight: 600; + } + } + + p { + font-size: 14px; + padding: 0px 10px; + font-weight: 600; + margin: 7px 0px; + } + + } + + .profile-img { + flex: 1; + padding: 5px 10px; + } + + .profile-img img { + max-width: 100%; + height: auto; + border-radius: 5px; + border: 1px solid var(--ion-color-sangh); + } + + .footer { + display: flex; + align-items: center; + justify-content: end; + margin-right: 10px; + + p { + font-size: 10px; + } + + img { + height: 38px; + width: 38px; + } + } + } +} + +.profile-bg { + width: 70px; + height: 70px; + background: url(/assets/images/profile-bg-sangh.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + margin-top: 5px; + + img { + border: 1px solid #fff; + border-radius: var(--ion-border-radius-100); + width: 45px; + height: 45px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } +} + +.disable-input { + ion-input { + background-color: var(--ion-color-light-dark); + border: none !important; + pointer-events: none; + } +} + +.sangh-detail-card { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-bottom: 20px; + + .card-content { + border: 1px solid var(--ion-color-sangh); + width: 100%; + border-radius: 10px; + + .header { + display: flex; + background-color: var(--ion-background-content-sangh); + padding: 0px 5px; + align-items: center; + gap: 10px; + border-radius: 10px; + + .sangh-content { + p { + font-size: 12px; + font-weight: 600; + margin: 5px 0px + } + + p:first-child { + color: var(--ion-color-sangh); + font-size: 16px; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.ts b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.ts new file mode 100644 index 0000000..258d505 --- /dev/null +++ b/src/app/pages/sangh/sangh-member-card/sangh-member-card.page.ts @@ -0,0 +1,182 @@ +import { NgIf } from "@angular/common"; +import { Component, ElementRef, OnInit, ViewChild } from "@angular/core"; +import { FormGroup, FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { api } from "@enums/api.enum"; +import { Roots } from "@enums/root.enum"; +import { CommonResponse, Member, ProfileData } from "@interfaces/common"; +import { SanghMemberForm } from "@interfaces/form"; +import { IonicModule, NavController } from "@ionic/angular"; +import { AlertService } from "@services/alert.service"; +import { CameraGalleryService } from "@services/camera-gallery.service"; +import { HttpRequestService } from "@services/http-request.service"; +import { SantInfoService } from "@services/sant-info.service"; +import { UtilityService } from "@services/utility.service"; + +@Component({ + selector: 'app-sangh-information', + templateUrl: './sangh-member-card.page.html', + styleUrls: ['./sangh-member-card.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf] +}) +export class SanghMemberCardPage implements OnInit { + @ViewChild('Location', { static: false }) Location: ElementRef; + longitude = ''; + latitude = ''; + currentLocation: string; + sanghId: string + sanghMemberForm: FormGroup; + haveMemberCard = false; + memberDetail: Member; + userDetail: ProfileData; + loader = false; + + constructor( + private utilityService: UtilityService, + private cRoute: ActivatedRoute, + private navCtrl: NavController, + public santService: SantInfoService, + private cameraGalleryService: CameraGalleryService, + private alert: AlertService, + private httpRequestService: HttpRequestService + ) { + this.sanghId = this.cRoute.snapshot.paramMap.get('id'); + } + + ngOnInit(): void { + this.sanghMemberForm = this.santService.memberCardForm; + } + + ionViewWillEnter() { + this.getUserDetails(); + this.getSanghCard(); + } + + getSanghCard() { + this.httpRequestService.get(api.sangCard.replace('{id}', this.sanghId)).then((res: CommonResponse) => { + if (res.data) { + this.memberDetail = res.data[0]; + this.haveMemberCard = this.memberDetail?.profile_image ? true : false; + this.sanghMemberForm.controls.memberId.setValue(res.data[0].member_id); + if (this.memberDetail?.user?.user_detail[0]?.location) { + this.setAddress(this.memberDetail?.user?.user_detail[0]?.location); + } + } + }); + } + + getUserDetails(): void { + this.httpRequestService.get(api.shravakProfile).then((res: CommonResponse) => { + if (res.data) { + this.userDetail = res.data; + this.sanghMemberForm.controls.fullName.setValue(res.data.name ?? ''); + this.sanghMemberForm.controls.address.setValue(res.data.location ?? ''); + this.latitude = res.data.latitude ?? ''; + this.longitude = res.data.latitude ?? ''; + } + }); + } + + setAddress(location: string): void { + this.utilityService.getAddress(location).subscribe(res => { + const { city, state } = this.getCityAndState(res[0].address_components); + this.currentLocation = city + ',' + state; + }); + } + + getCityAndState(addressComponents: any): { city: string, state: string } { + let city = ''; + let state = ''; + + addressComponents.forEach(component => { + const types = component.types; + if (types.includes('locality')) { + city = component.long_name; + } + if (types.includes('administrative_area_level_1')) { + state = component.long_name; + } + }); + + return { city, state }; + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.Location.nativeElement, []).subscribe((details) => { + this.longitude = details.geometry.location.lng(); + this.latitude = details.geometry.location.lat(); + this.sanghMemberForm.controls.address.setValue(details.formatted_address ?? ''); + }); + } + + selectImages() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (this.utilityService.isMaxFileSize(imageData?.itemImage?.size)) { + this.alert.showToasterError('Image size exceeds 2MB limit. Please choose a smaller file'); + return; + } + this.sanghMemberForm.controls.profile_url.setValue(imageData.imgString); + this.sanghMemberForm.controls.profile.setValue(imageData.itemImage); + }); + } + + profileView(url: string): void { + this.utilityService.imagePreview(url); + } + + removeImage(): void { + this.sanghMemberForm.controls.profile_url.setValue(null); + this.sanghMemberForm.controls.profile.setValue(null); + } + + onSubmit(): void { + if (!this.sanghMemberForm.valid) { + this.sanghMemberForm.markAllAsTouched(); + return; + } + + if (!this.sanghMemberForm.controls.profile_url.value) { + this.alert.showToasterError('Profile photo is required'); + return; + } + const formValue = this.sanghMemberForm.value; + + const formData = new FormData(); + formData.append('name', formValue.fullName); + formData.append('sangh_id', this.sanghId); + formData.append('member_id', this.memberDetail?.member_id?.toString()); + formData.append('location', formValue.address); + this.longitude && formData.append('longitude', this.longitude.toString()); + this.latitude && formData.append('latitude', this.latitude.toString()); + + if (formValue.profile) { + formData.append('profile_image', formValue.profile); + } + + this.loader = true; + this.httpRequestService.post(api.memberCardSangh, formData).then(() => { + this.santService.memberCardForm.reset(); + this.loader = false; + this.alert.showToaster('Member card details updated'); + this.getSanghCard(); + }).catch(() => { + this.loader = false; + }); + } + + async onPrevious(): Promise { + if (this.haveMemberCard) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', this.sanghId)); + } else { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure want to exit?', + 'No', 'Yes' + ); + if (isYes) { + this.santService.memberCardForm.reset(); + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', this.sanghId)); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.html b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.html new file mode 100644 index 0000000..dfea3f0 --- /dev/null +++ b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.html @@ -0,0 +1,111 @@ + + + + + + Members + + Add committee member + + + Add member + + + + + + + Core committee members + + + Sangh members + + +
+
+ + + +
+
+ +
+
+

{{member.name}}{{(member.pivot.role ? member.pivot.role : '') + (member.pivot.status === 0 && + member.sangh_member_status !== 1 ? ' + (Pending)' : '')}} + + Member ID : {{member.member_id}} + +

+
+
+
+
+ +
+ + +
+ +
+
+
+
+ + + + +
+
+
+ + + +
+
+ +
+
+

{{member.name}} + + {{ member.pivot.core_committee ? (member.pivot.role ? member.pivot.role : '') + + (member.pivot.status === 0 && member.sangh_member_status !== 1 ? ' (Pending)' : '') : 'Member' + + (member.pivot.status === 0 && member.sangh_member_status !== 1 ? ' + (Pending)' : '')}} + + + Member ID : {{member.member_id}} + +

+
+
+
+ + +
+
+
+
+
+ + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.scss b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.scss new file mode 100644 index 0000000..1f496aa --- /dev/null +++ b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.scss @@ -0,0 +1,174 @@ +app-sangh-members-admin-view { + background: var(--ion-background-content); + + ion-header { + ion-button { + margin: var(--ion-margin-0) 15px var(--ion-margin-0) var(--ion-margin-0); + height: auto; + + &::part(native) { + --background: var(--ion-color-white); + color: var(--ion-color-sangh); + height: 27px; + } + } + } + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + ion-segment { + padding: var(--ion-padding-10); + background: var(--ion-color-white); + border-radius: 8px 8px 0 0; + margin-top: var(--ion-margin-15); + box-shadow: 2px 2px 7px #ebebeb; + + ion-segment-button { + min-height: 30px; + --indicator-height: 0; + background: #efefef; + text-transform: capitalize; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + letter-spacing: 0; + } + + &.segment-button-checked { + background: var(--ion-color-sangh); + border-radius: 5px !important; + color: #fff; + + ion-label { + color: #fff; + } + } + + &:first-child { + border-radius: 5px 0 0 5px; + } + + &:last-child { + border-radius: 0 5px 5px 0; + } + } + } + + .data { + box-shadow: 2px 2px 7px #ebebeb; + border-radius: 0 0 8px 8px; + + ion-card { + margin: var(--ion-margin-0); + margin-bottom: var(--ion-margin-15); + box-shadow: none; + border-radius: 0 0 8px 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + margin: var(--ion-margin-0); + + &:last-child { + border-bottom: 0; + } + + .left-data { + display: flex; + align-items: center; + + .icons { + width: 50px; + height: 50px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + + &.family-members { + padding: var(--ion-padding-0); + border-radius: 100%; + overflow: hidden; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + } + } + + .content { + width: calc(100% - 60px); + } + } + + .right-icon { + display: flex; + + .edit-icon { + border-width: 0px; + height: 30px; + width: 30px; + padding: 5px; + border-radius: 5px; + background: rgb(0 0 0 / 5%); + color: var(--ion-color-sangh); + display: flex; + align-items: center; + justify-content: center; + + img { + width: auto; + height: 14px; + } + } + } + } + } + } + } + } + + .action-btn { + border-width: 0px; + height: 20px; + width: 20px; + padding: 5px; + border-radius: 5px; + + &:first-child { + color: #0BAB00; + background: rgb(11 171 0 / 15%); + } + + &:last-child { + color: #EA0000; + background: rgb(234 0 0 / 15%); + margin-left: 10px; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.ts b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.ts new file mode 100644 index 0000000..c759695 --- /dev/null +++ b/src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.ts @@ -0,0 +1,204 @@ +import { NgFor, NgIf, NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, UserData } from '@interfaces/common'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sangh-members-admin-view', + templateUrl: './sangh-members-admin-view.page.html', + styleUrls: ['./sangh-members-admin-view.page.scss'], + standalone: true, + imports: [IonicModule, NgSwitch, NgSwitchCase, NgIf, FormsModule, NgFor, NgTemplateOutlet] +}) +export class SanghMembersAdminViewPage implements OnInit { + friendRequestSegment = 'received'; + sanghId: string; + coreMemberList = []; + memberList = []; + pageNumber = 1; + totalPage = 1; + pageNumberMember = 1; + totalPageMember = 1; + type: string; + userData: UserData; + + constructor( + private navCtrl: NavController, + private cRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private alertController: AlertController, + private utilityService: UtilityService, + private stateManagementService: StateManagementService + ) { } + + get canDeleteCoreCommittee() { + return this.coreMemberList?.filter(member => member.sangh_member_status !== 2)?.length > 1; + } + + async ngOnInit() { + this.getCoreMemberList(false, ''); + this.getMemberList(false, ''); + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + ionViewWillEnter() { + this.sanghId = this.cRoute.snapshot.paramMap.get('id'); + this.type = this.cRoute.snapshot.paramMap.get('is_member'); + } + + getCoreMemberList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const apiUrl = api.sanghCommitteeMembersList.replace('{sangh_id}', String(this.cRoute.snapshot.paramMap.get('id'))); + this.httpRequestService.post(apiUrl, { + page: this.pageNumber, + limit: 15, + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.coreMemberList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + } + } + + getMemberList(isFirstLoad, event) { + if (this.pageNumberMember <= this.totalPageMember) { + const apiUrl = api.sanghMembersList.replace('{sangh_id}', String(this.cRoute.snapshot.paramMap.get('id'))); + this.httpRequestService.post(apiUrl, { + page: this.pageNumberMember, + limit: 15, + }).then((res: any) => { + this.totalPageMember = res.data.last_page; + this.memberList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumberMember++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + } + } + + loadData($event) { + this.getCoreMemberList(true, $event); + } + + loadMemberData($event) { + this.getMemberList(true, $event); + } + + addMember(type: number) { + if (type === 1) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.addCommitteeMember, { id: this.sanghId }]); + } else if (type === 2) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.inviteMembers, { id: this.sanghId, type: 'member' }]); + } + } + + async updateMemberRole(user: any) { + const alert = await this.alertController.create({ + header: 'Role Update', + message: user.name, + inputs: [ + { + name: 'role', + type: 'text', + placeholder: 'Role', + value: user.pivot.role, + }, + ], + buttons: [{ + text: 'Update', + handler: (data) => { + if (!data?.role) { this.alert.showToasterError('Please add role.'); return false; } + const params = { + sangh_id: this.cRoute.snapshot.paramMap.get('id'), + user_id: user.id, + role: data.role, + }; + this.httpRequestService.post(api.updateCommitteeMember, params).then((res: any) => { + user.pivot.role = data.role; + this.alert.showToaster(res.message); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } + }, { + text: 'Cancel', + role: 'cancel', + cssClass: 'secondary', + }] + }); + await alert.present(); + } + + async deleteMember(userId: number, type: number, index: number) { + const isYes = await this.utilityService.presentConfirm( + userId === this.userData.id ? 'Are you sure to leave this sangh?' : 'Are you sure to delete this member from sangh?', + 'No', 'Yes', userId === this.userData.id ? 'Leave Sangh' : 'Delete Member' + ); + if (isYes) { + const params = { + sangh_id: this.cRoute.snapshot.paramMap.get('id'), + user_id: userId, + }; + this.httpRequestService.post(api.deleteMember, params).then((res: any) => { + if (type === 1) { + this.coreMemberList.splice(index, 1); + } else { + this.memberList.splice(index, 1); + } + this.type = userId === this.userData.id ? '0' : this.type; + this.alert.showToaster(res.message); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } + } + + async acceptDeclineSanghMember(sangh, type, index, action) { + const isYes = await this.utilityService.presentConfirm(`Are you sure you want to ${action} the request?`); + if (isYes) { + this.alert.showLoader(); + this.httpRequestService.post(api.acceptDeclineSanghRequest, { + sangh_id: sangh.pivot.sangh_id, + user_id: sangh.pivot.user_id, + status: action === 'accept' ? 1 : 2, // 1-accept, 2-decline/cancel + is_commiittee: 1, + }).then((res: CommonResponse) => { + this.alert.showToaster(res.message); + if (action === 'accept') { + sangh.sangh_member_status = 1; + } else { + if (type === 1) { + this.coreMemberList.splice(index, 1); + } else { + this.memberList.splice(index, 1); + } + } + }).finally(() => { + this.alert.hideLoader(); + }); + } + } + + goToShravakProfile(id) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile.replace(':id', id)]); + } + +} diff --git a/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.html b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.html new file mode 100644 index 0000000..f6bd751 --- /dev/null +++ b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.html @@ -0,0 +1,33 @@ + + + + + + Add Sangh + + + +
+
+
+
+
+
+
+
+
+

Sangh profile image

+

+ {{santService.sanghInformationForm.value.sanghInfoForm.mulnayak_bhagwan_name.value}}

+

Please upload clean and original image that can help followers to identify your Sangh.

+ + + + + CHANGE PROFILE + IMAGE +
+ + Finish + Cancel + \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.scss b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.scss new file mode 100644 index 0000000..dd50326 --- /dev/null +++ b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.scss @@ -0,0 +1,89 @@ +app-sangh-profile-image { + background: var(--ion-background-content); + + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color-sangh); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + text-align: center; + + .top-line { + padding: var(--ion-padding-0) var(--ion-padding-15); + + .stepper { + display: flex; + justify-content: space-between; + margin: 15px 0px; + } + + .step { + width: 60px; + height: 4px; + background: var(--ion-background-gray); + display: flex; + align-items: center; + border-radius: 2px; + } + + .sangh-stepper { + background: var(--ion-color-sangh); + } + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + } + + .profile-bg { + width: 14rem; + height: 14rem; + margin: 2rem auto; + background: url(/assets/images/profile-bg-sangh.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + + img { + border: 2px solid #fff; + border-radius: var(--ion-border-radius-100); + width: 8.75rem; + height: 8.75rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + } + + ion-button { + margin: var(--ion-margin-0) auto; + color: var(--ion-color-sangh); + + &::part(native) { + --background: none; + border: 1px solid var(--ion-color-sangh); + } + } + } + + ion-footer { + padding-bottom: env(safe-area-inset-bottom); + background: transparent; + } + + .finish-btn { + display: flex; + + ion-button { + width: 48%; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.ts b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.ts new file mode 100644 index 0000000..619b3e8 --- /dev/null +++ b/src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.ts @@ -0,0 +1,122 @@ +import { NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { ActionSheetController, IonicModule, NavController } from '@ionic/angular'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sangh-profile-image', + templateUrl: './sangh-profile-image.page.html', + styleUrls: ['./sangh-profile-image.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, SafeUrlPipe] +}) +export class SanghProfileImagePage implements OnInit { + @ViewChild('fileInput', { static: true }) fileInput: ElementRef; + photo: any; + constructor( + private navCtrl: NavController, + public santService: SantInfoService, + public actionSheetCtrl: ActionSheetController, + private alert: AlertService, + private httpRequestService: HttpRequestService, + private utilityService: UtilityService, + private cameraGalleryService: CameraGalleryService + ) { } + + ngOnInit() { + if (this.santService.sanghProfileImage.controls.avatar.value instanceof Blob) { + const reader = new FileReader(); + reader.onload = () => { + this.photo = reader.result.toString(); + }; + reader.readAsDataURL(this.santService.sanghProfileImage.controls.avatar.value); + } else if (typeof (this.santService.sanghProfileImage.controls.avatar.value) === 'string') { + this.photo = this.santService.sanghProfileImage.controls.avatar.value; + } + } + + selectProfileImage() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (imageData) { + this.photo = imageData.imgString; + this.santService.sanghProfileImage.controls.avatar.setValue(imageData.itemImage); + } + }); + } + + addSangh(formdata) { + this.presentAlertPrompt(formdata); + } + + moveToBack() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghAddress); + } + + goToInviteMembers() { + const formdata = new FormData(); + for (const [, formValue] of Object.entries(this.santService.sanghInformationForm.value)) { + for (const [key, value] of Object.entries(formValue)) { + if (value !== null && value !== undefined && value !== '') { + if ((typeof (value) === 'string' || value instanceof Blob)) { + formdata.append(key, value); + } else if ((typeof (value) === 'number' || value instanceof Array)) { + formdata.append(key, value.toString()); + } + } + } + } + + if (formdata.has('bank_qr_code_url')) { + formdata.delete('bank_qr_code_url'); + } + + if (this.santService.sanghInformationForm.value.sanghInfoForm.sampraday_id) { + formdata.append('sampraday_id', this.santService.sanghInformationForm.value.sanghInfoForm.sampraday_id.id); + } + if (this.santService.sanghInformationForm.value.sanghInfoForm.mulnayak_bhagwan_name) { + formdata.append('mulnayak_bhagwan_name', this.santService.sanghInformationForm.value.sanghInfoForm.mulnayak_bhagwan_name.id); + } + if (!this.photo) { + this.alert.showToasterError("Sangh profile image is required"); + return; + } + this.addSangh(formdata); + } + + async presentAlertPrompt(formdata) { + const isYes = await this.utilityService.presentConfirm( + 'If every Sangh detail entered is correct, click Ok to Add Sangh else click Cancel', + 'Cancel', + 'Ok' + ); + if (isYes) { + this.alert.showSpinner(); + this.httpRequestService.post(api.addSangh, formdata).then((res: any) => { + this.alert.showToaster(res.message); + this.santService.sanghInformationForm.reset(); + this.navCtrl.navigateRoot(Roots.page + '/' + Roots.createNewSangh); + }).finally(() => { + this.alert.hideLoader(); + }); + } + } + + async goToHome() { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure want to cancel?', + 'No', + 'Yes' + ); + if (isYes) { + this.navCtrl.navigateForward([Roots.page]); + } + } + +} diff --git a/src/app/pages/sangh/sangh-profile/sangh-profile.page.html b/src/app/pages/sangh/sangh-profile/sangh-profile.page.html new file mode 100644 index 0000000..4043f31 --- /dev/null +++ b/src/app/pages/sangh/sangh-profile/sangh-profile.page.html @@ -0,0 +1,106 @@ + + + + + + Sangh profile + + + +
+ + + + +

{{sanghData?.name}}

+

{{sanghData?.address}}

+
+ karmā points | {{sanghData?.karma_points}} +
+
+ Create post + Invite + + MEMBER ID + Edit profile +
+
+ {{ sanghData?.is_user_following ? + 'Following' : 'Follow' }} + + + MEMBER ID + + + +
+
+ +
+
+

Sangh profile rejected by Admin

+

Reason: {{sanghData?.reject_reason}}

+
+
+
+
+ + + +
+

Followers{{sanghData?.followers_count}}

+
+
+
+ + + + +
+

Members{{sanghData?.sangh_members_count}}

+
+
+
+ + + + +
+
+
+
+
+
+ + + +
+

Dharm {{sanghData?.dharma?.name}}

+
+ +
+

Samprday{{sanghData?.sampraday?.name}}

+
+
+ See more + about + sangh +
+
+ + +
+
+ \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-profile/sangh-profile.page.scss b/src/app/pages/sangh/sangh-profile/sangh-profile.page.scss new file mode 100644 index 0000000..25b42c3 --- /dev/null +++ b/src/app/pages/sangh/sangh-profile/sangh-profile.page.scss @@ -0,0 +1,540 @@ +app-sangh-profile { + background: var(--ion-background-content); + + h3 { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.25rem var(--ion-margin-0); + font-weight: 700; + color: #7C459C; + } + + ion-button { + margin: var(--ion-margin-0); + --border-radius: 0.313rem; + + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + ion-header { + ion-toolbar { + ion-buttons { + ion-icon { + color: #fff; + margin: var(--ion-margin-0); + vertical-align: middle; + font-size: 25px; + } + } + } + } + + ion-content { + --background: var(--ion-background-content); + + &.sangh { + --ion-background-button: var(--ion-background-content-sangh); + --ion-color: var(--ion-color-sangh); + --ion-color-light-text: var(--ion-color-sangh); + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + .profile-bg { + width: 8.875rem; + height: 8.875rem; + margin: var(--ion-margin-0) auto 1rem auto; + background: url(/assets/images/sangh-profile-bg.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + + img { + border: 0.125rem solid #fff; + border-radius: var(--ion-border-radius-100); + width: 6.25rem; + height: 6.25rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + } + + ion-button { + height: 1.875rem; + } + + .bg { + background: var(--ion-background-white); + text-align: var(--ion-text-align-center); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + .points { + font-size: var(--ion-font-size-12); + border: 0.063rem solid #0000001A; + padding: 0.313rem 0.625rem; + border-radius: 0.938rem; + margin: var(--ion-margin-0) auto var(--ion-margin-15); + display: flex; + align-items: center; + width: max-content; + + ion-icon { + color: #FFA500; + margin-right: 3px; + } + + span { + color: #FFA500; + margin-left: 3px; + } + } + + div { + &.admin-view { + display: flex; + flex-wrap: wrap; + justify-content: center; + /* Center the content horizontally */ + gap: 16px; + /* Optional: Adds space between buttons */ + + ion-button { + flex: 0 0 45%; + /* Each button takes up 45% of the container width */ + max-width: 45%; + + &::part(native) { + padding: var(--ion-padding-0) 5px; + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + + &:nth-child(1) { + &::part(native) { + --background: var(--ion-color-sangh); + color: #fff; + } + } + + &:nth-child(3) { + &::part(native) { + --background: var(--ion-color-sangh); + color: #fff; + } + } + + img { + width: auto; + height: 10px; + margin-right: 4px; + } + } + } + + &.member-view { + display: flex; + justify-content: space-between; + + ion-button { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + width: 48%; + + &::part(native) { + padding: var(--ion-padding-0) 5px; + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + + &:first-child { + &::part(native) { + --background: var(--ion-color-sangh); + color: #fff; + } + } + + img { + width: auto; + height: 10px; + margin-right: 4px; + } + } + + &.member-label { + justify-content: center; + + ion-button { + &.m-label { + &::part(native) { + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + } + } + } + } + } + + ion-avatar { + position: relative; + + ion-button { + position: absolute; + right: 1.25rem; + bottom: 2.063rem; + width: 1.563rem; + height: 1.563rem; + + &::part(native) { + padding: 0.375rem; + border-radius: var(--ion-border-radius-100); + } + + img { + width: 13px; + height: 13px; + border: none; + background: none; + } + } + } + } + + .bottom-bg-location { + padding: var(--ion-padding-0); + + ion-card { + margin: var(--ion-margin-0); + padding: 6px; + margin-bottom: var(--ion-margin-15); + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + + ion-icon { + width: 1.438rem; + height: 1.438rem; + padding: 0.375rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + } + } + + ion-card-content { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0); + display: flex; + justify-content: space-between; + + p { + padding: var(--ion-padding-0); + + span { + color: var(--ion-color); + } + + a { + span { + color: var(--ion-color-primary, #3880ff); + } + } + } + } + + &.detail { + padding: var(--ion-padding-0); + border-radius: 0; + + ion-card-header { + padding: var(--ion-padding-10); + background: #F3E1FC; + border-top: 2px solid var(--ion-color-sangh); + border-bottom: 2px solid var(--ion-color-sangh); + + img { + width: 2.625rem; + height: 2.625rem; + margin-right: var(--ion-margin-10); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + object-fit: cover; + } + + ion-card-title { + font-size: var(--ion-font-size-14); + position: relative; + align-items: center; + margin: var(--ion-margin-0); + + p { + padding: var(--ion-padding-0); + font-size: var(--ion-font-size-14); + margin: var(--ion-margin-0); + color: #000; + font-weight: 600; + display: inline; + } + + span { + font-size: var(--ion-font-size-12); + color: var(--ion-color-sangh); + margin-top: 0.313rem; + font-weight: 400; + } + + ion-icon { + margin: var(--ion-margin-0); + background: none; + color: var(--ion-color-sangh); + font-size: var(--ion-font-size-20); + padding: var(--ion-padding-0); + } + + >div { + width: calc(100% - 10px); + } + } + + p { + margin: 0; + font-size: 12px; + display: inline-block; + margin-top: 5px; + border-radius: 10px; + color: var(--ion-color-sangh); + padding: var(--ion-padding-0); + } + } + + ion-card-content { + display: block; + + p { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10); + color: #000; + font-weight: 500; + } + + .img-upload { + flex-wrap: wrap; + + swiper-container { + swiper-slide { + text-align: center; + background: #f3e1fc; + } + + &::part(pagination) { + position: absolute; + margin: 5px var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + bottom: 0px; + background: var(--ion-color-sangh); + } + + &::part(bullet) { + background-color: #c1c1c1; + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + + } + + .footer-icon { + display: flex; + justify-content: space-between; + padding: var(--ion-padding-10); + + div { + display: flex; + align-items: center; + color: #000; + font-weight: 600; + + span { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10); + min-width: 30px; + } + } + + ion-icon { + width: 1.5rem; + height: 1.5rem; + color: var(--ion-color); + + &.heart { + color: red; + } + } + } + } + } + } + + .sangh-members { + display: flex; + justify-content: space-between; + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + ion-card-header { + ion-card-title { + div { + width: 2.688rem; + height: 2.688rem; + border-radius: 0.438rem; + background: var(--ion-background-content-sangh); + display: flex; + align-items: center; + justify-content: center; + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-12); + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: calc(100% - 2.625rem); + + span { + display: block; + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + } + } + } + } + } + + .follower { + width: 36%; + } + + .members { + width: 36%; + } + + .vihar { + width: 22%; + + ion-card-title { + justify-content: center; + } + + & div { + background: #DFEAE2; + width: 100%; + } + } + } + + .about-info { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + text-align: center; + + ion-card-header { + ion-card-title { + margin-bottom: var(--ion-margin-10); + + p { + display: flex; + justify-content: space-between; + align-items: center; + width: calc(100% - 45px); + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + font-weight: 500; + + span { + color: #000; + font-weight: 600; + text-align: right; + } + } + + .icons { + width: 2.188rem; + height: 2.188rem; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + } + } + + ion-button { + margin: var(--ion-margin-0); + } + } + + img { + path { + fill: #f00; + } + } + } + } + } + + .disable-card { + pointer-events: none; + } + + .reject-sangh { + display: flex; + flex-direction: column; + justify-content: flex-start; + padding: 15px; + } + + .reject-sangh-content { + margin-top: -20px; + border-radius: 5px; + background-color: #f8d7da; + border: 1px solid #721c24; + padding: 8px 0px; + + p { + color: #721c24; + font-weight: 500; + padding: 0px 10px; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-profile/sangh-profile.page.ts b/src/app/pages/sangh/sangh-profile/sangh-profile.page.ts new file mode 100644 index 0000000..2c4085a --- /dev/null +++ b/src/app/pages/sangh/sangh-profile/sangh-profile.page.ts @@ -0,0 +1,224 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { IonicModule, NavController, PopoverController } from '@ionic/angular'; + +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx'; +import { FooterComponent } from '@components/footer/footer.component'; +import { JoinSanghButtonComponent } from '@components/join-sangh-button/join-sangh-button.component'; +import { PostComponent } from '@components/post/post.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { SanghProfileData, UserData } from '@interfaces/common'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sangh-profile', + templateUrl: './sangh-profile.page.html', + styleUrls: ['./sangh-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgClass, JoinSanghButtonComponent, NgFor, PostComponent, FooterComponent], + providers: [SocialSharing] +}) +export class SanghProfilePage implements OnInit { + sanghData: SanghProfileData; + sanghId: string; + postList = []; + pageNumber = 1; + totalPage = 1; + userData: UserData; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private activatedRoute: ActivatedRoute, + private navCtrl: NavController, + private popoverCtrl: PopoverController, + private stateManagementService: StateManagementService, + public utilityService: UtilityService, + private socialSharing: SocialSharing + ) { } + + ngOnInit() { + this.sanghId = this.activatedRoute.snapshot.paramMap.get('sanghId'); + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + this.getProfileInfo(); + this.postList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getPostList(false, ''); + } + + getProfileInfo() { + this.httpRequestService.get(api.sanghProfile.replace('{id}', this.activatedRoute.snapshot.paramMap.get('sanghId'))).then((res: any) => { + this.sanghData = res.data; + }); + } + + getPostList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const params = { + page: this.pageNumber, + limit: 5, + sangh_id: Number(this.sanghId) + }; + this.httpRequestService.post(api.sanghPostList, params).then((res: any) => { + this.totalPage = res.data.last_page; + this.pageNumber = res.data.current_page + 1; + for (const d of res.data.data) { + const index = this.postList.findIndex(object => object.id === d.id); + if (index === -1) { + this.postList.push(d); + } + } + if (isFirstLoad) { + event.target.complete(); + } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + updatePost(postInfo) { + this.popoverCtrl.dismiss().then(() => { + const navOption = { + state: { + postData: postInfo, + isUpdate: true, + fromFeed: true, + redirectTo: `page/sangh-profile/${this.sanghId}`, + type: 3, + type_id: Number(this.sanghId), + userAvatar: this.sanghData?.avatar, + userName: this.sanghData?.name + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + }); + } + + deletePost(postId) { + this.popoverCtrl.dismiss().then(() => { + this.presentAlert(postId); + }); + } + + async presentAlert(postId) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to delete this post?', + 'No', 'Yes', 'Delete post' + ); + if (isYes) { + this.httpRequestService.delete(api.deletePost + '/' + postId).then((res: any) => { + this.postList = []; + this.pageNumber = 1; + this.getPostList(false, ''); + this.alert.showToaster(res.message); + }); + } + } + + async followSangh(event, sanghData: any) { + // --- follow sangh + const followSangh = async () => { + await this.httpRequestService.post(api.followSangh, { + sangh_id: this.sanghData.id, + }); + this.sanghData.is_user_following = !this.sanghData.is_user_following; + }; + + event.stopPropagation(); + if (sanghData.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + await followSangh(); + } + } else { + await followSangh(); + } + } + + createPost() { + const navOption = { + state: { + isUpdate: false, + fromFeed: true, + redirectTo: `page/sangh-profile/${this.sanghId}`, + type: 3, + type_id: Number(this.sanghId), + userAvatar: this.sanghData?.avatar, + userName: this.sanghData?.name + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + } + + editProfile() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.sanghEditProfile, { id: this.sanghData.id }]); + } + + memberCard() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.sanghMemberCard, { id: this.sanghData.id }]); + } + + viewAllSangh(sanghListType) { + this.navCtrl.navigateForward([ + Roots.page + '/' + Roots.viewAllSangh.replace(':sanghListType', sanghListType), + { id: this.sanghData.id } + ]); + } + + membersDetail() { + this.navCtrl.navigateForward([ + Roots.page + '/' + Roots.sanghMembersAdminView, + { id: this.sanghData.id, is_member: this.sanghData.is_member } + ]); + } + + viewVihar() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.chaturmasVihar.replace(':sanghId', String(this.sanghData.id))); + } + + aboutSangh() { + const navOption = { + state: { + sanghData: this.sanghData, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.aboutSangh, navOption); + } + + async shareProfile() { + + const imageUrl = this.sanghData.avatar + const redirectUrl = `${environment.siteUrl}/page/sangh-profile/${this.sanghId}`; + + try { + await this.socialSharing.share( + `*Our Shree Sangh is now on the Global Jain digital app!*\n\nWe encourage everyone to download the app, join the Sangh, and receive your member ID card.\n\n*हमारा श्री संघ अब ग्लोबल जैन डिजिटल ऐप पर है!*\n\nसभी से अनुरोध है कि ऐप डाउनलोड करें, संघ के सदस्य बनें, और अपना सदस्यता आईडी कार्ड प्राप्त करें।\n\n*Membership link:* ${redirectUrl}\n\nAlternatively, you can fill details in the below link and submit:https://form.jotform.com/242238674400049`, + 'Invite Member', + imageUrl + ); + } catch (error) { + console.error('Error sharing content:', error); + } + } + + addressPost(element) { + this.utilityService.openGoogleMap(element.latitude, element.longitude); + } + +} diff --git a/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.html b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.html new file mode 100644 index 0000000..59207f5 --- /dev/null +++ b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.html @@ -0,0 +1,36 @@ + + + + + + Member role select + + + + + + +
+
+ +
+
+

{{userValue?.name}}

+
+
+
+
+ + Enter role + + + +

+ Please add role. +

+
+
+
+ + Save + diff --git a/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.scss b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.scss new file mode 100644 index 0000000..5b2ed03 --- /dev/null +++ b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.scss @@ -0,0 +1,102 @@ +app-sangh-role-select { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15); + border-radius: 5px; + + ion-card-header { + ion-card-title { + .left-data { + display: flex; + align-items: center; + + .icons { + width: 35px; + height: 35px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + position: relative; + border-radius: 100%; + overflow: hidden; + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + } + } + + .content { + width: calc(100% - 60px); + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + + span { + color: var(--ion-content-color); + display: block; + font-size: var(--ion-font-size-12); + } + } + } + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-label { + border-top: 1px solid #e7e7e7; + padding: var(--ion-padding-10) var(--ion-padding-15) var(--ion-padding-0); + display: block; + } + + ion-item { + margin-bottom: var(--ion-margin-15); + --min-height: 35px; + + ion-input { + height: 35px; + } + } + } + + >ion-icon { + position: absolute; + top: 8px; + right: 6px; + font-size: 20px; + z-index: 99; + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.ts b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.ts new file mode 100644 index 0000000..9909cb0 --- /dev/null +++ b/src/app/pages/sangh/sangh-role-select/sangh-role-select.page.ts @@ -0,0 +1,47 @@ +import { NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; + +@Component({ + selector: 'app-sangh-role-select', + templateUrl: './sangh-role-select.page.html', + styleUrls: ['./sangh-role-select.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule] +}) +export class SanghRoleSelectPage { + roleValue: string; + userValue: any; + id: string; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private router: Router + ) { + this.userValue = this.router.getCurrentNavigation().extras?.state?.userValue; + this.id = this.router.getCurrentNavigation().extras?.state?.id; + } + addMember() { + const params = { + sangh_id: this.id, + user_id: [this.userValue.id], + core_committee: 1, + role: this.roleValue, + }; + this.httpRequestService.post(api.addMemberForSangh, params).then((res: any) => { + this.alert.showToaster(res.message); + this.navCtrl.navigateBack([Roots.page + '/' + Roots.sanghProfile, { sanghId: this.id }]); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } + +} diff --git a/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.html b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.html new file mode 100644 index 0000000..de1c2c3 --- /dev/null +++ b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.html @@ -0,0 +1,87 @@ + + + + + + Search sangh + + + + + + + + + + + +

+

No Sangh found. Please try again.

+

+ + + + + + +

{{ sangh?.name }}

{{ sangh?.dharma?.name }} +

+

({{ sangh?.sampraday?.name }})

+

+ + Following + Follow + Member + + Accept/Decline + + Requested +
+
+
+ + + + +
+ + + +

Sangh Filter

+ +
+ + + {{dharma.name}} + + +
+ +
+ + + +
+ +
+ + +
+ +
+ Filter + Reset +
+
+
+
diff --git a/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.scss b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.scss new file mode 100644 index 0000000..d8ee6e4 --- /dev/null +++ b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.scss @@ -0,0 +1,263 @@ +app-sangh-search-member { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + margin-right: var(--ion-margin-10); + color: #fff; + float: right; + } + + ion-title { + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + } + } + } + + ion-content { + ion-list { + padding: var(--ion-padding-10) 0; + border-bottom: 1px solid #efefef; + + ion-item { + margin: var(--ion-margin-0); + + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + + img { + background: #e2f0ff; + } + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-12) !important; + line-height: 16px !important; + } + } + + ion-button { + margin: var(--ion-margin-0); + min-height: 30px; + height: 30px; + + &.following { + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + } + } + } + } + } + } + + &.sangh { + ion-list { + ion-item { + ion-label { + ion-button { + &::part(native) { + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + } + } + } + } + } + + h3 { + p { + color: var(--ion-color-sangh); + } + } + } +} + +ion-modal { + &.sangh-filter { + --height: 350px; + align-items: flex-end; + --height: calc(350px + env(safe-area-inset-bottom)); + + ion-content { + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: var(--ion-color-sangh); + } + } + + ion-item { + &:first-child { + margin-top: var(--ion-margin-10); + } + + ion-select, + ionic-selectable { + height: 2.813rem; + border: 1px solid var(--ion-background-content-sangh); + } + + ionic-selectable { + border: 1px solid var(--ion-background-content-sangh); + padding: var(--ion-padding-10) !important; + } + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-background-content-sangh); + border-radius: 0.25rem; + height: 2.813rem; + background: transparent; + } + + h4 { + font-size: var(--ion-font-size-18); + color: var(--ion-color-sangh); + } + + .filter-btn { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-button { + width: 48%; + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } + + .ionic-selectable-value { + span { + display: flex; + + .ionic-selectable-value-item { + position: relative; + overflow: visible; + + &:before { + content: ","; + } + + &:first-child { + &:before { + content: ""; + } + } + + &:last-child { + overflow: hidden; + } + } + } + } + + .ionic-selectable-icon { + width: 12px; + } + } + } +} + +.sangh-selectable { + ionic-selectable-modal { + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + --color: white; + } + } + + ion-content { + ion-list { + ion-item-group { + ion-item { + ion-icon { + &.ion-color-primary { + --ion-color-base: var(--ion-color-sangh) !important; + } + } + + ion-label { + white-space: normal !important; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.ts b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.ts new file mode 100644 index 0000000..0396221 --- /dev/null +++ b/src/app/pages/sangh/sangh-search-member/sangh-search-member.page.ts @@ -0,0 +1,223 @@ +import { DOCUMENT, NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, Inject, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, Dharma, Sampraday, UserData } from '@interfaces/common'; +import { IonicModule, ModalController, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-sangh-search-member', + templateUrl: './sangh-search-member.page.html', + styleUrls: ['./sangh-search-member.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgIf, NgFor, IonicSelectableComponent] +}) +export class SanghSearchMemberPage implements OnInit, OnDestroy { + @ViewChild('personalLocation') personalLocation: ElementRef; + sanghList = []; + pageNumber = 1; + totalPage = 1; + searchValue = ''; + dharma_id: any; + sampraday_id: any; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + location: any; + longitude = ''; + latitude = ''; + spinnerFlag = false; + sampradayData = []; + userData: UserData; + prevValue: string; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private modalCtrl: ModalController, + private renderer: Renderer2, + @Inject(DOCUMENT) private document: Document, + private utilityService: UtilityService + ) { + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + } else { + this.getSampradayDetails(); + } + this.renderer.addClass(this.document.body, 'sangh-selectable'); + } + + async ngOnInit() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + ionViewWillEnter() { + this.getSanghList(false, ''); + } + + searchSangh() { + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.sanghList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getSanghList(false, ''); + } + } + + loadData($event) { + this.getSanghList(true, $event); + } + + getSanghList(isFirstLoad, event) { + this.spinnerFlag = false; + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.globalSearchSangh, { + page: this.pageNumber, + limit: 15, + name: this.searchValue.trim(), + dharma_id: this.dharma_id ? [this.dharma_id] : [], + sampraday_id: this.sampradayData, + latitude: this.location ? this.latitude : '', + longitude: this.location ? this.longitude : '', + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { this.sanghList = []; } + this.totalPage = res.data.last_page; + this.sanghList.push(...res.data.data); + this.spinnerFlag = true; + this.pageNumber++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + sanghProfile(sanghId: number) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(sanghId))); + } + + followSangh(event, sanghId, index) { + event.stopPropagation(); + const params = { + sangh_id: sanghId, + }; + this.httpRequestService.post(api.followSangh, params).then(() => { + this.sanghList[index].is_user_following = !this.sanghList[index].is_user_following; + }) + } + + onDharmChange() { + this.sampraday_id = []; + this.getSampradayDetails(); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + const params = { + dharma_id: this.dharma_id + }; + this.httpRequestService.get(api.sampradayDetails, params).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + }); + } + + onSampradayChange() { + this.sampradayData = []; + for (const data of this.sampraday_id) { + this.sampradayData.push(data.id); + } + } + + advanceSearch() { + this.sanghList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getSanghList(false, ''); + this.modalCtrl.dismiss(); + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.personalLocation.nativeElement, []).subscribe((details) => { + this.location = this.personalLocation.nativeElement.value; + this.longitude = details.geometry.location.lng(); + this.latitude = details.geometry.location.lat(); + }); + } + + removeLatAndLong() { + this.longitude = ''; + this.latitude = ''; + } + + resetFilter() { + this.location = ''; + this.longitude = ''; + this.latitude = ''; + this.dharma_id = ''; + this.sampraday_id = ''; + this.sampradayData = []; + this.advanceSearch(); + } + + sanghRequestStatusChange(sangh, action) { + this.alert.showLoader(); + this.httpRequestService.post(api.acceptDeclineSanghRequest, { + sangh_id: sangh.id, + user_id: sangh.user_id, + status: action, // 1-accept, 2-decline/cancel + is_commiittee: sangh.is_member, + }).then((res: CommonResponse) => { + this.alert.showToaster(res.message); + sangh.sangh_member_status = (action === 1 ? 1 : 0); // 1-accept, 0-reset + }).finally(() => { + this.alert.hideLoader(); + }); + } + + cancelSanghRequest(sangh) { + this.utilityService.presentConfirm(`Are you sure about cancel this request?`) + .then(action => { + if (action) { + this.sanghRequestStatusChange(sangh, 2); + } + }); + } + + acceptDeclineSanghMember(sangh) { + this.utilityService.presentAcceptDecline(`Please confirm`) + .then(action => { + if (action) { + this.sanghRequestStatusChange(sangh, action); + } + }); + } + + ngOnDestroy(): void { + this.renderer.removeClass(this.document.body, 'sangh-selectable'); + } + +} diff --git a/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.html b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.html new file mode 100644 index 0000000..e77cbc8 --- /dev/null +++ b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.html @@ -0,0 +1,59 @@ + + + + + + Add Sangh + + + +
+ +

Please read below

+
+ + + +

+ Only Shree Sangh Trustees or Admins are recommended to create the Sangh. +

+
+ +
+ +

+ Ensure all details are entered accurately for quicker approval. +

+
+ +
+ +

+ After submission, the Global Jain admin will review and process your request within 24 hours. +

+
+ +
+ +

+ You will receive a notification on your cell phone regarding the processing status. +

+
+ +
+
+ +
+ + + +
+
+ + Next + +
+
\ No newline at end of file diff --git a/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.scss b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.scss new file mode 100644 index 0000000..3ae40d6 --- /dev/null +++ b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.scss @@ -0,0 +1,63 @@ +.certificate-term-policy { + + .border-bottom { + border-bottom: 1px solid rgb(217, 216, 216); + margin-top: 15px; + } + + h2 { + color: var(--ion-color-sangh); + font-weight: 600; + text-align: center; + } +} + +.list-item { + display: flex; + align-items: flex-start; + margin-bottom: 15px; + justify-content: center; + + ion-icon { + margin-right: 10px; + flex: 0 0 4%; + } + + .text { + margin: 0; + font-size: 13px; + color: #333; + flex: 0 0 92%; + } + +} + +.agreed-content { + display: flex; + align-items: start; + padding: 15px; + + label { + padding-left: var(--ion-padding-10); + font-size: 13px; + font-weight: 500; + } + + ion-checkbox { + &.checkbox-checked { + --checkbox-background-checked: var(--ion-color-sangh); + --border-color-checked: var(--ion-color-sangh); + } + } +} + +.hi { + &::part(native) { + --background: var(--ion-color-sangh) !important; + } +} + +.add-sangh { + padding: 10px; + box-shadow: none; +} \ No newline at end of file diff --git a/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.ts b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.ts new file mode 100644 index 0000000..8ad7aa0 --- /dev/null +++ b/src/app/pages/sangh/sangh-term-policy/sangh-term-policy.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; + +@Component({ + selector: 'app-sangh-term-policy', + templateUrl: './sangh-term-policy.component.html', + styleUrls: ['./sangh-term-policy.component.scss'], + standalone: true, + imports: [IonicModule, FormsModule] +}) +export class SanghTermPolicyComponent { + + acceptTerm = false; + + constructor(private alert: AlertService, + private navCtrl: NavController + ) { } + + onNext(): void { + if (!this.acceptTerm) { + this.alert.showToasterError('Please accept terms & condition'); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghInformation); + } + +} diff --git a/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.html b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.html new file mode 100644 index 0000000..56c3468 --- /dev/null +++ b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.html @@ -0,0 +1,55 @@ + + + + + + {{title}} + + + + + + +

+

No data found

+

By following Sangh, you can know live updates on Sangh's events and broadcasts. + Please use Global search for the Sangh to follow.

+

Sangh has no followers. By following Sangh, you can know live updates on Sangh's + events and broadcasts. Click follow button now.

+

+ + + + + + +

{{ sangh?.name }}

{{ sangh?.address }}

+

+ + + + {{ + sangh?.is_user_following ? + 'Following' : 'Follow' }} +
+ + + Member + + + + + {{sangh.is_requested === true ? 'Requested' : 'Join'}} + + +
+
+ + + + + +
\ No newline at end of file diff --git a/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.scss b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.scss new file mode 100644 index 0000000..b45d498 --- /dev/null +++ b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.scss @@ -0,0 +1,207 @@ +app-view-all-sangh { + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + } + } + + ion-content { + ion-list { + padding: var(--ion-padding-10) 0; + border-bottom: 1px solid #efefef; + + ion-item { + margin: var(--ion-margin-0); + + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + + img { + background: #e2f0ff; + } + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-12) !important; + line-height: 16px !important; + } + } + + ion-button { + margin: var(--ion-margin-0); + min-height: 30px; + height: 30px; + + &.following { + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + } + } + } + } + } + } + + &.sangh { + ion-list { + ion-item { + ion-label { + ion-button { + &::part(native) { + --background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + border: 1px solid; + } + } + } + + ion-chip { + background: var(--ion-color-sangh); + padding: 5px; + height: auto; + margin: 0; + border-radius: 5px; + color: #fff; + + &.requested { + background: var(--ion-background-content-sangh); + color: var(--ion-color-sangh); + } + + &.member { + background: var(--ion-color-success); + } + + ion-label { + font-size: var(--ion-font-size-12) !important; + } + } + } + } + } + + h3 { + p { + color: var(--ion-color-sangh); + margin: var(--ion-margin-15); + } + } + } + + + .in-review { + ion-list { + background: none !important; + border-bottom: none; + + ion-item-sliding { + ion-item { + margin: var(--ion-margin-0); + padding: 10px 0px !important; + --min-height: auto; + transition: 0.2s ease-in-out; + overflow: visible; + background: #fff; + z-index: 2; + border-radius: 0px !important; + } + + ion-item-options { + top: 0; + transition: 0.2s ease-in-out; + display: flex; + height: 100%; + } + + &.item-sliding-active-options-end { + &.item-sliding-active-slide { + ion-item-options { + display: flex; + transition: 0.2s ease-in-out; + } + } + } + } + } + + .left-data { + display: flex; + align-items: center; + width: 100%; + padding: 0px 10px; + + .icons { + width: 40px; + height: 40px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + height: 50px; + + &.heart { + color: #f00; + } + } + + img { + height: 100%; + } + } + + .content { + width: calc(100% - 60px); + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + word-break: break-word; + } + } + } + + ion-item-options { + padding: 0 !important; + height: 80%; + border: 1px solid white !important; + } + } + + .delete-sangh { + color: #ef4a4a; + font-size: 22px; + } + +} \ No newline at end of file diff --git a/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.ts b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.ts new file mode 100644 index 0000000..547cf52 --- /dev/null +++ b/src/app/pages/sangh/view-all-sangh/view-all-sangh.page.ts @@ -0,0 +1,188 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { SanghData, UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-view-all-sangh', + templateUrl: './view-all-sangh.page.html', + styleUrls: ['./view-all-sangh.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, NgClass] +}) +export class ViewAllSanghPage implements OnInit { + sanghListType: string; + sanghList: Array = []; + title: string; + pageNumber = 1; + totalPage = 1; + apiRoute = ''; + spinnerFlag = false; + noDataFlag: boolean; + userData: UserData; + + constructor( + private activatedRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navController: NavController, + private stateManagementService: StateManagementService, + private utilityService: UtilityService + ) { } + + async ngOnInit() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + this.sanghListType = this.activatedRoute.snapshot.paramMap.get('sanghListType'); + if (this.sanghListType === '1') { + this.title = 'Following'; + this.apiRoute = api.followedSanghList; + } else if (this.sanghListType === '2') { + this.title = 'Member of sangh'; + this.apiRoute = api.sanghList; + } else if (this.sanghListType === '3') { + this.title = 'Suggestion'; + this.apiRoute = api.suggestedSanghList; + } else if (this.sanghListType === '4') { + this.title = 'Followers'; + this.apiRoute = api.followersOfSanghList.replace('{sangh_id}', String(this.activatedRoute.snapshot.paramMap.get('id'))); + } else if (this.sanghListType === '5') { + this.title = 'Sangh List'; + this.apiRoute = api.getUserSanghList; + } else if (this.sanghListType === '6') { + this.title = 'In Review Sangh'; + this.apiRoute = api.inReviewUserSanghList; + } + this.getSanghList(false, '', this.sanghListType); + } + + loadData($event) { + this.getSanghList(true, $event, this.sanghListType); + } + + getSanghList(isFirstLoad, event, type?: string) { + if (this.pageNumber <= this.totalPage) { + let params: any = { + page: this.pageNumber, + limit: 15 + }; + if (type === '5') { + params = { + ...params, + user_id: this.activatedRoute.snapshot.paramMap.get('id') ? String(this.activatedRoute.snapshot.paramMap.get('id')) : '', + }; + } + this.httpRequestService.post(this.apiRoute, params).then((res: any) => { + this.totalPage = res.data.last_page; + this.noDataFlag = true; + this.sanghList.push(...res.data.data); + this.spinnerFlag = true; + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + this.noDataFlag = false; + } + } + + async deleteSangh(id: number, index: number) { + const isYes = await this.utilityService.presentConfirm( + `Are you sure want to delete Sangh?`, + 'No', 'Yes' + ); + if (isYes) { + this.httpRequestService.delete(api.deleteSangh + id).then(() => { + this.alert.showToaster('Sangh deleted successfully'); + this.sanghList.splice(index, 1); + }); + } + } + + + sanghProfile(sanghId) { + if (this.sanghListType !== '4') { + this.navController.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', String(sanghId))); + } else if (this.sanghListType === '4') { + if (sanghId === this.userData.id) { + this.navController.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navController.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: sanghId }]); + } + } + } + + async followSangh(event, sanghData, index) { + if (sanghData.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + event.stopPropagation(); + await this.httpRequestService.post(api.followSangh, { + sangh_id: sanghData.id, + }); + this.sanghList[index].is_user_following = !this.sanghList[index].is_user_following; + if (this.sanghList[index].is_user_following === false) { + this.sanghList.splice(index, 1); + } + } + } else { + event.stopPropagation(); + const params = { + sangh_id: sanghData.id, + }; + this.httpRequestService.post(api.followSangh, params).then(() => { + this.sanghList[index].is_user_following = !this.sanghList[index].is_user_following; + if (this.sanghList[index].is_user_following === false) { + this.sanghList.splice(index, 1); + } + }); + } + } + + joinSangh(sangh: SanghData) { + if (sangh.is_requested === true) { + this.acceptDeclineSanghMember(sangh); + } else { + const params = { + sangh_id: sangh.id, + user_id: [this.userData.id], + is_join: 1, + }; + this.httpRequestService.post(api.addMemberForSangh, params).then((res: any) => { + sangh.is_requested = true; + this.alert.showToaster(res.message); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } + } + + async acceptDeclineSanghMember(sangh: SanghData) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about cancel this request?', + 'No', 'Yes', 'Cancel Request' + ); + if (isYes) { + const params = { + sangh_id: sangh.id, + user_id: this.userData.id, + status: 2, + }; + this.httpRequestService.post(api.acceptDeclineSanghRequest, params).then((res: any) => { + sangh.is_requested = false; + this.alert.showToaster(res.message); + }); + } + } + +} diff --git a/src/app/pages/sant/about-diksha/about-diksha.page.html b/src/app/pages/sant/about-diksha/about-diksha.page.html new file mode 100644 index 0000000..f649392 --- /dev/null +++ b/src/app/pages/sant/about-diksha/about-diksha.page.html @@ -0,0 +1,83 @@ + + + + + + {{santService.updateSant ? 'Edit Sant': 'Add Sant'}} + + + +
+ + + + + + + + + + + + +
+

More about diksha

+
+ +
+ + {{dikshaDate ? + (dikshaDate | date: 'dd-MM-yyyy') : 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + +
+ +
+ + + +
+ +
+ + +
+ + + + + + +

{{ guru.name }}

+
+
+
+
+
+ +
+
+ + Back + Next + \ No newline at end of file diff --git a/src/app/pages/sant/about-diksha/about-diksha.page.scss b/src/app/pages/sant/about-diksha/about-diksha.page.scss new file mode 100644 index 0000000..bc3bf8c --- /dev/null +++ b/src/app/pages/sant/about-diksha/about-diksha.page.scss @@ -0,0 +1,111 @@ +app-about-diksha { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-header { + background: var(--ion-background-content); + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 22.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #FF6331; + } + } + } + + ion-item::part(detail-icon) { + display: none; + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color-sant); + border-radius: 0.25rem; + height: 2.813rem; + background: transparent; + } + + ion-input[type=date], + ion-input { + padding: var(--ion-padding-0) !important + } + + &.sant { + .top-line { + ion-chip { + background: var(--ion-background-content-sant); + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + h2 { + color: var(--ion-color-sant); + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + padding-bottom: env(safe-area-inset-bottom); + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } + + .search-data { + position: inherit !important; + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --height: 382px; + --border-radius: 8px; + } + + ion-datetime { + height: 382px; + } +} \ No newline at end of file diff --git a/src/app/pages/sant/about-diksha/about-diksha.page.ts b/src/app/pages/sant/about-diksha/about-diksha.page.ts new file mode 100644 index 0000000..eff2214 --- /dev/null +++ b/src/app/pages/sant/about-diksha/about-diksha.page.ts @@ -0,0 +1,117 @@ +import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { DikshaInformationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; + +@Component({ + selector: 'app-about-diksha', + templateUrl: './about-diksha.page.html', + styleUrls: ['./about-diksha.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, GjDatetimeDirective, NgIf, NgFor, DatePipe] +}) +export class AboutDikshaPage implements OnInit { + @ViewChild('personalLocation') personalLocation: ElementRef; + dikshaInformationForm: FormGroup; + santList = []; + currentDate = this.formatDate((new Date()).toISOString()); + dikshaDate = ''; + minDate: any; + prevValue: string; + + constructor( + private navCtrl: NavController, + private httpRequestService: HttpRequestService, + public santService: SantInfoService, + private alert: AlertService, + public utilityService: UtilityService + ) { + if (this.santService.santInfoForm.controls.birth_date.value) { + this.minDate = this.santService.santInfoForm.controls.birth_date.value; + } + } + + ngOnInit() { + this.dikshaInformationForm = this.santService.dikshaInfoForm; + if (this.dikshaInformationForm) { + this.dikshaDate = this.dikshaInformationForm.controls.diksha_date.value; + } + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + moveToNext(form) { + if (form.value.diksha_date) { + this.dikshaInformationForm.controls.diksha_date.setValue(this.formatDate(form.value.diksha_date)); + } + if (this.dikshaInformationForm.controls.guru.value && !this.dikshaInformationForm.controls.guru_id.value) { + this.alert.showToaster('Please select guru from existing sant list.'); + return; + } + if (!form.valid) { + this.dikshaInformationForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.aboutSansarikJeevan); + } + moveToBack() { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.santInfo); + } + + getSantList(event) { + if (!event.value.trim()) { + return this.santList = []; + } + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue, true); + this.prevValue = event.value; + if (!isSameStr) { + const params = { + name: event.value.trim(), + page: 1, + limit: 10, + dharma_id: this.santService.santInfoForm.controls.dharma_id.value, + sampraday_id: this.santService.santInfoForm.controls.sampraday_id.value.id, + sant_id: this.santService.updateSantId + }; + this.httpRequestService.get(api.santList, params).then((res: any) => { + if (event.value) { + this.santList = res.data.data; + if (res.data.data.length === 0) { + this.dikshaInformationForm.controls.guru_id.setValue(''); + } + } + }); + } + } + + addSant(sant) { + this.dikshaInformationForm.controls.guru.setValue(sant.name); + this.dikshaInformationForm.controls.guru_id.setValue(sant.id); + this.santList = []; + } + + initAutocomplete(): void { + this.utilityService.createAutocomplete(this.personalLocation.nativeElement).subscribe((details) => { + this.dikshaInformationForm.controls.diksha_place.setValue(this.personalLocation.nativeElement.value); + this.dikshaInformationForm.controls.diksha_place_latitude.setValue(details.geometry.location.lat()); + this.dikshaInformationForm.controls.diksha_place_longitude.setValue(details.geometry.location.lng()); + }); + } + + removeLatAndLong() { + this.dikshaInformationForm.controls.diksha_place_latitude.reset(); + this.dikshaInformationForm.controls.diksha_place_longitude.reset(); + } + +} diff --git a/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.html b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.html new file mode 100644 index 0000000..51899b0 --- /dev/null +++ b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.html @@ -0,0 +1,76 @@ + + + + + + {{santService.updateSant ? 'Edit Sant': 'Add Sant'}} + + + +
+ + + + + + + + + + + + +
+

Little about sansarik jeevan

+
+ + + + + + + +
+
+ + Back + Next + \ No newline at end of file diff --git a/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.scss b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.scss new file mode 100644 index 0000000..4b7d99d --- /dev/null +++ b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.scss @@ -0,0 +1,87 @@ +app-about-sansarik-jeevan { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-header { + background: var(--ion-background-content); + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 22.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #FF6331; + } + } + } + + ion-item { + ion-label { + margin-top: var(--ion-margin-10); + } + } + + &.sant { + .top-line { + ion-chip { + background: var(--ion-background-content-sant); + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + h2 { + color: var(--ion-color-sant); + } + } + + + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + padding-bottom: env(safe-area-inset-bottom); + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } + + .search-data { + width: calc(100% - 32px) !important; + top: auto !important; + } +} \ No newline at end of file diff --git a/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.ts b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.ts new file mode 100644 index 0000000..e20bdcd --- /dev/null +++ b/src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.ts @@ -0,0 +1,109 @@ +import { NgFor } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { SansarikJeevanInformationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-about-sansarik-jeevan', + templateUrl: './about-sansarik-jeevan.page.html', + styleUrls: ['./about-sansarik-jeevan.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgFor] +}) +export class AboutSansarikJeevanPage implements OnInit { + sansarikJeevanInformationForm: FormGroup; + fatherList = []; + motherList = []; + fatherPrevValue: string; + motherPrevValue: string; + + constructor( + private navCtrl: NavController, + private httpRequestService: HttpRequestService, + public santService: SantInfoService, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.sansarikJeevanInformationForm = this.santService.sansarikJeevanInfoForm; + } + + moveToNext(form) { + if (!form.valid) { + this.sansarikJeevanInformationForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santProfileImage); + } + + getFatherList(event) { + this.motherList = []; + if (!event.value.trim()) { + this.sansarikJeevanInformationForm.controls.father_name.setValue(null); + this.sansarikJeevanInformationForm.controls.father_id.setValue(null); + this.sansarikJeevanInformationForm.controls.father_type.setValue(null); + return this.fatherList = []; + } + const params = { + name: event.value.trim() + }; + + const isSameStr = this.utilityService.isSameStr(event.value, this.fatherPrevValue, true); + this.fatherPrevValue = event.value.trim(); + if (!isSameStr) { + this.httpRequestService.get(api.fatherList, params).then((res: any) => { + if (event.value) { + this.fatherList = res.data; + } + }); + } + + } + + addFather(father) { + this.sansarikJeevanInformationForm.controls.father_name.setValue(father.name); + this.sansarikJeevanInformationForm.controls.father_id.setValue(father.id); + this.sansarikJeevanInformationForm.controls.father_type.setValue(father.type); + this.fatherList = []; + } + + getMotherList(event) { + this.fatherList = []; + if (!event.value.trim()) { + this.sansarikJeevanInformationForm.controls.mother_name.setValue(null); + this.sansarikJeevanInformationForm.controls.mother_id.setValue(null); + this.sansarikJeevanInformationForm.controls.mother_type.setValue(null); + return this.motherList = []; + } + const params = { + name: event.value.trim() + }; + const isSameStr = this.utilityService.isSameStr(event.value, this.motherPrevValue, true); + this.motherPrevValue = event.value.trim(); + if (!isSameStr) { + this.httpRequestService.get(api.motherList, params).then((res: any) => { + if (event.value) { + this.motherList = res.data; + } + }); + } + } + + addMother(mother) { + this.sansarikJeevanInformationForm.controls.mother_name.setValue(mother.name); + this.sansarikJeevanInformationForm.controls.mother_id.setValue(mother.id); + this.sansarikJeevanInformationForm.controls.mother_type.setValue(mother.type); + this.motherList = []; + } + + moveToBack() { + this.navCtrl.navigateBack('/' + Roots.page + '/' + Roots.aboutDiksha); + } + +} diff --git a/src/app/pages/sant/add-chaturmas/add-chaturmas.page.html b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.html new file mode 100644 index 0000000..d091be8 --- /dev/null +++ b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.html @@ -0,0 +1,87 @@ + + + + + + {{ title }} Chaturmas + + + +
+

Chaturmas details

+

Only one chaturmas entry allowed per year. Please ensure its accurate

+ + + + By Location + + + By Sangh + + + +
+
+ Place* + +
+ + Chaturmas place is required. + +
+
+ + + +
+ + + {{y.year}} + +
+ + Chaturmas year is required. + +
+
+ +
+
+

+ + + +

+
+ + Submit + \ No newline at end of file diff --git a/src/app/pages/sant/add-chaturmas/add-chaturmas.page.scss b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.scss new file mode 100644 index 0000000..da2af4c --- /dev/null +++ b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.scss @@ -0,0 +1,178 @@ +app-add-chaturmas { + background: var(--ion-background-content); + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 48%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + h3 { + color: var(--ion-color-sant); + padding: var(--ion-padding-10) var(--ion-padding-15); + margin: var(--ion-margin-0); + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0; + color: var(--ion-content-color); + + &.agreed-content { + display: flex; + + label { + padding-left: var(--ion-padding-10); + } + + ion-checkbox { + &.checkbox-checked { + --checkbox-background-checked: var(--ion-color-sant); + --border-color-checked: var(--ion-color-sant); + } + } + } + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color-sant); + border-radius: 0.25rem; + background: transparent; + height: 40px; + padding-left: var(--ion-padding-10); + } + + ion-select { + margin: var(--ion-margin-0); + } + + + ion-list { + padding: var(--ion-padding-0) !important; + margin-bottom: var(--ion-margin-15) !important; + + background: transparent !important; + + ion-radio-group { + display: flex; + + ion-item { + margin: var(--ion-margin-0); + --min-height: inherit; + + ion-label { + margin: var(--ion-margin-0); + } + + ion-radio { + margin-right: var(--ion-margin-10); + --color-checked: var(--ion-color-sant) !important; + + &::part(container) { + --border-width: 1px; + border-color: var(--ion-color-sant); + } + + &.radio-checked { + --color-checked: var(--ion-color-sant) !important; + } + } + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + .back-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } +} + +ion-alert { + &.chaturmas-report { + .alert-wrapper { + .alert-button-group { + button { + color: var(--ion-color-sant); + } + } + + .alert-input-group { + padding: var(--ion-padding-0) var(--ion-padding-15); + } + } + } + + &.chaturmas-approval { + --max-width: 300px; + + .alert-wrapper { + .alert-head { + padding: var(--ion-padding-0) !important; + } + + .alert-message { + padding: var(--ion-padding-10) !important; + text-align: center; + + span { + display: block; + border-top: 1px solid #4f9c81; + padding-top: 10px; + margin-top: 10px; + } + } + + .alert-button-group { + padding: var(--ion-padding-0); + justify-content: center; + + button { + background: var(--ion-color-sant); + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0); + color: #fff; + width: 30%; + + span { + justify-content: center; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/add-chaturmas/add-chaturmas.page.ts b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.ts new file mode 100644 index 0000000..76083c0 --- /dev/null +++ b/src/app/pages/sant/add-chaturmas/add-chaturmas.page.ts @@ -0,0 +1,301 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { IonicSelectableItemTemplateDirective } from '@components/ionic-selectable/ionic-selectable-item-template.directive'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IdName, SanghData } from '@interfaces/common'; +import { ChaturmasInfoForm } from '@interfaces/form'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-add-chaturmas', + templateUrl: './add-chaturmas.page.html', + styleUrls: ['./add-chaturmas.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, IonicSelectableComponent, NgFor, IonicSelectableItemTemplateDirective] +}) +export class AddChaturmasPage implements OnInit { + @ViewChild('Location') Location: ElementRef; + @ViewChild('sanghListComponent') sanghListComponent: IonicSelectableComponent; + chaturmasInfoForm: FormGroup; + chaturmasYearList = []; + sanghList: Array = []; + santId: string; + sanghId: string; + chaturmasId: string; + dharmaId: string; + sampradayId: string; + sanghName: string; + thanaMemberCount: string; + chaturmasPlace = ''; + chaturmasYear = ''; + isUpdate = false; + title = ''; + chaturmasWithLocation = false; + chaturmasWith = 'sangh'; + pageNumber = 1; + totalPage = 1; + thanaList: any[] = []; + confirmationFlag = false; + message = `Thank you for submitting Chatumas details. + GlobalJain admin will verify and confirm within 48 hours. + Once approved, you will be awarded Karmā points`; + latitude: string; + longitude: string; + selectedSangh: IdName = null; + sanghPageNumber = 1; + sanghTotalPages = 1; + sanghSearchText = ''; + prevValue: string; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private router: Router, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + public alertController: AlertController, + private utilityService: UtilityService + ) { } + + async ngOnInit() { + const state = this.router.getCurrentNavigation().extras?.state; + if (state) { + this.santId = state.santId; + this.dharmaId = state.dharmaId; + this.sampradayId = state.sampradayId; + this.chaturmasId = state.chaturmasId; + this.chaturmasPlace = state.chaturmasPlace; + this.chaturmasYear = state.chaturmasYear; + this.isUpdate = state.isUpdate; + this.sanghId = state.sanghId; + this.sanghName = state.sanghName; + this.thanaMemberCount = state.thanaMemberCount; + this.setSanghField(); + } + this.title = this.isUpdate ? 'Update' : 'Add'; + if (this.stateManagementService.chaturmasYear.length > 0) { + this.chaturmasYearList = this.stateManagementService.chaturmasYear; + } else { + this.getChaturmasYear(); + } + this.chaturmasInfoForm = new FormGroup({ + chaturmasPlace: new FormControl(this.chaturmasPlace), + sanghId: new FormControl(this.sanghId), + sanghName: new FormControl(this.sanghName), + chaturmasYear: new FormControl(this.chaturmasYear, Validators.required) + }); + this.setValidation(this.chaturmasWithLocation); + this.getThanaList(false, ''); + } + + setSanghField() { + if (this.sanghId) { + this.selectedSangh = { + id: +this.sanghId, + name: this.sanghName, + }; + this.chaturmasInfoForm.controls.sanghName.setValue(this.sanghName); + this.chaturmasInfoForm.controls.sanghId.setValue(this.sanghId); + } + } + + onRadioChange(event) { + this.chaturmasWithLocation = (event?.detail?.value === 'location') ? true : false; + this.setValidation(this.chaturmasWithLocation); + } + + setValidation(chaturmasWithLocation) { + this.chaturmasInfoForm.controls.chaturmasPlace.setValidators(!chaturmasWithLocation ? null : [Validators.required]); + this.chaturmasInfoForm.controls.sanghId.setValidators(chaturmasWithLocation ? null : [Validators.required]); + this.chaturmasInfoForm.controls.sanghName.setValidators(chaturmasWithLocation ? null : [Validators.required]); + this.chaturmasInfoForm.controls.chaturmasPlace.updateValueAndValidity(); + this.chaturmasInfoForm.controls.sanghId.updateValueAndValidity(); + this.chaturmasInfoForm.controls.sanghName.updateValueAndValidity(); + } + + getChaturmasYear() { + this.httpRequestService.get(api.chaturmasYear).then((res: any) => { + this.chaturmasYearList = res.data; + this.stateManagementService.chaturmasYear = res.data; + }); + } + + searchSangh(event: { component: IonicSelectableComponent; text: string }) { + const isSameStr = this.utilityService.isSameStr(event.text, this.prevValue); + this.prevValue = event.text; + if (!isSameStr) { + this.sanghPageNumber = 1; + this.sanghList = []; + this.sanghSearchText = event.text; + event.component.showLoading(); + this.getSanghList().then(() => { + event.component.hideLoading(); + }); + } + } + + getSanghList() { + return this.httpRequestService.get(api.sanghSearchList, { + name: this.sanghSearchText, + page: this.sanghPageNumber, + limit: 15 + }).then((res: any) => { + this.sanghList.push(...res.data.data); + this.sanghTotalPages = res.data.last_page; + }); + } + + addSangh(sangh) { + this.sanghName = sangh.value.name; + this.sanghId = sangh.value.id; + this.setSanghField(); + this.sanghList = []; + this.sanghListComponent.searchText = ''; + this.sanghSearchText = ''; + this.sanghPageNumber = 1; + this.getSanghList(); + + } + + submitChaturmas() { + if (!this.isUpdate) { + this.addChaturmas(); + } else { + this.updateChaturmas(); + } + } + + addChaturmas() { + this.presentAlertPrompt('add'); + } + + updateChaturmas() { + this.presentAlertPrompt('update'); + } + + initAutocompletePlace(): void { + this.utilityService.createAutocomplete(this.Location.nativeElement).subscribe((details) => { + this.chaturmasInfoForm.controls.chaturmasPlace.setValue(this.Location.nativeElement.value); + this.latitude = details.geometry.location.lat(); + this.longitude = details.geometry.location.lng(); + }); + } + + removeLatAndLong() { + this.latitude = ''; + this.longitude = ''; + } + + moveToChaturmas() { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.chaturmasInfo.replace(':santId', this.santId)); + } + + async ionViewWillEnter() { + await this.getSanghList(); + } + + ionViewWillLeave() { + this.chaturmasInfoForm.reset(); + } + + getThanaList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.santThanaList, { + sant_id: Number(this.santId), + page: this.pageNumber + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.thanaList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + async presentAlert() { + const message = +this.thanaMemberCount > 0 ? + `Thank you for submitting chaturmas details. + GlobalJain admin will verify and confirm within 48 hours. + Once approved, you will be awarded karmā points. + Chaturmas will be applicable to all Thana(s)` : + `Thank you for submitting chaturmas details. + GlobalJain admin will verify and confirm within 48 hours. + Once approved, you will be awarded karmā points`; + const alert = await this.alertController.create({ + cssClass: 'chaturmas-approval', + backdropDismiss: false, + message, + buttons: [{ + text: 'Ok', + handler: () => { + this.moveToChaturmas(); + } + }] + }); + await alert.present(); + } + + async presentAlertPrompt(type: string) { + if (this.chaturmasInfoForm.invalid || !this.confirmationFlag) { + this.chaturmasInfoForm.markAllAsTouched(); + return; + } + const isYes = await this.utilityService.presentConfirm( + 'Are you sure that all information is correct? ' + + 'Chaturmas will be applicable to all Thana\'s.' + ); + if (isYes) { + if (type === 'add') { + this.httpRequestService.post(api.addChaturmas, { + sant_id: Number(this.santId), + year: this.chaturmasInfoForm.value.chaturmasYear, + ...this.chaturmasWithLocation && { + place: this.chaturmasInfoForm.value.chaturmasPlace, + latitude: this.latitude, + longitude: this.longitude, + }, + ...!this.chaturmasWithLocation && { sangh_id: this.chaturmasInfoForm.value.sanghId }, + }) + .then(() => { + this.presentAlert(); + }).catch((err) => { + this.alert.showToasterError(err.error.error); + }); + } else if (type === 'update') { + this.httpRequestService.post(api.addChaturmas + '/' + this.chaturmasId, { + year: this.chaturmasInfoForm.value.chaturmasYear, + ...this.chaturmasWithLocation && { + place: this.chaturmasInfoForm.value.chaturmasPlace, + latitude: this.latitude, + longitude: this.longitude, + }, + ...!this.chaturmasWithLocation && { sangh_id: this.chaturmasInfoForm.value.sanghId }, + }) + .then(() => { + this.presentAlert(); + }); + } + } + } + + getMoreSangh(event: { component: IonicSelectableComponent; text: string }) { + if (this.sanghPageNumber >= this.sanghTotalPages) { + event.component.disableInfiniteScroll(); + return; + } + this.sanghPageNumber++; + this.getSanghList().then(() => { + event.component.endInfiniteScroll(); + }); + } + +} diff --git a/src/app/pages/sant/add-thana/add-thana.page.html b/src/app/pages/sant/add-thana/add-thana.page.html new file mode 100644 index 0000000..1bb4cb7 --- /dev/null +++ b/src/app/pages/sant/add-thana/add-thana.page.html @@ -0,0 +1,45 @@ + + + + + + Add thana + + + +
    +
  1. M.S of same Dharm and Sampraday
  2. +
  3. M.S not added to other Thana
  4. +
+ + + + + + + + + + +

{{ sant?.name }}

Dharm: {{ sant?.dharm?.name }}

+

Sampraday: {{ sant?.sampraday?.name }}

+

+ Add + Remove +
+
+
+
+ + + + +

+

No M.S found to add

+

+
+ + Add + Thana + diff --git a/src/app/pages/sant/add-thana/add-thana.page.scss b/src/app/pages/sant/add-thana/add-thana.page.scss new file mode 100644 index 0000000..a5784fa --- /dev/null +++ b/src/app/pages/sant/add-thana/add-thana.page.scss @@ -0,0 +1,132 @@ +app-add-thana { + ion-header { + background: var(--ion-background-content); + } + + ion-content { + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-0) var(--ion-padding-15); + --min-height: inherit; + overflow: visible; + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-label { + margin-bottom: var(--ion-margin-0); + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + + &:last-child { + padding-top: 0; + } + + .search-data { + top: 32px; + + ion-list { + ion-item { + padding: 5px var(--ion-padding-15); + } + } + } + } + } + + ion-card { + margin: var(--ion-margin-15); + + ion-list { + padding: var(--ion-padding-0) !important; + + ion-item { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-avatar { + width: 50px; + height: 50px; + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + + img { + background: #e2f0ff; + } + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-14) !important; + line-height: 13px !important; + } + } + + ion-icon { + font-size: 18px; + } + + ion-button { + height: 30px; + + &::part(native) { + --background: var(--ion-color-sant); + } + } + } + } + } + } + } + + ion-footer { + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/add-thana/add-thana.page.ts b/src/app/pages/sant/add-thana/add-thana.page.ts new file mode 100644 index 0000000..7ad4773 --- /dev/null +++ b/src/app/pages/sant/add-thana/add-thana.page.ts @@ -0,0 +1,111 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-add-thana', + templateUrl: './add-thana.page.html', + styleUrls: ['./add-thana.page.scss'], + standalone: true, + imports: [IonicModule, NgFor, NgIf] +}) +export class AddThanaPage implements OnInit { + santList = []; + pageNumber = 1; + totalPage = 1; + searchValue: string; + prevValue: string; + santId = '1'; + santIdArray = []; + totalCount: number; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private router: Router, + private navCtrl: NavController, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.santId = this.router.getCurrentNavigation().extras.state?.santId; + this.getSantList(false, ''); + } + + addSant(index) { + this.santIdArray.push(this.santList[index].id); + this.santList[index].isAdded = !this.santList[index].isAdded; + } + + removeSant(index) { + const i = this.santIdArray.indexOf(this.santList[index].id); + if (i > -1) { + this.santIdArray.splice(i, 1); + } + this.santList[index].isAdded = !this.santList[index].isAdded; + } + + searchSant($event) { + this.searchValue = $event.detail.value; + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.santList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getSantList(false, ''); + } + } + + loadData($event) { + this.getSantList(true, $event); + } + + getSantList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + const params = { + page: this.pageNumber, + limit: 15, + sant_id: this.santId, + name: this.searchValue?.trim(), + }; + this.httpRequestService.post(api.thanaSantList, params).then((res: any) => { + this.totalPage = res.data.last_page; + this.totalCount = res.data.total; + this.santList.push(...res.data.data.map(d => { + d.isAdded = !this.santIdArray.includes(d.id); + return d; + })); + if (isFirstLoad) { + event.target.complete(); + } + this.pageNumber++; + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } else { + event.target.complete(); + } + } + + addThana() { + const formData = new FormData(); + formData.append('sant_id', this.santId); + for (const [index, santId] of this.santIdArray.entries()) { + formData.append(`thana_sant_id[${index}]`, santId); + } + this.httpRequestService.post(api.addThana, formData).then((res: any) => { + this.alert.showToaster(res.message); + this.navCtrl.navigateBack(Roots.page + '/' + Roots.thanaList.replace(':santId', this.santId)); + }).catch((err) => { + this.alert.showToasterError(err.error); + }); + } + +} diff --git a/src/app/pages/sant/chaturmas-info/chaturmas-info.page.html b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.html new file mode 100644 index 0000000..5bd2b7a --- /dev/null +++ b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.html @@ -0,0 +1,62 @@ + + + + + + Chaturmas information + + + +
+

+ +

No Chaturmas details found. If you know, please add and admin will verify.

+

+ + + + +
+
{{chaturmas.chaturmas_info.year}}
+

In Review

+
+
+ + +
+
{{ chaturmas.place }}
+

{{ chaturmas.place }}

+
+
+ + +
+
{{ chaturmas?.sangh?.name }}
+

{{ chaturmas?.sangh?.address }}

+
+
+
+ +
+

Added by: {{ chaturmas?.created_by ? chaturmas?.created_by?.name : 'Global Jain Member' }}

+

{{ chaturmas?.created_ago}}

+
+
+

Edit by: {{ chaturmas?.updated_by?.name }}

+

{{ chaturmas?.updated_ago}}

+
+
+

Chaturmas incorrect ? Please write to us Here

+

(Approved)

+
+ + + + +
+ + + + + +
\ No newline at end of file diff --git a/src/app/pages/sant/chaturmas-info/chaturmas-info.page.scss b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.scss new file mode 100644 index 0000000..0076cd2 --- /dev/null +++ b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.scss @@ -0,0 +1,176 @@ +app-chaturmas-info { + background: var(--ion-background-content); + + ion-content { + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0; + color: var(--ion-content-color); + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + + ion-card-header { + padding: var(--ion-padding-10); + + ion-card-title { + margin-bottom: var(--ion-margin-10); + display: flex; + + h5 { + margin: var(--ion-margin-0) var(--ion-margin-0) 5px var(--ion-margin-0); + } + + p { + padding: var(--ion-padding-0); + font-size: var(--ion-font-size-12); + font-weight: 500; + margin-bottom: 5px; + } + + ion-icon { + width: 17px; + height: 23px; + padding: 3px 6px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sant); + margin-right: var(--ion-margin-10); + } + + div { + width: calc(100% - 27px); + } + + &:first-child { + align-items: center; + + h5 { + margin: var(--ion-margin-0); + } + + div { + display: flex; + align-items: center; + justify-content: space-between; + + ion-icon { + margin: var(--ion-margin-0); + } + + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: none; + padding: var(--ion-padding-0); + } + } + } + } + + &:last-child { + margin: var(--ion-margin-0); + } + + img { + width: 29px; + height: 29px; + padding: 3px 6px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sant); + margin-right: var(--ion-margin-10); + object-fit: none; + } + } + } + + ion-card-content { + border-top: 1px solid #efefef; + padding: var(--ion-padding-10); + + div { + display: flex; + justify-content: space-between; + } + + p { + padding: var(--ion-padding-0); + font-size: var(--ion-font-size-14); + + span { + color: var(--ion-color-sant); + } + } + + .contact-icon { + ion-icon { + margin-left: 10px; + } + } + } + + p { + padding: 0 var(--ion-padding-10); + font-size: 12px; + + span { + color: var(--ion-color-sant); + } + + &.in-review { + text-align: right; + color: #FF6331; + background: #FFEFEB; + padding: 5px 10px; + border-radius: 4px; + } + } + } + + h3 { + p { + color: var(--ion-color-sant); + margin-top: var(--ion-margin-10); + } + } + } + + ion-fab { + width: 46px; + height: 46px; + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10) 0; + + ion-fab-button { + width: 100%; + height: 100%; + + &::part(native) { + --background: var(--ion-color-sant); + } + } + } + } +} + +ion-alert { + &.chaturmas-report { + .alert-wrapper { + .alert-button-group { + button { + color: var(--ion-color-sant); + } + } + + .alert-input-group { + padding: var(--ion-padding-0) var(--ion-padding-15); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/chaturmas-info/chaturmas-info.page.ts b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.ts new file mode 100644 index 0000000..6360e99 --- /dev/null +++ b/src/app/pages/sant/chaturmas-info/chaturmas-info.page.ts @@ -0,0 +1,139 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; + +import { NgFor, NgIf } from '@angular/common'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-chaturmas-info', + templateUrl: './chaturmas-info.page.html', + styleUrls: ['./chaturmas-info.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor] +}) +export class ChaturmasInfoPage implements OnInit { + + santId = '1'; + chaturmasList = []; + pageNumber = 1; + totalPage = 1; + noDataFlag: boolean; + dharmaId: string; + sampradayId: string; + thanaMemberCount: string; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private activatedRoute: ActivatedRoute, + private alertController: AlertController, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private router: Router, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.dharmaId = this.router.getCurrentNavigation().extras.state?.dharmaId; + this.sampradayId = this.router.getCurrentNavigation().extras.state?.sampradayId; + this.thanaMemberCount = this.router.getCurrentNavigation().extras.state?.thanaMemberCount; + this.santId = this.activatedRoute.snapshot.paramMap.get('santId'); + this.getChaturmasYear(); + } + + ionViewWillEnter() { + this.pageNumber = 1; + this.totalPage = 1; + this.chaturmasList = []; + this.getChaturmasList(false, ''); + } + + loadData($event) { + this.getChaturmasList(true, $event); + } + + getChaturmasYear() { + this.httpRequestService.get(api.chaturmasYear).then((res: any) => { + this.stateManagementService.chaturmasYear = res.data; + }); + } + + addChaturmas() { + const navOption = { + state: { + santId: this.santId, + isUpdate: false, + dharmaId: this.dharmaId, + sampradayId: this.sampradayId, + thanaMemberCount: this.thanaMemberCount + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.addChaturmas, navOption); + } + + getChaturmasList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get(api.chaturmasList, { + sant_id: this.santId, + page: this.pageNumber + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.noDataFlag = true; + this.chaturmasList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + async chaturmasReport(id: any) { + const alert = await this.alertController.create({ + cssClass: 'chaturmas-report', + header: 'Add Change Request', + message: 'If you feel that Chaturmas is incorrect then please write to us so we can review and update it!', + inputs: [ + { + name: 'chaturmas', + type: 'text', + placeholder: 'Chaturmas detail' + }, + ], + buttons: [ + { + text: 'Submit', + handler: (data) => { + const params = { + comment: data.chaturmas, + sant_id: this.santId + }; + this.httpRequestService.post(api.reviewRequestChaturmas.replace('{chaturmas_id}', id), params) + .then((res: any) => { + this.alert.showToaster(res.message); + }); + } + }, { + text: 'Cancel', + role: 'cancel', + cssClass: 'secondary', + } + ] + }); + await alert.present(); + } + + address(chaturmas) { + this.utilityService.openGoogleMap(chaturmas.latitude, chaturmas.longitude); + } + + goToSanghProfile(sanghId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.sanghProfile.replace(':sanghId', sanghId)); + } +} diff --git a/src/app/pages/sant/create-new-sant/create-new-sant.page.html b/src/app/pages/sant/create-new-sant/create-new-sant.page.html new file mode 100644 index 0000000..d149aa9 --- /dev/null +++ b/src/app/pages/sant/create-new-sant/create-new-sant.page.html @@ -0,0 +1,71 @@ + + + Sant + + + + + +
+
Sant created by you View all
+
+
+ + + +

{{ sant?.name }}

+
+
+
+
Following View all
+ + + + + + +

{{ sant?.name }} +

+ View +
+
+
+
Suggestion View all
+ + + + + + +

{{ sant?.name }} +

+ {{ sant?.is_user_following ? 'Following' + : + 'Follow' }} +
+
+
+
+ + + + \ No newline at end of file diff --git a/src/app/pages/sant/create-new-sant/create-new-sant.page.scss b/src/app/pages/sant/create-new-sant/create-new-sant.page.scss new file mode 100644 index 0000000..8b6641f --- /dev/null +++ b/src/app/pages/sant/create-new-sant/create-new-sant.page.scss @@ -0,0 +1,187 @@ +app-create-new-sant { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-content { + --background: var(--ion-background-content); + + .header-search { + padding: var(--ion-padding-10) var(--ion-padding-10) var(--ion-padding-0) var(--ion-padding-10); + background: var(--ion-color-white); + flex-wrap: wrap; + justify-content: space-between; + display: flex; + border-bottom: 1px solid #efefef; + + ion-icon { + background: var(--ion-color-white); + color: var(--ion-color); + height: 18px; + width: 20px; + padding: 5px; + margin-left: var(--ion-margin-0); + border-radius: 50px; + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0); + height: 30px; + flex: 0 0 48.5%; + + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + box-shadow: none; + border-radius: 5px; + } + } + } + + h5 { + color: var(--ion-color-sant); + font-weight: 600; + display: flex; + justify-content: space-between; + padding: var(--ion-padding-0) var(--ion-padding-15); + + span { + color: #000; + font-size: var(--ion-font-size-12); + } + } + + .following { + background: var(--ion-color-white); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + .sant-profile { + h3 { + color: var(--ion-color-sant); + margin: var(--ion-margin-0); + text-transform: uppercase; + } + + div { + display: flex; + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0); + align-items: center; + + ion-avatar { + width: 50px; + height: 50px; + text-align: center; + margin-right: var(--ion-margin-10); + background: var(--ion-background-content); + } + + h3 { + width: calc(100% - 60px); + text-transform: none; + color: #000; + font-size: var(--ion-font-size-14); + } + } + } + + h5 { + color: var(--ion-color-sant); + font-weight: 600; + display: flex; + justify-content: space-between; + margin-top: var(--ion-margin-0); + padding: var(--ion-padding-0); + + span { + color: #000; + font-size: var(--ion-font-size-12); + } + } + } + + ion-list { + background: none !important; + padding: var(--ion-padding-0) var(--ion-padding-15) !important; + + ion-item { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0); + padding: var(--ion-padding-10); + background: var(--ion-color-white); + border-radius: 8px; + box-shadow: 2px 2px 7px #ebebeb; + + ion-avatar { + width: 50px; + height: 50px; + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + background: var(--ion-background-content); + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal !important; + + p { + font-weight: 400; + color: #999; + line-height: 16px !important; + } + } + + ion-button { + margin: var(--ion-margin-0); + min-height: 30px; + height: 30px; + + &::part(native) { + --background: var(--ion-color-sant); + } + + &.view { + &::part(native) { + --background: var(--ion-background-content-sant); + color: var(--ion-color-sant); + border: 1px solid; + } + } + } + } + } + } + + &.sant { + .header-search { + ion-button { + &::part(native) { + color: var(--ion-color-sant); + --background: var(--ion-background-content-sant); + border: 1px solid; + } + } + } + + .following { + h5 { + color: var(--ion-color-sant); + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/create-new-sant/create-new-sant.page.ts b/src/app/pages/sant/create-new-sant/create-new-sant.page.ts new file mode 100644 index 0000000..3950421 --- /dev/null +++ b/src/app/pages/sant/create-new-sant/create-new-sant.page.ts @@ -0,0 +1,143 @@ +import { NgFor, NgIf } from '@angular/common'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { FooterComponent } from '@components/footer/footer.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-create-new-sant', + templateUrl: './create-new-sant.page.html', + styleUrls: ['./create-new-sant.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, AvatarPercentageComponent, FooterComponent] +}) +export class CreateNewSantPage implements OnInit, OnDestroy { + suggestionSantList = []; + createdSantList = []; + followingSantList = []; + addSantFlag: boolean; + santListTotalCount: number; + suggestedSantListTotalCount: number; + followingSantListTotalCount: number; + $subscription: Subscription; + hasNewReview = 0; + + constructor( + private navController: NavController, + private httpRequestService: HttpRequestService, + private santService: SantInfoService, + private stateManagementService: StateManagementService, + private utilityService: UtilityService, + private change: ChangeDetectorRef + ) { } + + ngOnInit() { + this.$subscription = this.stateManagementService.pushNotyObservable.subscribe(res => { + this.hasNewReview = res.pending_sant_action; + this.change.detectChanges(); + }); + } + + ionViewWillEnter() { + this.getCreatedSantList(); + this.getFollowingSantList(); + this.getSuggestionSantList(); + this.santService.updateSant = false; + this.santService.reviewed_fields = null; + this.santService.santInformationForm.reset(); + } + + getFollowingSantList() { + const params = { + page: 1, + limit: 3 + }; + this.httpRequestService.post(api.followingSant, params).then((res: any) => { + this.followingSantList = res.data.data; + this.followingSantListTotalCount = res.data.total; + }); + } + + getCreatedSantList() { + const params = { + page: 1, + limit: 3 + }; + this.httpRequestService.post(api.createdByMeSant, params).then((res: any) => { + this.createdSantList = res.data.data; + this.santListTotalCount = res.data.total; + this.addSantFlag = true; + }); + } + + getSuggestionSantList() { + const params = { + page: 1, + limit: 5 + }; + this.httpRequestService.post(api.suggestionSant, params).then((res: any) => { + this.suggestionSantList = res.data.data; + this.suggestedSantListTotalCount = res.data.total; + }); + } + + santProfile(santId) { + this.navController.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } + + addSant() { + this.navController.navigateForward(Roots.page + '/' + Roots.santInfo); + } + + async followSant(event, santData, index) { + + const followSant = () => { + event.stopPropagation(); + const params = { + sant_id: santData.id, + }; + this.httpRequestService.post(api.followSant, params).then(() => { + this.suggestionSantList.splice(index, 1); + if (this.suggestionSantList.length === 0) { + this.getSuggestionSantList(); + } + }); + }; + + if (santData.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + followSant(); + } + } else { + followSant(); + } + } + + searchSant() { + this.navController.navigateForward(Roots.page + '/' + Roots.searchSant); + } + + viewAllSant(santListType) { + if (santListType === 1) { + this.stateManagementService.generalData.pending_sant_action = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + } + this.navController.navigateForward(Roots.page + '/' + Roots.viewAll.replace(':santListType', santListType)); + } + + ngOnDestroy() { + this.$subscription?.unsubscribe(); + } + +} diff --git a/src/app/pages/sant/sant-bio/sant-bio.page.html b/src/app/pages/sant/sant-bio/sant-bio.page.html new file mode 100644 index 0000000..ca5bba4 --- /dev/null +++ b/src/app/pages/sant/sant-bio/sant-bio.page.html @@ -0,0 +1,202 @@ + + + + + + Sant BIO + + + +
About sant
+
+ + + + + + +
+
Diksha info
+
+ +
+
+ Sansarik info
+
+ + + + +
+
+ Created by
+
+ +
+
Updated by
+
+ +
+
More about sant
+
+ +
+
diff --git a/src/app/pages/sant/sant-bio/sant-bio.page.scss b/src/app/pages/sant/sant-bio/sant-bio.page.scss new file mode 100644 index 0000000..968d88e --- /dev/null +++ b/src/app/pages/sant/sant-bio/sant-bio.page.scss @@ -0,0 +1,174 @@ +ion-content { + + h5 { + color: var(--ion-color-sant); + font-weight: 600; + } + + p { + font-size: var(--ion-font-size-14); + color: var(--ion-content-color); + } + + .follow-box { + padding-top: 12px; + position: relative; + + &:not(:first-child) { + border-top: 1px solid var(--ion-background-gray); + } + + >p { + + &:last-child { + color: var(--ion-color-black); + font-weight: 600; + } + + span { + color: var(--ion-color-sant); + } + } + + .shishya { + --min-height: inherit; + padding-top: var(--ion-padding-10); + max-height: 230px; + overflow: auto; + + ion-thumbnail { + height: 55px; + width: 55px; + margin-right: var(--ion-margin-10); + border-radius: var(--ion-border-radius-100); + overflow: hidden; + background: var(--ion-background-content); + } + + ion-label { + font-size: var(--ion-font-size-14); + white-space: normal; + width: calc(100% - 65px); + } + } + + ion-card { + box-shadow: none; + width: 100%; + + ion-card-header { + + img { + width: 61px; + height: 61px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + + ion-card-title { + font-size: var(--ion-font-size-14); + position: relative; + width: calc(100% - 71px); + font-weight: 600; + + p { + padding-top: 6px; + color: var(--ion-color-sant); + } + + &.sant-bio-card-title { + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + } + } + + } + } + + ion-icon { + position: absolute; + right: 7px; + top: 0; + bottom: 0; + margin: auto; + color: var(--ion-content-color); + z-index: 9; + } + + &.sansarik-info { + p { + margin-bottom: 6px; + } + + ion-card { + + ion-card-header { + + img { + width: 30px; + height: 30px; + } + + ion-card-title { + width: calc(100% - 40px); + } + } + } + } + + &.diksha-info { + + ion-card { + width: 50%; + + ion-card-header { + ion-card-title { + width: 100%; + } + } + + &:last-child { + margin: var(--ion-margin-0); + } + + p { + margin-bottom: 6px; + } + } + } + + &.created-by { + + ion-card { + margin-bottom: var(--ion-margin-10); + + ion-card-header { + ion-card-title { + width: auto; + } + } + + &:last-child { + margin: var(--ion-margin-0); + } + + p { + margin-right: var(--ion-margin-10); + min-width: 50px; + } + } + } + } + + .white-block { + background: var(--ion-color-white); + border-radius: var(--ion-border-radius-10); + box-shadow: 2px 2px 7px var(--ion-shadow); + + &:last-child { + margin-bottom: var(--ion-margin-15); + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/sant-bio/sant-bio.page.ts b/src/app/pages/sant/sant-bio/sant-bio.page.ts new file mode 100644 index 0000000..10536a7 --- /dev/null +++ b/src/app/pages/sant/sant-bio/sant-bio.page.ts @@ -0,0 +1,79 @@ +import { DatePipe, NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sant-bio', + templateUrl: './sant-bio.page.html', + styleUrls: ['./sant-bio.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, DatePipe, NgClass] +}) +export class SantBioPage implements OnInit { + santId = ''; + santDetails: any; + age: number; + userData: UserData; + + constructor( + private activatedRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.santId = this.activatedRoute.snapshot.paramMap.get('santId'); + if (this.stateManagementService.santDetails) { + this.santDetails = this.stateManagementService.santDetails; + } else { + this.getSantDetails(); + } + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + getSantDetails() { + this.httpRequestService.get(api.santInfo + '/' + this.santId).then((res: any) => { + this.santDetails = res.data; + this.stateManagementService.santDetails = res.data; + }); + } + + moveToSant(santId) { + if (santId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } + } + + moveToFamily(user) { + if ((user.length > 0) && (user[0].relation_type === 1)) { + const id = user[0].user.id; + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } else if ((user.length > 0) && (user[0].relation_type === 2)) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', user[0].sant.id)); + } + } + + moveToProfile(id) { + if (id !== this.userData.id && id !== 1) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + } + + address(element) { + this.utilityService.openGoogleMap(element.diksha_place_latitude, element.diksha_place_longitude); + } + +} diff --git a/src/app/pages/sant/sant-information/sant-information.page.html b/src/app/pages/sant/sant-information/sant-information.page.html new file mode 100644 index 0000000..d8fbd80 --- /dev/null +++ b/src/app/pages/sant/sant-information/sant-information.page.html @@ -0,0 +1,138 @@ + + + + + + {{santService.updateSant ? 'Edit Sant': 'Add Sant'}} + + + +
+ + + + + + + + + + + + +
+

Sant information

+
+ +
+ + + {{dharma.name}} + +
+ + Dharm is required. + +
+
+ +
+ + + +
+ + Sampraday is required. + +
+
+ +
+ + +
+ + Full name is required. + +
+
+ + + + + + +

{{ guru.name }}

+
+
+
+
+
+ +
+ + + +
+ +
+ + {{honor | titlecase}} + + +
+ +
+ + {{santBirthDate ? + (santBirthDate | date: 'dd-MM-yyyy') : 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + +
+ +
+ + + Maharaj Saheb + Mahasati Ji + +
+ + Gender is required. + +
+
+
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/sant/sant-information/sant-information.page.scss b/src/app/pages/sant/sant-information/sant-information.page.scss new file mode 100644 index 0000000..1971514 --- /dev/null +++ b/src/app/pages/sant/sant-information/sant-information.page.scss @@ -0,0 +1,153 @@ +app-sant-information { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + + &::part(native) { + padding: 5px 10px; + } + } + + ion-header { + background: var(--ion-background-content); + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 22.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #FF6331; + } + } + } + + .honors-chip { + padding: var(--ion-padding-0) var(--ion-padding-0) 0.5rem; + white-space: nowrap; + overflow: scroll; + + ion-chip { + height: 1.375rem; + background: var(--ion-content-color); + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) 8px; + + ion-icon { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) 5px; + margin: var(--ion-margin-0); + } + + ion-label { + font-size: var(--ion-font-size-12); + color: #fff; + } + + &:last-child { + margin: var(--ion-margin-0); + } + } + } + + :host-context(.item-label-stacked) .select-icon { + transform: translate3d(0, 0, 0); + } + + &.sant { + .top-line { + ion-chip { + background: var(--ion-background-content-sant); + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + h2 { + color: var(--ion-color-sant); + } + + .honors-chip { + ion-chip { + background: var(--ion-background-content-sant); + line-height: normal; + + ion-label { + color: var(--ion-color-sant); + } + + ion-icon { + color: var(--ion-color-sant); + } + } + } + + div { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + } + } + } + } + } + + ion-footer { + background: var(--ion-background-content); + padding-bottom: env(safe-area-inset-bottom); + } + + .search-data { + width: calc(100% - 32px) !important; + top: auto !important; + + ion-list { + border: 1px solid var(--ion-content-color-sant); + border-radius: 5px; + + ion-item { + ion-label { + max-width: inherit !important; + white-space: normal !important; + width: 69vw; + margin: var(--ion-margin-0); + } + + &:last-child { + border: none; + } + } + } + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --height: 382px; + --border-radius: 8px; + } + + ion-datetime { + height: 382px; + } +} \ No newline at end of file diff --git a/src/app/pages/sant/sant-information/sant-information.page.ts b/src/app/pages/sant/sant-information/sant-information.page.ts new file mode 100644 index 0000000..b14062b --- /dev/null +++ b/src/app/pages/sant/sant-information/sant-information.page.ts @@ -0,0 +1,152 @@ +import { DOCUMENT, DatePipe, NgClass, NgFor, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, Inject, OnInit, Renderer2 } from '@angular/core'; +import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { Dharma, Sampraday } from '@interfaces/common'; +import { SantInformationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; + +@Component({ + selector: 'app-sant-information', + templateUrl: './sant-information.page.html', + styleUrls: ['./sant-information.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgFor, NgIf, NgClass, IonicSelectableComponent, GjDatetimeDirective, + TitleCasePipe, DatePipe] +}) +export class SantInformationPage implements OnInit { + santInformationForm: FormGroup; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + honorArray = []; + santList = []; + honor = ''; + currentDate = this.formatDate((new Date()).toISOString()); + santBirthDate = ''; + prevValue: string; + + constructor( + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + public santService: SantInfoService, + public utilityService: UtilityService, + private renderer: Renderer2, + @Inject(DOCUMENT) private document: Document, + ) { + this.renderer.addClass(this.document.body, 'sant-selectable'); + } + + ngOnInit() { + this.santInformationForm = this.santService.santInfoForm; + if (this.santInformationForm) { + this.santBirthDate = this.santInformationForm.controls.birth_date.value; + } + this.honorArray = this.santService.santInfoForm.controls.honor.value ? this.santService.santInfoForm.controls.honor.value : []; + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + this.setSamprday(); + } + + ionViewWillEnter() { + this.setSamprday(); + } + + setSamprday() { + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + this.sampradayDetails.forEach((elem) => { + if (elem?.id === this.santInformationForm.controls.sampraday_id.value?.id) { + this.santInformationForm.controls.sampraday_id.setValue(elem); + } + }); + } else { + this.getSampradayDetails(); + } + } + + addHonor(value) { + if (value.replaceAll(/\s/g, '')) { + this.honorArray.push(value); + this.santInformationForm.controls.honor.setValue(this.honorArray); + this.honor = ''; + } + } + + removeHonor(index) { + this.honorArray.splice(index, 1); + this.santInformationForm.controls.honor.setValue(this.honorArray); + } + + onDharmChange() { + this.santInformationForm.controls.sampraday_id.setValue(null); + this.getSampradayDetails(); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + this.httpRequestService.get(api.sampradayDetails, { + dharma_id: this.santService.santInfoForm.controls.dharma_id.value + }).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + if (this.sampradayDetails) { + this.sampradayDetails.forEach((elem) => { + if (elem?.id === this.santInformationForm.controls.sampraday_id.value?.id) { + this.santInformationForm.controls.sampraday_id.setValue(elem); + } + }); + } + }); + } + + getSantList(event) { + if (!event.value.trim()) { return this.santList = []; } + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue, true); + this.prevValue = event.value; + if (!isSameStr) { + this.httpRequestService.get(api.santList, { + name: event.value.trim(), + dharma_id: this.santInformationForm.controls.dharma_id.value, + sampraday_id: this.santInformationForm.controls.sampraday_id.value.id, + page: 1, + limit: 10, + }).then((res: any) => { + if (event.value) { this.santList = res.data.data; } + }); + } + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + moveToNext(form) { + if (form.value.birth_date) { + this.santInformationForm.controls.birth_date.setValue(this.formatDate(form.value.birth_date)); + form.value.birth_date = this.formatDate(form.value.birth_date); + } + if (!form.valid) { + this.santInformationForm.markAllAsTouched(); + return; + } + this.navCtrl.navigateForward(Roots.page + '/' + Roots.aboutDiksha); + } +} diff --git a/src/app/pages/sant/sant-profile-image/sant-profile-image.page.html b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.html new file mode 100644 index 0000000..1365677 --- /dev/null +++ b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.html @@ -0,0 +1,43 @@ + + + + + + {{santService.updateSant ? 'Edit Sant': 'Add Sant'}} + + + +
+ + + + + + + + + + + + +
+

Sant profile image

+

Please upload clean and original image that can help followers to identify your Sant.

+ + + + + Change profile + image +

+ + +

+
+ + Back + Finish + diff --git a/src/app/pages/sant/sant-profile-image/sant-profile-image.page.scss b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.scss new file mode 100644 index 0000000..afc27b4 --- /dev/null +++ b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.scss @@ -0,0 +1,171 @@ +app-sant-profile-image { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0rem; + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-header { + background: var(--ion-background-content); + } + + ion-content { + text-align: center; + + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 22.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #FF6331; + } + } + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + } + + .profile-bg { + width: 14rem; + height: 14rem; + margin: 2rem auto; + background: url(/assets/images/profile-bg.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + + img { + border: 2px solid #fff; + border-radius: var(--ion-border-radius-100); + width: 8.75rem; + height: 8.75rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + } + + ion-button { + margin: var(--ion-margin-0) auto; + color: var(--ion-color); + + &::part(native) { + --background: none; + border: 1px solid var(--ion-color); + } + } + + &.sant { + .top-line { + ion-chip { + background: var(--ion-background-content-sant); + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + h2 { + color: var(--ion-color-sant); + } + + ion-button { + &::part(native) { + border: 1px solid var(--ion-content-color-sant); + color: var(--ion-color-sant); + } + } + } + } + + p { + &.agreed-content { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + color: var(--ion-content-color); + display: flex; + + label { + padding-left: var(--ion-padding-10); + } + + ion-checkbox { + &.checkbox-checked { + --checkbox-background-checked: var(--ion-color-sant); + --border-color-checked: var(--ion-color-sant); + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) 0.938rem; + background: var(--ion-background-content); + padding-bottom: env(safe-area-inset-bottom); + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } +} + +ion-alert { + &.sant-approval { + --max-width: 300px; + + .alert-wrapper { + .alert-head { + padding: var(--ion-padding-0) !important; + } + + .alert-message { + padding: var(--ion-padding-10) !important; + text-align: center; + } + + .alert-button-group { + padding: var(--ion-padding-0); + justify-content: center; + + button { + background: var(--ion-color-sant); + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0); + color: #fff; + width: 30%; + + span { + justify-content: center; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/sant-profile-image/sant-profile-image.page.ts b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.ts new file mode 100644 index 0000000..3a21025 --- /dev/null +++ b/src/app/pages/sant/sant-profile-image/sant-profile-image.page.ts @@ -0,0 +1,138 @@ +import { NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { ActionSheetController, AlertController, IonicModule, NavController } from '@ionic/angular'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-sant-profile-image', + templateUrl: './sant-profile-image.page.html', + styleUrls: ['./sant-profile-image.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, SafeUrlPipe] +}) +export class SantProfileImagePage implements OnInit { + @ViewChild('fileInput', { static: true }) fileInput: ElementRef; + photo: any; + confirmationFlag = false; + constructor( + private navCtrl: NavController, + private alert: AlertService, + private httpRequestService: HttpRequestService, + public actionSheetCtrl: ActionSheetController, + public santService: SantInfoService, + public alertController: AlertController, + private cameraGalleryService: CameraGalleryService, + private utilityService: UtilityService + ) { } + + ngOnInit() { + if (this.santService.santProfileImage.controls.avatar.value instanceof Blob) { + const reader = new FileReader(); + reader.onload = () => { + this.photo = reader.result.toString(); + }; + reader.readAsDataURL(this.santService.santProfileImage.controls.avatar.value); + } else if (typeof (this.santService.santProfileImage.controls.avatar.value) === 'string') { + this.photo = this.santService.santProfileImage.controls.avatar.value; + } + } + + selectProfileImage() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (imageData) { + this.photo = imageData.imgString; + this.santService.santProfileImage.controls.avatar.setValue(imageData.itemImage); + } + }); + } + + async moveToNext() { + if (!this.confirmationFlag) { + return; + } + const formData = new FormData(); + for (const [, formValue] of Object.entries(this.santService.santInformationForm.value)) { + for (const [key, value] of Object.entries(formValue)) { + if (key !== 'sampraday_id') { + formData.append(key, (value ? (value instanceof Array ? value.toString() : value) : '')); + } + } + } + formData.append('verification_status', '2'); + formData.append('sampraday_id', String(this.santService.santInfoForm.controls.sampraday_id.value.id)); + + if (this.santService.updateSant) { + if (typeof (this.santService.santProfileImage.controls.avatar.value) === 'string') { + formData.delete('avatar'); + } + this.updateSant(formData); + } else { + this.addSant(formData); + } + } + + addSant(formData) { + this.presentAlertPrompt('add', formData); + } + + updateSant(formData) { + this.presentAlertPrompt('update', formData); + } + + async presentAlert(redirectionPath) { + const alert = await this.alertController.create({ + cssClass: 'sant-approval', + backdropDismiss: false, + message: `Thank you for submitting maharaj saheb's / mahasati's profile. + GlobalJain admin will verify and confirm within 48 hours. + You can review the progress in "In Review". + Once approved, you will be awarded karmā points` , + buttons: [{ + text: 'Ok', + handler: () => { + this.navCtrl.navigateBack(redirectionPath); + } + }] + }); + await alert.present(); + } + + moveToBack() { + this.navCtrl.navigateBack('/' + Roots.page + '/' + Roots.aboutSansarikJeevan); + } + + async presentAlertPrompt(type: string, formData) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure that all information is correct?' + ); + if (isYes) { + if (type === 'add') { + this.alert.showSpinner(); + this.httpRequestService.post(api.addSant, formData).then(() => { + this.santService.santInformationForm.reset(); + this.presentAlert('page/create-new-sant'); + }).finally(() => { + this.alert.hideLoader(); + }); + } else if (type === 'update') { + this.alert.showSpinner(); + this.httpRequestService.post(api.updateSant + '/' + this.santService.updateSantId, formData).then((res: any) => { + this.alert.showToaster(res.message); + this.santService.updateSant = false; + this.santService.reviewed_fields = null; + this.santService.santInformationForm.reset(); + this.presentAlert('page/sant-view-profile/' + this.santService.updateSantId); + }).finally(() => { + this.alert.hideLoader(); + }); + } + } + } +} diff --git a/src/app/pages/sant/sant-view-profile/sant-view-profile.page.html b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.html new file mode 100644 index 0000000..dd8d5c6 --- /dev/null +++ b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.html @@ -0,0 +1,108 @@ + + + + + + Sant profile + + + + +
+
+ +
+ + +
+
+ +
+

{{ santDetails?.name }}

+

{{ santDetails?.sampraday?.name }}

+
+ + {{honor | titlecase}} + +
+ + + + +
+ View M.S + profile + Edit profile + In review + +
+
+
+
+ + {{ + +santDetails?.thana_member_count }} +
+

Thana +

+
+
+
+ + {{ + +santDetails?.current_chaturmas_count }} +
+

Chaturmas

+
+
+
+ + {{ + santDetails?.upcoming_vihar_count }} +
+

Vihaar

+
+
+
+ + + + + + +
+ diff --git a/src/app/pages/sant/sant-view-profile/sant-view-profile.page.scss b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.scss new file mode 100644 index 0000000..d18899b --- /dev/null +++ b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.scss @@ -0,0 +1,196 @@ +ion-header { + ion-toolbar { + ion-icon { + font-size: var(--ion-font-size-24); + } + } +} + +h3 { + margin-bottom: 4px; + font-weight: 700; +} + +ion-button { + --border-radius: var(--border-radius-5); +} + +ion-content { + &.sant { + --ion-background-button: var(--ion-color-sant); + --ion-color: var(--ion-color-sant); + --ion-color-light-text: var(--ion-color-sant); + + p { + font-size: var(--ion-font-size-14); + color: var(--ion-content-color); + } + + .profile-bg { + width: 142px; + height: 142px; + margin: 0 auto 16px; + background: url(/assets/images/profile-bg.svg) no-repeat center center; + background-size: contain; + + .complete-progress { + border: 1px solid var(--ion-color-light); + border-radius: var(--ion-border-radius-100); + width: 92px; + height: 92px; + padding: 3px; + background: conic-gradient(var(--ion-color-sant) var(--progress), var(--ion-background-content-sant) 0deg); + overflow: hidden; + + >img { + border-radius: var(--ion-border-radius-100); + padding: 1px; + background: var(--ion-color-white); + width: 100%; + height: 100%; + } + } + } + + .update-profile-link { + font-size: 10px; + box-shadow: 0px 0px 7px rgba(var(--ion-color-black-rgb), 0.1); + padding: 2px 5px; + border-radius: var(--border-radius-5); + position: absolute; + bottom: 13px; + left: 50%; + background: var(--ion-color-white); + transform: translateX(-50%); + } + + .follow-box { + border-top: 1px solid var(--ion-background-gray-light); + border-bottom: 1px solid var(--ion-background-gray-light); + padding: 12px 0; + + ion-item { + --min-height: inherit; + + ion-thumbnail { + height: 30px; + width: 30px; + margin-right: 10px; + + &:last-child { + background: var(--ion-color-sant); + color: var(--ion-color-white); + border-radius: var(--ion-border-radius-100); + font-size: var(--ion-font-size-14); + } + + img { + border-radius: var(--ion-border-radius-100); + } + + span { + font-size: 22px; + } + } + } + } + + ion-button { + height: 30px; + font-size: var(--ion-font-size-14); + width: auto; + + &::part(native) { + --background: var(--ion-color-sant); + } + } + + .chaturmas-btn { + padding: var(--ion-padding-20); + + .chaturmas { + flex-direction: column; + + .chaturmas-icon { + position: relative; + width: 45px; + height: 45px; + background: var(--ion-background-content-sant); + border-radius: var(--ion-border-radius-100); + margin-bottom: var(--ion-margin-10); + + .count { + position: absolute; + top: -5px; + right: -5px; + width: 20px; + height: 20px; + font-size: 11px; + font-weight: 600; + letter-spacing: 0; + color: var(--ion-color-sant); + background: var(--ion-color-white); + border: 1px var(--ion-color-sant) solid; + border-radius: var(--ion-border-radius-100); + } + } + + &.red { + .chaturmas-icon { + background: var(--ion-color-sangh-light); + + .count { + border: 1px solid var(--ion-red-border); + color: var(--ion-red-border); + } + } + } + } + } + + ion-button { + height: 30px; + width: 47%; + } + + .bg { + background: var(--ion-color-white); + + .honors-chip { + padding-bottom: 8px; + white-space: nowrap; + overflow: scroll; + + ion-chip { + height: 22px; + background: var(--ion-background-content-sant); + padding: var(--ion-padding-0) 8px; + + &:not(:last-child) { + margin-right: var(--ion-margin-10); + } + + ion-label { + font-size: var(--ion-font-size-12); + color: var(--ion-color-sant); + } + } + } + + .view-btn { + + ion-button { + &:nth-child(2) { + margin-left: 6%; + + &::part(native) { + --background: var(--ion-background-content-sant); + color: var(--ion-color-sant); + border: 1px solid; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/sant-view-profile/sant-view-profile.page.ts b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.ts new file mode 100644 index 0000000..289bbb8 --- /dev/null +++ b/src/app/pages/sant/sant-view-profile/sant-view-profile.page.ts @@ -0,0 +1,231 @@ +import { NgClass, NgFor, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Share, ShareOptions } from '@capacitor/share'; +import { FooterComponent } from '@components/footer/footer.component'; +import { ProfileCompleteIndicatorComponent } from '@components/profile-complete-indicator/profile-complete-indicator.component'; +import { SantLocationComponent } from '@components/sant-location/sant-location.component'; +import { SantPostComponent } from '@components/sant-post/sant-post.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { SantActivityList } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { SantInfoService } from '@services/sant-info.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-sant-view-profile', + templateUrl: './sant-view-profile.page.html', + styleUrls: ['./sant-view-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, ProfileCompleteIndicatorComponent, NgClass, SantLocationComponent, SantPostComponent, + FooterComponent, TitleCasePipe] +}) +export class SantViewProfilePage implements OnInit { + santId = ''; + updatedSantId = ''; + santDetails: any; + santPageNumber = 1; + santTotalPage = 1; + santPostList: Array = []; + + constructor( + private navCtrl: NavController, + private activatedRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private stateManagementService: StateManagementService, + private alert: AlertService, + private router: Router, + private santService: SantInfoService, + public utilityService: UtilityService + ) { } + + async ngOnInit() { + this.santId = this.activatedRoute.snapshot.paramMap.get('santId'); + this.updatedSantId = this.router.getCurrentNavigation().extras?.state?.updatedSantId; + } + + ionViewWillEnter() { + this.getSantDetails(); + this.getSantPostList(false, ''); + this.getDharmaDetails(); + } + + getSantDetails(loadSampraday = true) { + let apiRoute = api.santInfo + '/' + this.santId; + if (this.updatedSantId) { + apiRoute = api.inReviewSantInfo + '/' + this.updatedSantId; + } + this.alert.showLoader(); + this.httpRequestService.get(apiRoute).then((res: any) => { + this.santDetails = res.data; + this.stateManagementService.santDetails = res.data; + if (loadSampraday) { this.getSampradayDetails(); } + }).finally(() => { + this.alert.hideLoader(); + }); + } + + getSantPostList(isFirstLoad, event) { + if (this.santPageNumber <= this.santTotalPage) { + this.httpRequestService.post(api.santActivityList, { + page: this.santPageNumber, + limit: 5, + sant_id: this.santId + }).then((res: any) => { + this.santTotalPage = res.data.last_page; + this.santPostList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.santPageNumber = res.data.current_page + 1; + }); + } else { + event?.target?.complete(); + } + } + + // for show dharma in edit sant + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.stateManagementService.dharmaDetails = res.data; + }); + } + // for show sampraday in edit sant + getSampradayDetails() { + const params = { + dharma_id: this.santDetails.dharma_id + }; + this.httpRequestService.get(api.sampradayDetails, params).then((res: any) => { + this.stateManagementService.sampradayDetails = res.data; + }); + } + + moveToChaurmas() { + const navOption = { + state: { + dharmaId: this.santDetails?.dharma_id, + sampradayId: this.santDetails?.sampraday_id, + thanaMemberCount: this.santDetails?.thana_member_count, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.chaturmasInfo.replace(':santId', this.santId), navOption); + } + + moveToVihar() { + const navOption = { + state: { + thanaMemberCount: this.santDetails?.thana_member_count, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.viharInfo.replace(':santId', this.santId), navOption); + } + + moveToThana() { + const navOption = { + state: { + dharmaId: this.santDetails?.dharma_id, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.thanaList.replace(':santId', this.santId), navOption); + } + + moveToSantBio() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santBio.replace(':santId', this.santId)); + } + + async followSant(event, santData: any) { + + const followSant = () => { + event.stopPropagation(); + const params = { + sant_id: +this.santId, + }; + this.httpRequestService.post(api.followSant, params).then(() => { + this.santDetails.is_user_following = !this.santDetails.is_user_following; + }); + }; + + if (santData.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + followSant(); + } + } else { + followSant(); + } + } + + intlFormat(num) { + return new Intl.NumberFormat().format(Math.round(num * 10) / 10); + } + + localizeCount(num) { + if (num >= 1000000) { + return this.intlFormat(num / 1000000) + 'M'; + } + if (num >= 1000) { + return this.intlFormat(num / 1000) + 'k'; + } + return this.intlFormat(num); + } + + editProfile() { + if (( + (!this.santDetails?.is_in_review && this.santDetails?.verification_status === 1) && !this.updatedSantId) || + (this.updatedSantId && [3, 5].includes(this.santDetails?.verification_status)) + ) { + const santData = {} as any; + for (const [formKey, formValue] of Object.entries(this.santService.santInformationForm.value)) { + santData[formKey] = {}; + for (const [key] of Object.entries(formValue)) { + santData[formKey][key] = + formKey === 'santInfoForm' && key === 'sampraday_id' ? this.santDetails.sampraday : + this.santDetails[key] || ''; + } + } + const typeOfUser = ['', 'user', 'sant']; + santData.dikshaInfoForm.guru = this.santDetails.guru ? this.santDetails.guru.name : null; + santData.dikshaInfoForm.guru_id = this.santDetails.guru ? this.santDetails.guru.id : null; + santData.sansarikJeevanInfoForm.father_id = this.santDetails.father.length > 0 ? + this.santDetails.father[0].relation_id : null; + santData.sansarikJeevanInfoForm.father_type = this.santDetails.father.length > 0 ? + typeOfUser[this.santDetails.father[0].relation_type] : null; + santData.sansarikJeevanInfoForm.mother_id = this.santDetails.mother.length > 0 ? + this.santDetails.mother[0].relation_id : null; + santData.sansarikJeevanInfoForm.mother_type = this.santDetails.mother.length > 0 ? + typeOfUser[this.santDetails.mother[0].relation_type] : null; + this.santService.santInformationForm.patchValue(santData); + this.santService.updateSant = true; + this.santService.updateSantId = this.santId; + this.santService.reviewed_fields = this.santDetails.reviewed_fields; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santInfo); + } + } + + viewAllFollowers() { + this.navCtrl.navigateForward([ + Roots.page + '/' + Roots.viewAll.replace(':santListType', '5'), + { id: this.activatedRoute.snapshot.paramMap.get('santId') } + ]); + } + + async shareProfile() { + const options: ShareOptions = { + url: `${environment.siteUrl}/page/sant-view-profile/${this.santId}`, + }; + await Share.share(options); + } + + goToInReview() { + this.stateManagementService.generalData.pending_sant_action = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.navCtrl.navigateForward(Roots.page + '/' + Roots.viewAll.replace(':santListType', '1')); + } + +} diff --git a/src/app/pages/sant/search-sant/search-sant.page.html b/src/app/pages/sant/search-sant/search-sant.page.html new file mode 100644 index 0000000..7b88a3e --- /dev/null +++ b/src/app/pages/sant/search-sant/search-sant.page.html @@ -0,0 +1,88 @@ + + + + + + Search Sant + + + + + + + + + +

+

No data found

+

+ + + + + + +

{{ sant?.name }}

{{sant?.dharm?.name}}

+

({{sant?.sampraday?.name}})

+

+ + Following + Follow +
+
+
+ + + + +
+ + + +

Sant Filter

+ +
+ + +
+ +
+ + + {{dharma.name}} + +
+ +
+ + + +
+ +
+ + + Maharaj Saheb + Mahasati Ji + +
+ +
+ Filter + Reset +
+
+
+
diff --git a/src/app/pages/sant/search-sant/search-sant.page.scss b/src/app/pages/sant/search-sant/search-sant.page.scss new file mode 100644 index 0000000..23c26ed --- /dev/null +++ b/src/app/pages/sant/search-sant/search-sant.page.scss @@ -0,0 +1,268 @@ +app-search-sant { + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + margin-right: var(--ion-margin-10); + color: #fff; + float: right; + } + + ion-title { + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + } + } + } + + ion-content { + ion-list { + padding: var(--ion-padding-10) 0; + border-bottom: 1px solid #efefef; + + ion-item { + margin: var(--ion-margin-0); + + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + background: #e2f0ff; + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-12) !important; + line-height: 16px !important; + } + } + + ion-button { + margin: var(--ion-margin-0); + min-height: 30px; + height: 30px; + + &.following { + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + } + } + } + } + } + } + + &.sant { + ion-list { + ion-item { + ion-label { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + } + + &.following { + &::part(native) { + --background: var(--ion-background-content-sant); + color: var(--ion-color-sant); + border: 1px solid; + } + } + } + } + } + } + } + + h3 { + p { + color: var(--ion-color-sant); + } + } + } +} + +ion-modal { + &.sant-filter { + --height: 450px; + align-items: flex-end; + --height: calc(450px + env(safe-area-inset-bottom)); + + ion-content { + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: var(--ion-color-sant); + } + } + + ion-item { + &:first-child { + margin-top: var(--ion-margin-10); + } + + ion-select, + ionic-selectable { + height: 2.813rem; + border: 1px solid var(--ion-content-color-sant); + } + + ionic-selectable { + border: 1px solid var(--ion-content-color-sant); + padding: var(--ion-padding-10) !important; + } + } + + input { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.813rem; + background: transparent; + + .middle:focus { + outline-width: 0; + } + } + + h4 { + font-size: var(--ion-font-size-18); + color: var(--ion-color-sant); + } + + .filter-btn { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-button { + width: 48%; + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } + + .ionic-selectable-value { + span { + display: flex; + + .ionic-selectable-value-item { + position: relative; + overflow: visible; + + &:before { + content: ","; + } + + &:first-child { + &:before { + content: ""; + } + } + + &:last-child { + overflow: hidden; + } + } + } + } + + .ionic-selectable-icon { + width: 12px; + } + } + } +} + +.sant-selectable { + ionic-selectable-modal { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + --color: white; + } + } + + ion-content { + ion-list { + ion-item-group { + ion-item { + ion-icon { + &.ion-color-primary { + --ion-color-base: var(--ion-color-sant) !important; + } + } + + ion-label { + white-space: normal !important; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/search-sant/search-sant.page.ts b/src/app/pages/sant/search-sant/search-sant.page.ts new file mode 100644 index 0000000..e4f25db --- /dev/null +++ b/src/app/pages/sant/search-sant/search-sant.page.ts @@ -0,0 +1,180 @@ +import { DOCUMENT, NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, Inject, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { Dharma, Sampraday } from '@interfaces/common'; +import { IonicModule, ModalController, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-search-sant', + templateUrl: './search-sant.page.html', + styleUrls: ['./search-sant.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgIf, NgFor, AvatarPercentageComponent, IonicSelectableComponent] +}) +export class SearchSantPage implements OnInit, OnDestroy { + @ViewChild('currentLocation') currentLocation: ElementRef; + santList = []; + pageNumber = 1; + totalPage = 1; + searchValue = ''; + prevValue: string; + dharma_id: any; + sampraday_id: any; + sampradayDetails: Array = []; + dharmaDetails: Array = []; + gender_id: any; + sampradayData = []; + spinnerFlag = false; + locationData = { + text: '', + lng: '', + lat: '' + }; + + constructor( + private httpRequestService: HttpRequestService, + private navController: NavController, + private modalCtrl: ModalController, + private stateManagementService: StateManagementService, + private renderer: Renderer2, + private utilityService: UtilityService, + @Inject(DOCUMENT) private document: Document, + ) { + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.sampradayDetails.length > 0) { + this.sampradayDetails = this.stateManagementService.sampradayDetails; + } else { + this.getSampradayDetails(); + } + this.renderer.addClass(this.document.body, 'sant-selectable'); + } + + ngOnInit() { + this.getSantList(false, ''); + } + + searchSant() { + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.santList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getSantList(false, ''); + } + } + + loadData($event) { + this.getSantList(true, $event); + } + + getSantList(isFirstLoad, event) { + this.spinnerFlag = false; + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.globalSearchSant, { + page: this.pageNumber, + limit: 15, + name: this.searchValue.trim(), + dharma_id: this.dharma_id ? [this.dharma_id] : [], + sampraday_id: this.sampradayData, + gender_id: this.gender_id ? [this.gender_id] : [], + longitude: this.locationData.text ? this.locationData.lng : '', + latitude: this.locationData.text ? this.locationData.lat : '', + }).then((res: any) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { this.santList = []; } + this.totalPage = res.data.last_page; + this.santList.push(...res.data.data); + this.spinnerFlag = true; + this.pageNumber++; + }); + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + santProfile(santId) { + this.navController.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } + + followSant(event, santId, index) { + event.stopPropagation(); + this.httpRequestService.post(api.followSant, { + sant_id: santId, + }).then(() => { + this.santList[index].is_user_following = !this.santList[index].is_user_following; + }); + } + + onDharmChange() { + this.sampraday_id = []; + this.getSampradayDetails(); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getSampradayDetails() { + this.httpRequestService.get(api.sampradayDetails, { + dharma_id: this.dharma_id + }).then((res: any) => { + this.sampradayDetails = res.data; + this.stateManagementService.sampradayDetails = res.data; + }); + } + + onSampradayChange() { + this.sampradayData = []; + for (const data of this.sampraday_id) { + this.sampradayData.push(data.id); + } + } + + advanceSearch() { + this.santList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getSantList(false, ''); + this.modalCtrl.dismiss(); + } + + resetFilter() { + this.dharma_id = ''; + this.sampraday_id = ''; + this.gender_id = ''; + this.locationData.text = ''; + this.sampradayData = []; + this.advanceSearch(); + } + + initAutocompleteCurrent(): void { + this.utilityService.createAutocomplete(this.currentLocation.nativeElement, []).subscribe((details) => { + this.locationData = { + text: this.currentLocation.nativeElement.value, + lng: details.geometry.location.lng(), + lat: details.geometry.location.lat() + }; + }); + } + + ngOnDestroy(): void { + this.renderer.removeClass(this.document.body, 'sant-selectable'); + } + +} diff --git a/src/app/pages/sant/thana-list/thana-list.page.html b/src/app/pages/sant/thana-list/thana-list.page.html new file mode 100644 index 0000000..6672a9d --- /dev/null +++ b/src/app/pages/sant/thana-list/thana-list.page.html @@ -0,0 +1,63 @@ + + + + + + Thana List + + + +

+

No Thana found

+

+ + + + + + + +

+

+ In Review +

+ {{ thana?.name}} +

Dharam: {{ thana?.dharm?.name }}

+

Sampraday: {{ thana?.sampraday?.name }}

+

+
+
+ +
+ +
+
+
+ + + + + + Make a Leader + + + Delete + + + + + +
+
+ + + + + + + + + +
diff --git a/src/app/pages/sant/thana-list/thana-list.page.scss b/src/app/pages/sant/thana-list/thana-list.page.scss new file mode 100644 index 0000000..e298145 --- /dev/null +++ b/src/app/pages/sant/thana-list/thana-list.page.scss @@ -0,0 +1,124 @@ +app-thana-list { + ion-content { + ion-card { + margin: var(--ion-margin-15); + + ion-list { + padding: var(--ion-padding-0) !important; + + ion-item { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + ion-avatar { + width: 50px; + height: 50px; + margin: var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + position: relative; + + img { + background: #e2f0ff; + } + } + + ion-label { + display: flex !important; + justify-content: space-between; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + width: 100%; + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-12) !important; + line-height: 15px !important; + + &.not-apprved { + float: right; + + .in-review { + font-size: var(--ion-font-size-12) !important; + line-height: 27px !important; + font-weight: 500; + color: #FF6331; + background: #FFEFEB; + padding: 5px 10px; + border-radius: 4px; + } + } + } + } + + &.thana-title { + h3 { + width: calc(100% - 13px); + } + } + + ion-icon { + font-size: 18px; + } + + .thana-icon { + background: var(--ion-color-white); + padding: 0; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + width: 20px; + height: 20px; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 10px; + } + } + } + } + + .thana-leader { + background: var(--ion-background-content-sant); + + ion-item { + ion-label { + >div { + display: flex; + justify-content: space-between; + flex-direction: column; + height: 100%; + } + } + } + } + } + + ion-fab-button::part(native) { + --background: var(--ion-color-sant); + } + + h3 { + p { + color: var(--ion-color-sant); + } + } + } +} + +ion-popover { + ion-content { + ion-list { + padding: var(--ion-padding-0); + + .delete-thana { + color: red; + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/thana-list/thana-list.page.ts b/src/app/pages/sant/thana-list/thana-list.page.ts new file mode 100644 index 0000000..2d18e05 --- /dev/null +++ b/src/app/pages/sant/thana-list/thana-list.page.ts @@ -0,0 +1,109 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-thana-list', + templateUrl: './thana-list.page.html', + styleUrls: ['./thana-list.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, NgClass] +}) +export class ThanaListPage implements OnInit { + santId: number; + pageNumber = 1; + totalPage = 1; + thanaList: any[] = []; + dharmaId = '1'; + is_leader_exist = false; + constructor( + private httpRequestService: HttpRequestService, + private activatedRoute: ActivatedRoute, + private navCtrl: NavController, + private router: Router, + private utilityService: UtilityService + ) { + this.dharmaId = this.router.getCurrentNavigation().extras.state?.dharmaId; + } + + ngOnInit() { + this.santId = Number(this.activatedRoute.snapshot.paramMap.get('santId')); + } + + ionViewWillEnter() { + this.pageNumber = 1; + this.totalPage = 1; + this.thanaList = []; + this.getThanaList(false, ''); + } + + loadData($event) { + this.getThanaList(true, $event); + } + + getThanaList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.santThanaList, { + sant_id: Number(this.santId), + page: this.pageNumber + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.is_leader_exist = res.is_leader_exist; + this.thanaList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + addThana() { + const navOption = { + state: { + santId: this.santId, + dharmaId: this.dharmaId + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.addThana, navOption); + } + + makeLeader(i, thanaSantId) { + const params = { + sant_id: Number(this.santId), + thana_sant_id: thanaSantId + }; + this.httpRequestService.post(api.makeLeader, params).then(() => { + this.thanaList[i].pivot.is_leader = 1; + this.is_leader_exist = true; + }); + } + + async deleteThana(i, thana) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to delete?', + 'No', 'Yes', 'Delete Thana' + ); + if (isYes) { + const params = { + sant_id: Number(this.santId), + thana_sant_id: thana?.id + }; + this.httpRequestService.delete(api.deleteThana, params).then(() => { + this.thanaList.splice(i, 1); + if (thana.pivot.is_leader === 1) { + this.is_leader_exist = false; + } + }); + } + } + + moveToSantProfile(santId) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', santId)); + } +} diff --git a/src/app/pages/sant/view-all/view-all.page.html b/src/app/pages/sant/view-all/view-all.page.html new file mode 100644 index 0000000..0bb95b1 --- /dev/null +++ b/src/app/pages/sant/view-all/view-all.page.html @@ -0,0 +1,55 @@ + + + + + + {{title}} + + + + + + +
+ Global Jain +

No data found

+

By following Sant, you can know current location, chaturmas and live updates on + Vihaar. Please use Global search / suggestions for the Sants to follow.

+

All Sant's profile updated by you and with Admin for review will be listed here. No + M.S details updated by you.

+
+ + + + + + +
+

{{ sant?.name }}

+

+ Sent Back + +

+

{{ sant?.about }}

+

{{sant?.dharm?.name}}

+

({{sant?.sampraday?.name}})

+
+ Following + Follow +
+
+
+ + + + +
diff --git a/src/app/pages/sant/view-all/view-all.page.scss b/src/app/pages/sant/view-all/view-all.page.scss new file mode 100644 index 0000000..7ab4d1a --- /dev/null +++ b/src/app/pages/sant/view-all/view-all.page.scss @@ -0,0 +1,68 @@ +ion-content { + ion-list { + padding: var(--ion-padding-10) 0; + border-bottom: 1px solid var(--ion-background-gray-light); + + ion-item { + + ion-label { + display: flex; + + h3 { + font-weight: 600; + white-space: normal; + } + + p { + font-weight: 400; + color: var(--ion-color-medium-shade); + line-height: 16px; + + &.review-label { + font-size: var(--ion-font-size-12); + text-transform: none; + text-overflow: inherit; + overflow: inherit; + } + + &.sent-back { + + .in-review { + font-size: var(--ion-font-size-12); + font-weight: 500; + color: var(--ion-notification-count); + background: var(--ion-color-sangh-light); + padding: 5px 10px; + border-radius: var(--ion-border-radius-5); + } + } + } + + ion-button { + margin-top: var(--ion-margin-10); + height: 30px; + + &.following { + &::part(native) { + --background: var(--ion-background-content); + color: var(--ion-color); + border: 1px solid; + } + } + } + } + } + } + + &.sant { + --ion-background-content: var(--ion-background-content-sant); + --ion-color: var(--ion-color-sant); + } + + .no-data-flag { + p { + color: var(--ion-color-sant); + font-weight: 600; + } + } +} \ No newline at end of file diff --git a/src/app/pages/sant/view-all/view-all.page.ts b/src/app/pages/sant/view-all/view-all.page.ts new file mode 100644 index 0000000..a1deca9 --- /dev/null +++ b/src/app/pages/sant/view-all/view-all.page.ts @@ -0,0 +1,150 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { UserData } from '@interfaces/common'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-view-all', + templateUrl: './view-all.page.html', + styleUrls: ['./view-all.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, AvatarPercentageComponent, NgClass] +}) +export class ViewAllPage implements OnInit { + santListType: string; + santList = []; + title: string; + pageNumber = 1; + totalPage = 1; + apiRoute = ''; + isInReview = false; + noDataFlag: boolean; + spinnerFlag = false; + userData: UserData; + + constructor( + private activatedRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private navController: NavController, + private stateManagementService: StateManagementService, + private utilityService: UtilityService, + private alertController: AlertController + ) { } + + ngOnInit() { + this.santListType = this.activatedRoute.snapshot.paramMap.get('santListType'); + if (this.santListType === '1') { + this.title = 'In Review'; + this.apiRoute = api.inReviewSant; + this.isInReview = true; + } else if (this.santListType === '2') { + this.title = 'Following'; + this.apiRoute = api.followingSant; + } else if (this.santListType === '3') { + this.title = 'Created By You'; + this.apiRoute = api.createdByMeSant; + } else if (this.santListType === '4') { + this.title = 'Suggestion'; + this.apiRoute = api.suggestionSant; + } else if (this.santListType === '5') { + this.title = 'Followers'; + this.apiRoute = api.followersOfSantList.replace('{sant_id}', String(this.activatedRoute.snapshot.paramMap.get('id'))); + } + this.getSantList(false, ''); + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + loadData($event) { + this.getSantList(true, $event); + } + + getSantList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(this.apiRoute, { + page: this.pageNumber, + limit: 15 + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.noDataFlag = true; + this.santList.push(...res.data.data); + this.spinnerFlag = true; + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + santProfile(sant) { + if (this.santListType === '5') { + if (sant.id === this.userData.id) { + this.navController.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navController.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id: sant.id }]); + } + } else if (this.santListType === '1') { + const navOption = { + state: { + updatedSantId: sant.sant_id, + }, + }; + this.navController.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', sant.sant_id), navOption); + } else { + this.navController.navigateForward(Roots.page + '/' + Roots.santViewProfile.replace(':santId', sant.id)); + } + } + + async followSant(event, santData, index) { + if (santData.is_user_following) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unfollow?', + 'No', 'Yes', 'Unfollow' + ); + if (isYes) { + event.stopPropagation(); + const params = { + sant_id: santData.id, + }; + this.httpRequestService.post(api.followSant, params).then(() => { + this.santList[index].is_user_following = !this.santList[index].is_user_following; + }); + } + } else { + event.stopPropagation(); + const params = { + sant_id: santData.id, + }; + this.httpRequestService.post(api.followSant, params).then(() => { + this.santList[index].is_user_following = !this.santList[index].is_user_following; + }); + } + } + + async santBackInfo(e: Event, message: string) { + e.stopPropagation(); + const alert = await this.alertController.create({ + message: '' + + '

' + message + '

', + cssClass: 'sant sent-back-info', + mode: 'md', + buttons: [{ + text: 'GOT IT', + cssClass: 'si' + }] + }); + await alert.present(); + } +} diff --git a/src/app/pages/sant/vihar-info/vihar-info.page.html b/src/app/pages/sant/vihar-info/vihar-info.page.html new file mode 100644 index 0000000..df30386 --- /dev/null +++ b/src/app/pages/sant/vihar-info/vihar-info.page.html @@ -0,0 +1,125 @@ + + + + + + Vihaar information + + + + + + Upcoming + + + Completed + + +
+
+

+ +

No upcoming Vihaar. If you know, please add as it will benefit all Shravaks.

+

+ + + + +
+ + + + + + +

From

+
{{ vihar.from }}
+

{{ vihar.start_date | date: 'dd-MM-yyyy' }} | {{ formatAMPM(vihar.start_time) }}

+
+
+ + +
+

To

+
{{ vihar.to }}
+
+
+ +
+ +
+

Edit by: {{ vihar.updated_by.name }}

+

{{ vihar.updated_ago }}

+
+
+

Contact: {{ + vihar?.updated_by?.country_code }}{{ vihar?.updated_by?.hide_mobile }} +

+
+
+

Added by: {{ vihar?.created_by?.name ? vihar?.created_by?.name : 'Global Jain Member' }}

+

{{ vihar.created_ago }}

+
+
+

Contact: {{ + vihar?.created_by?.country_code }}{{ vihar?.created_by?.hide_mobile }} +

+
+
+
+ + + + +
+
+

+

No past Vihaar details found

+

+ + + + +
+

From

+
{{ vihar.from }}
+

{{ vihar.start_date | date: 'dd-MM-yyyy' }} | {{ formatAMPM(vihar.start_time) }}

+
+
+ + +
+

To

+
{{ vihar.to }}
+
+
+
+ +
+

Edit by: {{ vihar.updated_by.name }}

+

{{ vihar.updated_ago }}

+
+
+

Added by: {{ vihar?.created_by?.name ? vihar?.created_by?.name : 'Global Jain Member' }}

+

{{ vihar.created_ago }}

+
+
+
+ + + + +
+
+ + + + + +
diff --git a/src/app/pages/sant/vihar-info/vihar-info.page.scss b/src/app/pages/sant/vihar-info/vihar-info.page.scss new file mode 100644 index 0000000..2b4b253 --- /dev/null +++ b/src/app/pages/sant/vihar-info/vihar-info.page.scss @@ -0,0 +1,231 @@ +app-vihar-info { + ion-content { + ion-segment { + padding: var(--ion-padding-10); + background: var(--ion-color-white); + margin-top: var(--ion-margin-15); + + ion-segment-button { + min-height: 30px; + --indicator-height: 0; + background: #efefef; + text-transform: capitalize; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + letter-spacing: 0; + } + + &.segment-button-checked { + border-radius: 5px; + background: var(--ion-color-sant); + color: #fff; + + ion-label { + color: #fff; + } + } + + &:first-child { + border-radius: 8px 0 0 8px; + + &.segment-button-checked { + border-radius: 5px; + } + } + + &:last-child { + border-radius: 0 8px 8px 0; + + &.segment-button-checked { + border-radius: 5px; + } + } + } + } + + h3 { + p { + color: var(--ion-color-sant); + margin-top: var(--ion-margin-10); + } + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + + ion-card-header { + padding: var(--ion-padding-15) var(--ion-padding-10); + position: relative; + + ion-card-title { + margin-bottom: var(--ion-margin-25); + display: flex; + + h5 { + margin: var(--ion-margin-0) var(--ion-margin-0) 5px var(--ion-margin-0); + } + + p { + padding: var(--ion-padding-0); + font-size: var(--ion-font-size-12); + font-weight: 500; + margin-bottom: 5px; + } + + ion-icon { + width: 23px; + height: 23px; + padding: 3px; + background: var(--ion-background-content-sant); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color-sant); + margin-right: var(--ion-margin-10); + position: relative; + contain: inherit; + } + + &:last-child { + ion-icon { + &:before { + display: none; + } + } + + margin-bottom: var(--ion-margin-0); + } + + ion-button { + margin: var(--ion-margin-0); + position: absolute; + right: 35px; + height: auto; + top: -10px; + + &::part(native) { + --background: none; + padding: var(--ion-padding-0); + box-shadow: none; + } + + ion-icon { + margin: var(--ion-margin-0); + } + + &.ion-activated { + &::part(native) { + --background-activated: none; + } + } + + &.delete { + right: 0; + + ion-icon { + color: red; + background: var(--ion-background-content); + } + } + } + + &:first-child { + &:before { + position: absolute; + content: ""; + width: 1px; + height: 150%; + top: 0; + left: 14px; + border-left: 1px dashed var(--ion-content-color-sant); + z-index: 0; + } + } + + .right-data { + width: calc(100% - 40px); + } + } + + .live-label { + background: var(--ion-color-sant); + color: var(--ion-color-white); + padding: 3px 5px 3px 18px; + position: absolute; + top: 50px; + right: 0; + font-size: 12px; + + &::before { + content: ""; + position: absolute; + left: 0; + transform: rotate(225deg); + top: 20px; + width: 15px; + height: 15px; + border-top: 15px var(--ion-color-white) solid; + transform-origin: top left; + } + } + } + + ion-card-content { + border-top: 1px solid #efefef; + padding: var(--ion-padding-10); + + div { + display: flex; + justify-content: space-between; + } + + p { + padding: var(--ion-padding-0); + font-size: var(--ion-font-size-14); + + span { + color: var(--ion-color-sant); + } + } + + .contact-icon { + ion-icon { + margin-left: 10px; + } + } + } + } + } + + ion-fab { + width: 46px; + height: 46px; + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10) 0; + + ion-fab-button { + width: 100%; + height: 100%; + + &::part(native) { + --background: var(--ion-color-sant); + } + } + } + } +} + +ion-modal { + ion-item::part(detail-icon) { + display: none; + } +} \ No newline at end of file diff --git a/src/app/pages/sant/vihar-info/vihar-info.page.ts b/src/app/pages/sant/vihar-info/vihar-info.page.ts new file mode 100644 index 0000000..57faada --- /dev/null +++ b/src/app/pages/sant/vihar-info/vihar-info.page.ts @@ -0,0 +1,184 @@ +import { DatePipe, NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IonDatetime, IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-vihar-info', + templateUrl: './vihar-info.page.html', + styleUrls: ['./vihar-info.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgSwitch, NgSwitchCase, NgIf, NgFor, DatePipe] +}) +export class ViharInfoPage implements OnInit { + @ViewChild(IonDatetime, { static: true }) datetime: IonDatetime; + santId = '1'; + upcomingPageNumber = 1; + upcomingTotalPage = 1; + upcomingViharList = []; + pastPageNumber = 1; + pastTotalPage = 1; + pastViharList = []; + viharId = ''; + isPastVihar = 'upcoming'; + noUpcomingFlag: boolean; + noPastFlag: boolean; + thanaMemberCount: string; + constructor( + private httpRequestService: HttpRequestService, + private activatedRoute: ActivatedRoute, + private stateManagementService: StateManagementService, + private navCtrl: NavController, + private router: Router, + private utilityService: UtilityService + ) { } + + ngOnInit() { + this.thanaMemberCount = this.router.getCurrentNavigation().extras.state?.thanaMemberCount; + this.santId = this.activatedRoute.snapshot.paramMap.get('santId'); + } + + ionViewWillEnter() { + this.upcomingPageNumber = 1; + this.upcomingTotalPage = 1; + this.upcomingViharList = []; + this.pastPageNumber = 1; + this.pastTotalPage = 1; + this.pastViharList = []; + this.getUpcomingViharList(false, ''); + this.getPastViharList(false, ''); + } + + loadUpcomingData($event) { + this.getUpcomingViharList(true, $event); + } + + getUpcomingViharList(isFirstLoad, event) { + if (this.upcomingPageNumber <= this.upcomingTotalPage) { + this.httpRequestService.get(api.viharList, { + sant_id: this.santId, + page: this.upcomingPageNumber + }).then((res: any) => { + this.upcomingTotalPage = res.data.last_page; + this.noUpcomingFlag = true; + this.upcomingViharList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.upcomingPageNumber++; + }); + } else { + event.target.complete(); + } + } + + loadPastData($event) { + this.getPastViharList(true, $event); + } + + getPastViharList(isFirstLoad, event) { + if (this.pastPageNumber <= this.pastTotalPage) { + this.httpRequestService.get(api.pastViharList, { + sant_id: this.santId, + page: this.pastPageNumber + }).then((res: any) => { + this.pastTotalPage = res.data.last_page; + this.noPastFlag = true; + this.pastViharList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pastPageNumber++; + }); + } else { + event.target.complete(); + } + } + + isStarted(date, time): boolean { + const fullDate = new Date(date); + fullDate.setHours(time.slice(0, 2), time.slice(3, 5)); + return fullDate.toISOString() <= new Date().toISOString(); + } + + onAddVihar() { + const componentProps = { + viharFromPlace: '', + viharToPlace: '', + startDate: '', + endDate: '', + startTime: '05:00', + isUpdate: false, + santId: this.santId, + from_latitude: '', + from_longitude: '', + to_latitude: '', + to_longitude: '', + thanaMemberCount: this.thanaMemberCount, + to_sangh_id: null, + from_sangh_id: null + }; + this.stateManagementService.viharInfo = componentProps; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.viharModal); + } + + onUpdateVihar(vihar) { + this.viharId = vihar.id; + const componentProps = { + viharFromPlace: vihar.from, + viharToPlace: vihar.to, + startDate: vihar.start_date, + endDate: vihar.end_date, + startTime: vihar.start_time, + isUpdate: true, + santId: this.santId, + viharId: this.viharId, + from_latitude: vihar.from_latitude, + from_longitude: vihar.from_longitude, + to_latitude: vihar.to_latitude, + to_longitude: vihar.to_longitude, + thanaMemberCount: this.thanaMemberCount, + to_sangh_id: vihar.to_sangh_id, + from_sangh_id: vihar.from_sangh_id + }; + this.stateManagementService.viharInfo = componentProps; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.viharModal); + } + + formatAMPM(date) { + let hours = date.slice(0, 2); + const minutes = date.slice(3, 5); + const ampm = hours >= 12 ? 'pm' : 'am'; + hours = hours % 12; + hours = hours ? hours : 12; + const strTime = hours + ':' + minutes + ' ' + ampm; + return strTime; + } + + makeCall(contactNumber) { + window.open('tel:' + contactNumber); + } + + async deleteVihaar(vihaarData: any, index: number) { + const isYes = await this.utilityService.presentConfirm( + 'Vihaar will be deleted for all Thanas', + 'Cancel', 'Confirm', 'Delete Vihaar' + ); + if (isYes) { + this.httpRequestService.delete(api.deleteVihaar.replace('{id}', String(vihaarData.id))) + .then(() => { + this.upcomingViharList.splice(index, 1); + }); + } + } + + address(element, type) { + if (type === 'from') { + this.utilityService.openGoogleMap(element.from_latitude, element.from_longitude); + } else if (type === 'to') { + this.utilityService.openGoogleMap(element.to_latitude, element.to_longitude); + } + } +} diff --git a/src/app/pages/sant/vihar-modal/vihar-modal.page.html b/src/app/pages/sant/vihar-modal/vihar-modal.page.html new file mode 100644 index 0000000..6da442b --- /dev/null +++ b/src/app/pages/sant/vihar-modal/vihar-modal.page.html @@ -0,0 +1,157 @@ + + + + + + {{ title }} Vihaar + + + +
+

Sant name

+

{{ stateManagementService?.santDetails?.name }}

+

Vihaar details

+

+ 1) Only Daily Vihaar entry allowed
+ 2) Only Two Vihaar entry per day allowed
+ 3) Vihaar can be added upto 15 days
+ 4) Vihaar will be applicable to all Thana's +

+
+ + + +
+ + + +
+ + + + + +
+ + + +
+ + + +
+ + {{startDateValue ? (startDateValue | date: 'dd-MM-yyyy') : + 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + + +
+ +
+ + {{ startTime }} + + + + + + + +
+
+
+

+ + +

+

+ + +

+
+ + {{ title }} Vihaar + + + + + + + {{ item.label }} + + + + + + + + + + + + + {{ message }} + + diff --git a/src/app/pages/sant/vihar-modal/vihar-modal.page.scss b/src/app/pages/sant/vihar-modal/vihar-modal.page.scss new file mode 100644 index 0000000..730b4ab --- /dev/null +++ b/src/app/pages/sant/vihar-modal/vihar-modal.page.scss @@ -0,0 +1,287 @@ +app-vihar-modal { + ion-header { + background: var(--ion-background-content); + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 48%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: var(--ion-color-sant); + } + } + } + + ion-list { + padding: var(--ion-padding-0) !important; + + ion-item { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-avatar { + width: 50px; + height: 50px; + margin: var(--ion-margin-0); + position: relative; + + img { + background: #e2f0ff; + } + + .thana-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 0; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + width: 20px; + height: 20px; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + } + } + + ion-checkbox { + margin: var(--ion-margin-0); + width: 21px; + height: 21px; + + &::part(container) { + border-radius: 5px; + --border-width: 1px; + padding: 2px; + width: 21px; + height: 21px; + } + + &.ion-color-primary { + --ion-color-base: var(--ion-color-sant) !important; + } + } + + ion-label { + display: flex !important; + align-items: center; + margin: var(--ion-margin-0); + + h3 { + margin: var(--ion-margin-0) !important; + font-weight: 600 !important; + white-space: normal; + width: calc(100% - 50px); + + p { + font-weight: 400; + color: #999; + font-size: var(--ion-font-size-14) !important; + line-height: 13px !important; + padding: var(--ion-padding-0); + } + } + + ion-icon { + font-size: 18px; + } + } + } + } + + ion-radio-group { + display: flex; + + ion-item { + margin: var(--ion-margin-0); + --min-height: inherit; + + ion-label { + margin: var(--ion-margin-0); + } + + ion-radio { + margin-right: var(--ion-margin-10); + --color-checked: var(--ion-color-sant) !important; + + &::part(container) { + --border-width: 1px; + border-color: var(--ion-color-sant); + } + + &.radio-checked { + --color-checked: var(--ion-color-sant) !important; + } + } + } + } + } + + h3 { + color: var(--ion-color-sant); + padding: var(--ion-padding-10) var(--ion-padding-15); + margin: var(--ion-margin-0); + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0; + color: var(--ion-content-color); + + &.agreed-content { + display: flex; + + ion-label { + padding-left: var(--ion-padding-10); + width: calc(100% - 28px); + } + + ion-checkbox { + &.checkbox-checked { + --checkbox-background-checked: var(--ion-color-sant); + --border-color-checked: var(--ion-color-sant); + } + } + } + } + + input[type="text"] { + padding: var(--ion-padding-15) !important; + font-size: var(--ion-font-size-14) !important; + border: 1px solid var(--ion-content-color-sant); + border-radius: 0.25rem; + height: 2.813rem; + width: 100%; + background: transparent; + } + + .start-end-date { + display: flex; + } + + ion-input[type=date], + ion-input { + padding: var(--ion-padding-0) !important; + border-color: var(--ion-content-color-sant); + } + + ion-text { + border-color: var(--ion-content-color-sant) !important; + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + .back-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } +} + +.add-edit-vihar-alert { + .alert-title { + margin: 5px auto !important; + } + + .alert-sub-title { + color: initial; + } + + .alert-head { + padding: 5px !important; + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --height: auto; + --border-radius: 8px; + } + + ion-datetime { + height: auto; + } + + ionic-selectable-modal { + ion-header { + ion-toolbar { + ion-buttons { + ion-button::part(native) { + --background: var(--ion-color-sant) + } + } + } + } + + ion-title { + color: var(--ion-color) !important; + } + + .searchbar-input-container { + .searchbar-input { + border-radius: inherit; + } + + .searchbar-clear-icon { + color: var(--clear-button-color); + margin-right: 0; + } + } + + ion-content { + ion-list { + padding-top: 10px; + + ion-item-group { + ion-item { + + ion-icon { + &.ion-color-primary { + --ion-color-base: var(--ion-color-sant) !important; + } + } + + ion-label { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10); + } + } + } + } + } + } +} + +.sangh-avatar { + width: 36px; + min-width: 36px; + height: 36px; +} \ No newline at end of file diff --git a/src/app/pages/sant/vihar-modal/vihar-modal.page.ts b/src/app/pages/sant/vihar-modal/vihar-modal.page.ts new file mode 100644 index 0000000..f59cd81 --- /dev/null +++ b/src/app/pages/sant/vihar-modal/vihar-modal.page.ts @@ -0,0 +1,339 @@ +import { DatePipe, NgFor, NgIf, NgTemplateOutlet, TitleCasePipe } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableItemTemplateDirective } from '@components/ionic-selectable/ionic-selectable-item-template.directive'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { IdName, SanghData } from '@interfaces/common'; +import { ViharInfoForm } from '@interfaces/form'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; + +enum ADDRESS_TYPE { + Location = 1, + Sangh = 2 +} + +@Component({ + selector: 'app-vihar-modal', + templateUrl: './vihar-modal.page.html', + styleUrls: ['./vihar-modal.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgTemplateOutlet, NgIf, GjDatetimeDirective, NgFor, TitleCasePipe, + DatePipe, IonicSelectableComponent, IonicSelectableItemTemplateDirective] +}) +export class ViharModalPage implements OnInit { + @ViewChild('fromLocation') fromLocation: ElementRef; + @ViewChild('toLocation') toLocation: ElementRef; + @ViewChild('sanghListComponent') sanghListComponent: IonicSelectableComponent; + viharInfoForm: FormGroup; + title: string; + currentDate = this.formatDate((new Date()).toISOString()); + currentTime: string; + nextDate: string; + startTime: string; + thanaFlag: boolean; + pageNumber = 1; + totalPage = 1; + thanaList: any[] = []; + firstConfirmationFlag = false; + secondConfirmationFlag = false; + startDateValue = ''; + fromLatitude: string; + fromLongitude: string; + toLatitude: string; + toLongitude: string; + fromAddressType: ADDRESS_TYPE = ADDRESS_TYPE.Sangh; + toAddressType: ADDRESS_TYPE = ADDRESS_TYPE.Sangh; + sanghList: Array = []; + fromSelectedSangh: IdName = null; + toSelectedSangh: IdName = null; + sanghPageNumber = 1; + sanghTotalPages = 1; + sanghSearchText = ''; + prevValue: string; + + constructor( + public stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + private navCtrl: NavController, + public alertController: AlertController, + public utilityService: UtilityService + ) { } + + ngOnInit() { + this.nextDate = this.formatDate(new Date((new Date()).setDate((new Date()).getDate() + 15)).toISOString()); + this.title = this.stateManagementService?.viharInfo?.isUpdate ? 'Update' : 'Add'; + this.currentTime = `2012-12-15T${this.stateManagementService?.viharInfo?.startTime}:20.789`; + this.startTime = this.formatTime(this.currentTime); + this.startDateValue = this.stateManagementService?.viharInfo?.startDate; + this.fromLatitude = this.stateManagementService?.viharInfo?.from_latitude; + this.fromLongitude = this.stateManagementService?.viharInfo?.from_longitude; + this.toLatitude = this.stateManagementService?.viharInfo?.to_latitude; + this.toLongitude = this.stateManagementService?.viharInfo?.to_longitude; + this.viharInfoForm = new FormGroup({ + viharFromPlace: new FormControl(this.stateManagementService?.viharInfo?.viharFromPlace, Validators.required), + viharToPlace: new FormControl(this.stateManagementService?.viharInfo?.viharToPlace, Validators.required), + startDate: new FormControl(this.stateManagementService?.viharInfo?.startDate || null, Validators.required), + startTime: new FormControl(this.currentTime, Validators.required), + }); + + if (this.stateManagementService?.viharInfo?.from_sangh_id) { + this.fromAddressType = ADDRESS_TYPE.Sangh; + this.fromSelectedSangh = { + id: this.stateManagementService?.viharInfo?.from_sangh_id, + name: this.stateManagementService?.viharInfo?.viharFromPlace, + }; + this.viharInfoForm.controls.viharFromPlace.setValue(this.fromSelectedSangh.name); + } + if (this.stateManagementService?.viharInfo?.to_sangh_id) { + this.toAddressType = ADDRESS_TYPE.Sangh; + this.toSelectedSangh = { + id: this.stateManagementService?.viharInfo?.to_sangh_id, + name: this.stateManagementService?.viharInfo?.viharToPlace, + }; + this.viharInfoForm.controls.viharToPlace.setValue(this.toSelectedSangh.name); + } + this.getThanaList(false, ''); + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + formatTime(value) { + return format(parseISO(value), 'hh:mm a'); + } + + formatFullTime(value) { + return format(parseISO(value), 'HH:mm'); + } + + initAutocompleteStartPlace(): void { + this.utilityService.createAutocomplete(this.fromLocation.nativeElement).subscribe((details) => { + this.viharInfoForm.controls.viharFromPlace.setValue(this.fromLocation.nativeElement.value); + this.fromLatitude = details.geometry.location.lat(); + this.fromLongitude = details.geometry.location.lng(); + }); + } + + removeLatAndLongStartPlace() { + this.fromLatitude = ''; + this.fromLongitude = ''; + } + + initAutocompleteEndPlace(): void { + this.utilityService.createAutocomplete(this.toLocation.nativeElement).subscribe((details) => { + this.viharInfoForm.controls.viharToPlace.setValue(this.toLocation.nativeElement.value); + this.toLatitude = details.geometry.location.lat(); + this.toLongitude = details.geometry.location.lng(); + }); + } + + removeLatAndLongEndPlace() { + this.toLatitude = ''; + this.toLongitude = ''; + } + + async submitData(form) { + this.viharInfoForm.markAllAsTouched(); + if (this.viharInfoForm.invalid) { return; } + + const formData = new FormData(); + formData.append('from', form.value.viharFromPlace); + formData.append('to', form.value.viharToPlace); + formData.append('start_date', this.formatDate(new Date(form?.value?.startDate).toISOString())); + formData.append('start_time', this.formatFullTime(form?.value?.startTime)); + formData.append('sant_id', this.stateManagementService?.viharInfo?.santId); + formData.append('from_latitude', this.fromLatitude); + formData.append('from_longitude', this.fromLongitude); + formData.append('to_latitude', this.toLatitude); + formData.append('to_longitude', this.toLongitude); + if (this.fromAddressType === ADDRESS_TYPE.Sangh) { + formData.append('from_sangh_id', this.fromSelectedSangh.id.toString()); + } + if (this.toAddressType === ADDRESS_TYPE.Sangh) { + formData.append('to_sangh_id', this.toSelectedSangh.id.toString()); + } + + if (this.stateManagementService?.viharInfo?.isUpdate) { + this.updateVihar(formData); + } else { + this.addVihar(formData); + } + } + + addVihar(params) { + this.presentAlertPrompt('add', params); + } + + updateVihar(params) { + this.presentAlertPrompt('update', params); + } + + getThanaList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.santThanaList, { + sant_id: Number(this.stateManagementService?.viharInfo?.santId), + page: this.pageNumber + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.thanaList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + moveToVihar() { + this.navCtrl.navigateBack( + Roots.page + '/' + + Roots.viharInfo.replace(':santId', String(this.stateManagementService?.viharInfo?.santId)) + ); + } + + ionViewWillEnter() { + this.getSanghList(); + } + + ionViewWillLeave() { + this.viharInfoForm.reset(); + } + + async presentAlert() { + const message = +this.stateManagementService.viharInfo.thanaMemberCount > 0 ? + `Thank you for submitting vihaar, On completion of vihaar. + you will be awarded karmā points. Vihar will be applicable to all Thana(s).` : + `Thank you for submitting vihaar, On completion of vihaar. + you will be awarded karmā points`; + const alert = await this.alertController.create({ + cssClass: 'vihar-approval', + backdropDismiss: false, + message, + buttons: [{ + text: 'Ok', + handler: () => { + this.moveToVihar(); + } + }] + }); + await alert.present(); + } + + async presentAlertPrompt(type: string, params) { + const alert = await this.alertController.create({ + mode: 'ios', + cssClass: 'add-edit-vihar-alert', + header: 'Confirm', + subHeader: 'Are you sure that all information is correct?', + message: 'Vihaar will be applicable to all Thana\'s', + buttons: [ + { + text: 'Yes', + handler: () => { + if (type === 'add') { + if (!(this.firstConfirmationFlag && this.secondConfirmationFlag)) { + return; + } + this.httpRequestService.post(api.addVihar, params).then(() => { + this.presentAlert(); + }); + } else if (type === 'update') { + if (!(this.firstConfirmationFlag && this.secondConfirmationFlag)) { + return; + } + this.httpRequestService.post( + api.updateVihar + '/' + this.stateManagementService?.viharInfo?.viharId, params + ) + .then(() => { + this.moveToVihar(); + }); + } + } + }, { + text: 'No', + role: 'cancel', + cssClass: 'secondary', + } + ] + }); + + await alert.present(); + } + + searchSangh(event: { component: IonicSelectableComponent; text: string }) { + this.sanghSearchText = event.text; + const isSameStr = this.utilityService.isSameStr(this.sanghSearchText, this.prevValue); + this.prevValue = this.sanghSearchText; + if (!isSameStr) { + this.sanghPageNumber = 1; + this.sanghList = []; + event.component.showLoading(); + this.getSanghList().then(() => { + event.component.hideLoading(); + }); + } + } + + getSanghList() { + return this.httpRequestService.get(api.sanghSearchList, { + name: this.sanghSearchText.trim(), + page: this.sanghPageNumber, + limit: 15 + }).then((res: any) => { + this.sanghList.push(...res.data.data); + this.sanghTotalPages = res.data.last_page; + }); + } + + addSangh(sangh, type: 'from' | 'to') { + if (type === 'from') { + this.fromSelectedSangh = { + id: sangh.value.id, + name: sangh.value.name + }; + this.viharInfoForm.controls.viharFromPlace.setValue(sangh.value.name); + } else { + this.toSelectedSangh = { + id: sangh.value.id, + name: sangh.value.name + }; + this.viharInfoForm.controls.viharToPlace.setValue(sangh.value.name); + } + this.sanghList = []; + this.sanghListComponent.searchText = ''; + this.sanghSearchText = ''; + this.sanghPageNumber = 1; + this.getSanghList(); + } + + updateAddressType(event, type: 'from' | 'to') { + if (type === 'from') { + this.viharInfoForm.controls.viharFromPlace.setValue(''); + this.fromAddressType = event.detail.value; + this.fromSelectedSangh = null; + } else { + this.viharInfoForm.controls.viharToPlace.setValue(''); + this.toAddressType = event.detail.value; + this.toSelectedSangh = null; + } + } + + getMoreSangh(event: { component: IonicSelectableComponent; text: string }) { + if (this.sanghPageNumber >= this.sanghTotalPages) { + event.component.disableInfiniteScroll(); + return; + } + this.sanghPageNumber++; + this.getSanghList().then(() => { + event.component.endInfiniteScroll(); + }); + } +} diff --git a/src/app/pages/settings/blocked-users/blocked-users.page.html b/src/app/pages/settings/blocked-users/blocked-users.page.html new file mode 100644 index 0000000..e65dd78 --- /dev/null +++ b/src/app/pages/settings/blocked-users/blocked-users.page.html @@ -0,0 +1,35 @@ + + + + + + Blocked Users + + + + + + + + + + + + +

{{ item.user.name }}

+
+ + + Unblock + + +
+
+ +

No data found

+
+ + + + +
\ No newline at end of file diff --git a/src/app/pages/settings/blocked-users/blocked-users.page.scss b/src/app/pages/settings/blocked-users/blocked-users.page.scss new file mode 100644 index 0000000..01f2728 --- /dev/null +++ b/src/app/pages/settings/blocked-users/blocked-users.page.scss @@ -0,0 +1,12 @@ +ion-chip { + background: var(--ion-color); + padding: 5px; + height: auto; + margin: 0; + border-radius: 5px; + color: #fff; + + ion-label { + font-size: var(--ion-font-size-12) !important; + } +} \ No newline at end of file diff --git a/src/app/pages/settings/blocked-users/blocked-users.page.ts b/src/app/pages/settings/blocked-users/blocked-users.page.ts new file mode 100644 index 0000000..0a46ae7 --- /dev/null +++ b/src/app/pages/settings/blocked-users/blocked-users.page.ts @@ -0,0 +1,77 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { BlockedUser, CommonResponse } from '@interfaces/common'; +import { IonicModule } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-blocked-users', + templateUrl: './blocked-users.page.html', + styleUrls: ['./blocked-users.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor] +}) +export class BlockedUsersPage implements OnInit { + users: Array = []; + page = Number(1); + lastPage = Number(0); + loader = Boolean(false); + + constructor( + private httpRequestService: HttpRequestService, + private utilityService: UtilityService, + private alert: AlertService + ) { } + + ngOnInit() { + this.fetchBlockedUsers(); + } + + loadData(event: any) { + if (this.page === this.lastPage) { + event.target.disabled = true; + return; + } + this.page++; + this.fetchBlockedUsers().then(() => { + event.target.complete(); + }); + } + + fetchBlockedUsers() { + if (this.page === 1) { + this.loader = true; + } + return this.httpRequestService.get(api.getBlockedUsers, { + page: this.page + }).then((res: CommonResponse) => { + this.users = this.page === 1 ? res.data.data : this.users.concat(res.data.data); + this.lastPage = res.data.last_page; + }).finally(() => { + this.loader = false; + }); + } + + async unblock(id: number) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to unblock this user?' + ); + if (isYes) { + this.alert.showLoader(); + this.httpRequestService.post(api.blockThisUser, { + id, + status: 0 + }) + .then((res: CommonResponse) => { + this.users.splice(this.users.findIndex(i => i.user_id === id), 1); + this.alert.showToaster(res.message); + }).finally(() => { + this.alert.hideLoader(); + }); + } + } + +} diff --git a/src/app/pages/settings/settings.page.html b/src/app/pages/settings/settings.page.html new file mode 100644 index 0000000..e27c981 --- /dev/null +++ b/src/app/pages/settings/settings.page.html @@ -0,0 +1,23 @@ + + + + + + Settings + + + + + + + + Blocked Users + + + + + Delete Account + + + + diff --git a/src/app/pages/settings/settings.page.scss b/src/app/pages/settings/settings.page.scss new file mode 100644 index 0000000..a81ef2a --- /dev/null +++ b/src/app/pages/settings/settings.page.scss @@ -0,0 +1,31 @@ +ion-list { + margin: var(--ion-margin-15); + padding: var(--ion-padding-0); + box-shadow: 0px 0px 12px #ebebeb; + border-radius: 8px; + + ion-item { + font-size: var(--ion-font-size-14); + margin-bottom: var(--ion-margin-0); + align-items: flex-end; + + ion-icon { + font-size: var(--ion-font-size-14); + } + + ion-label { + display: flex; + align-items: center; + + ion-icon { + width: 21px; + height: 21px; + padding: 5px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/settings/settings.page.ts b/src/app/pages/settings/settings.page.ts new file mode 100644 index 0000000..f6863c8 --- /dev/null +++ b/src/app/pages/settings/settings.page.ts @@ -0,0 +1,80 @@ +import { Component } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse } from '@interfaces/common'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-settings', + templateUrl: './settings.page.html', + styleUrls: ['./settings.page.scss'], + standalone: true, + imports: [IonicModule] +}) +export class SettingsPage { + + constructor( + private navController: NavController, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private alertController: AlertController, + private utilityService: UtilityService + ) { } + + goToBlockedUsers() { + this.navController.navigateForward([Roots.page + '/' + Roots.settings + '/' + Roots.blockedUsers]); + } + + async deleteAccount() { + const header = 'Delete User Account'; + const message = `Once you delete your account, all of your information on Global Jain will be lost forever. + We will not be able to restore your account. + Are you sure you want to proceed?`; + const isYes = await this.utilityService.presentConfirm( + message, + 'No', 'Yes', header + ); + if (isYes) { + this.deleteConfirm(); + } + } + + async deleteConfirm() { + const header = 'Delete User Account'; + const message = 'Are you sure about delete your account?'; + const isYes = await this.utilityService.presentConfirm( + message, + 'No', 'Yes', header + ); + if (isYes) { + this.alert.showLoader(); + this.httpRequestService.post(api.deleteUserAccount + '?t=1', {}).then((res: CommonResponse) => { + this.utilityService.logout(); + this.alert.showToaster(res.message); + this.alert.hideLoader(); + }).catch((err) => { + this.alert.hideLoader(); + if (err.error && err.error.status === 403) { + this.deleteInfoPopup(err.error.message); + } + }); + } + } + + async deleteInfoPopup(message) { + const alert = await this.alertController.create({ + cssClass: 'chaturmas-approval', + backdropDismiss: false, + message, + buttons: [{ + text: 'Ok', + role: 'cancel' + }] + }); + await alert.present(); + } + +} diff --git a/src/app/pages/shravak/friend-list/friend-list.page.html b/src/app/pages/shravak/friend-list/friend-list.page.html new file mode 100644 index 0000000..4779fba --- /dev/null +++ b/src/app/pages/shravak/friend-list/friend-list.page.html @@ -0,0 +1,62 @@ + + + + + + My connections + + + +
+ + + +
+
+ + + + +
+
+

{{friend.name}}

+ + + Connected + + + + + Connect + + + + + Requested + + + + + Respond + + +
+
+
+
+ +

+

No data found

+

+
+
+ + + + +
+
diff --git a/src/app/pages/shravak/friend-list/friend-list.page.scss b/src/app/pages/shravak/friend-list/friend-list.page.scss new file mode 100644 index 0000000..53914b2 --- /dev/null +++ b/src/app/pages/shravak/friend-list/friend-list.page.scss @@ -0,0 +1,109 @@ +app-friend-list { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + --padding-top: var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15) var(--ion-margin-0); + box-shadow: none; + border-radius: 8px; + box-shadow: 2px 2px 7px #ebebeb; + + ion-card-header { + padding: var(--ion-padding-0); + + h3 { + p { + color: var(--ion-color); + text-transform: uppercase; + } + } + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin: var(--ion-margin-0); + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + .left-data { + display: flex; + align-items: center; + width: 100%; + + .icons { + color: var(--ion-color); + margin-right: var(--ion-margin-10); + position: relative; + + span { + overflow: hidden; + width: 50px; + height: 50px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + } + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 2px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + + &.heart { + color: #f00; + } + } + } + + .content { + width: calc(100% - 60px); + display: flex; + justify-content: space-between; + align-items: center; + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + max-width: 70%; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + display: block; + } + } + + ion-chip { + padding: 5px; + height: auto; + margin: 0; + background: var(--ion-color); + color: #fff; + font-size: var(--ion-font-size-12); + border-radius: 5px; + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/friend-list/friend-list.page.ts b/src/app/pages/shravak/friend-list/friend-list.page.ts new file mode 100644 index 0000000..9586bef --- /dev/null +++ b/src/app/pages/shravak/friend-list/friend-list.page.ts @@ -0,0 +1,112 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, GlobalSearchDataShravak, UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-friend-list', + templateUrl: './friend-list.page.html', + styleUrls: ['./friend-list.page.scss'], + standalone: true, + imports: [IonicModule, NgFor, NgIf] +}) +export class FriendListPage implements OnInit { + friendList = []; + pageNumber = 1; + totalPage = 1; + noDataFlag: boolean; + userData: UserData; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private cRoute: ActivatedRoute, + private utilityService: UtilityService, + private navCtrl: NavController, + private stateManagementService: StateManagementService + ) { } + + ngOnInit() { + this.getFriendList(false, ''); + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + loadData($event) { + this.getFriendList(true, $event); + } + + getFriendList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get( + api.userFriendList.replace('{id}', this.cRoute.snapshot.paramMap.get('id')), { + page: this.pageNumber, + limit: 15 + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.noDataFlag = true; + this.friendList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + sendConnectionRequest(id: number, data: GlobalSearchDataShravak) { + this.httpRequestService.post(api.connectionRequestSend, { receiver_id: id }) + .then((res: CommonResponse) => { + data.is_friends = 2; + this.alert.showToaster(res.message); + }); + } + + acceptDeclineRequest(id: number, data: GlobalSearchDataShravak, status: number, type?: number) { + if (status === 1) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status }) + .then((res: CommonResponse) => { + data.is_friends = 1; + this.alert.showToaster(res.message); + }); + } else { + this.confirmationAlert(id, data, type); + } + } + + async confirmationAlert(id, data: GlobalSearchDataShravak, type: number) { + let message = ''; + if (type === 2) { + message = 'Are you sure about to cancel this request?'; + } else if (type === 1) { + message = 'Are you sure you want to remove User ' + data.name + ' from your connection?'; + } + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status: 2 }) + .then((res: CommonResponse) => { + data.is_friends = 0; + this.alert.showToaster(res.message); + }); + } + } + + moveToProfile(id) { + if (id === this.userData.id) { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } else { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + } + +} diff --git a/src/app/pages/shravak/friend-request/friend-request.page.html b/src/app/pages/shravak/friend-request/friend-request.page.html new file mode 100644 index 0000000..464111f --- /dev/null +++ b/src/app/pages/shravak/friend-request/friend-request.page.html @@ -0,0 +1,157 @@ + + + All connections + + + + + + + Connected + + +
+ + Pending request +
+
+ + Sent + +
+
+ + + +
+
+ + + +
+
+

{{data.name}}

+

{{data.user_detail[0]?.location}}

+
+
+ + + + + + + Message + + + Disconnect + + + + + +
+ + + + +
+ + + + +

+

There are many connections / family member of yours on Global Jain platform. Please use Global Search / + suggestions to connect.

+

Best is to invite them and earm Karma points.

+

+
+

Connect suggestions View all

+ + +
+
+ + + +
+
+

{{data.name}}

+
+
+ + + Connect + + +
+
+
+ + + +
+
+ + + +
+
+

{{data.received_users.name}} Sent you a connection request.

+ Accept + Decline +
+
+
+
+ + + + +
+ +

+

There are no pending requests.

+

+
+
+ + + +
+
+
+
+

You sent a connection request to {{data.sent_users.name}}.

+
+
+
+ + + + +
+ +

+

There are no sending requests.

+

+
+
+
+
+ + + + + diff --git a/src/app/pages/shravak/friend-request/friend-request.page.scss b/src/app/pages/shravak/friend-request/friend-request.page.scss new file mode 100644 index 0000000..dc02319 --- /dev/null +++ b/src/app/pages/shravak/friend-request/friend-request.page.scss @@ -0,0 +1,265 @@ +app-friend-request { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + ion-segment { + display: flex; + padding: var(--ion-padding-10) 0; + background: var(--ion-color-white); + margin-top: var(--ion-margin-15); + + ion-segment-button { + min-height: 30px; + --indicator-height: 0; + background: #efefef; + text-transform: capitalize; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + letter-spacing: 0; + } + + &.segment-button-checked { + border-radius: 5px; + background: var(--ion-color); + color: #fff !important; + + ion-label { + color: #fff !important; + } + } + + &:first-child { + border-radius: 8px 0 0 8px; + + &.segment-button-checked { + border-radius: 5px; + + ion-label { + color: #fff !important; + } + } + } + + &:last-child { + border-radius: 0 8px 8px 0; + + &.segment-button-checked { + border-radius: 5px; + + ion-label { + color: #fff !important; + } + } + } + } + } + + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + border-radius: 0 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + h3 { + p { + color: var(--ion-color); + } + } + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin: var(--ion-margin-0); + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + .left-data { + display: flex; + align-items: center; + width: calc(100% - 30px); + + .icons { + color: var(--ion-color); + margin-right: var(--ion-margin-10); + position: relative; + + span { + overflow: hidden; + width: 50px; + height: 50px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + } + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + + &.heart { + color: #f00; + } + } + + div { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + width: 20px; + height: 20px; + box-shadow: 0px 0px 2px #000; + display: flex; + align-items: center; + justify-content: center; + + img { + width: auto; + height: 100%; + } + } + } + + .content { + width: calc(100% - 60px); + + ion-button { + height: 25px; + margin: var(--ion-margin-10) 4% 0 0; + width: 48%; + + &:last-child { + margin-right: 0; + } + + &::part(native) { + text-transform: capitalize; + } + + &.si { + &.reject-btn { + &::part(native) { + text-transform: capitalize; + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + font-weight: 400; + } + } + } + } + + &.unread { + background: var(--ion-background-content); + } + + ion-button { + max-width: 95px; + width: 100%; + height: 30px; + margin: 0; + + &::part(native) { + padding-top: 5px; + padding-bottom: 5px; + } + } + } + + &.friends-suggestions { + ion-card-title { + .left-data { + width: 100%; + + .content { + ion-button { + margin-top: 5px; + + &.reject { + &::part(native) { + --background: #ED5858; + } + } + } + } + } + } + } + } + + h3 { + &.title { + padding: 0 var(--ion-padding-10); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: space-between; + + span { + font-size: var(--ion-font-size-14); + color: #000; + } + } + } + } + } + + ion-footer { + height: 50px; + height: calc(env(safe-area-inset-bottom) + 60px); + + ion-tab-bar { + + &.ios { + padding: 0; + padding-bottom: calc(env(safe-area-inset-bottom) + 10px); + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/friend-request/friend-request.page.ts b/src/app/pages/shravak/friend-request/friend-request.page.ts new file mode 100644 index 0000000..a61d765 --- /dev/null +++ b/src/app/pages/shravak/friend-request/friend-request.page.ts @@ -0,0 +1,221 @@ +import { NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { FooterComponent } from '@components/footer/footer.component'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, FriendList, RequestUserList } from '@interfaces/common'; +import { IonicModule, NavController, PopoverController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-friend-request', + templateUrl: './friend-request.page.html', + styleUrls: ['./friend-request.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, NgSwitch, NgSwitchCase, NgFor, FooterComponent] +}) +export class FriendRequestPage implements OnInit, OnDestroy { + requestList: Array = []; + requestSentList: Array = []; + friendList: Array = []; + friendRequestSegment = 'friend'; + pageNumber = 1; + totalPage = 1; + totalCount: number; + spinnerFlag = false; + pageNumberRequestList = 1; + totalPageRequestList = 1; + totalCountRequestList: number; + noRequestListFlag: boolean; + pageNumberSentList = 1; + totalPageSentList = 1; + totalCountSentList: number; + noSentListFlag: boolean; + suggestedFriendList = []; + $subscription: Subscription; + hasNewPendingRequest = 0; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private ngZone: NgZone, + private utilityService: UtilityService, + private activatedRoute: ActivatedRoute, + private popoverCtrl: PopoverController, + private stateManagementService: StateManagementService, + private change: ChangeDetectorRef + ) { } + + ngOnInit() { + this.friendRequestSegment = this.activatedRoute?.snapshot?.paramMap?.get('friendRequestSegment') || 'friend'; + this.$subscription = this.stateManagementService.pushNotyObservable.subscribe(res => { + this.hasNewPendingRequest = res.pending_friend_request; + this.change.detectChanges(); + }); + } + + ionViewWillEnter() { + this.getSuggestionFriendList(); + this.getFriendList(false, ''); + } + + changeTab() { + if (this.friendRequestSegment === 'received') { + this.stateManagementService.generalData.pending_friend_request = 0; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + this.getRequestList(false, ''); + } else if (this.friendRequestSegment === 'sent') { + this.getRequestSentList(false, ''); + } + } + + getSuggestionFriendList() { + const params = { + page: 1, + limit: 10 + }; + this.httpRequestService.post(api.suggestionShravakList, params).then((res: any) => { + if (res.data && res.data.data) { + this.suggestedFriendList = res.data.data; + this.suggestedFriendList.forEach(el => el.isLoading = false); + } + }); + } + + getFriendList(isFirstLoad, event) { + this.spinnerFlag = false; + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get(api.myFriendList, { + page: this.pageNumber, + limit: 15 + }).then((res: CommonResponse) => { + this.totalPage = res.data.last_page; + this.totalCount = res.data.total; + this.friendList.push(...res.data.data); + this.spinnerFlag = true; + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + if (event) { + event.target.complete(); + } + this.spinnerFlag = true; + } + } + + loadFriendListData($event) { + this.getFriendList(true, $event); + } + + getRequestList(isFirstLoad, event) { + if (this.pageNumberRequestList <= this.totalPageRequestList) { + this.httpRequestService.get(api.myConnectionRequestList, { + page: this.pageNumberRequestList, + limit: 15 + }).then((res: CommonResponse) => { + this.totalPageRequestList = res.data.last_page; + this.noRequestListFlag = true; + this.totalCountRequestList = res.data.total; + this.requestList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumberRequestList++; + }); + } else { + if (event) { event.target.complete(); } + } + } + + loadRequestListData($event) { + this.getRequestList(true, $event); + } + + getRequestSentList(isFirstLoad, event) { + if (this.pageNumberSentList <= this.totalPageSentList) { + this.httpRequestService.get(api.myConnectionRequestSentList, { + page: this.pageNumberSentList, + limit: 15 + }).then((res: CommonResponse) => { + this.totalPageSentList = res.data.last_page; + this.noSentListFlag = true; + this.totalCountSentList = res.data.total; + this.requestSentList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumberSentList++; + }); + } else { + if (event) { event.target.complete(); } + } + } + + loadRequestSentListData($event) { + this.getRequestSentList(true, $event); + } + + sendConnectionRequest(id: number, actionStatus: number, index: number) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status: actionStatus }) + .then((res: CommonResponse) => { + this.requestList.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + + viewPublicProfile(id: number) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + + moveToMessage(data: FriendList) { + this.popoverCtrl.dismiss().then(() => { + this.ngZone.run(() => this.navCtrl.navigateForward([Roots.page + '/' + Roots.messageChat, { + userId: data.id, + name: data.name + }])).then(); + }); + } + + async confirmationAlert(data: FriendList, index: number) { + const message = 'Are you sure you want to remove User ' + data.name + ' from your connection?'; + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + this.popoverCtrl.dismiss().then(() => { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: data.id, status: 2 }) + .then((res: CommonResponse) => { + this.friendList.splice(index, 1); + this.alert.showToaster(res.message); + }); + }); + } + } + + moveToFriendsSuggestionsViewAll() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.friendsSuggestionsViewAll); + } + + sendFriendRequest(id: number, data: any, index: number) { + data.isLoading = true; + this.httpRequestService.post(api.connectionRequestSend, { receiver_id: id }) + .then((res: CommonResponse) => { + data.is_friends = 2; + this.suggestedFriendList.splice(index, 1); + data.isLoading = false; + this.alert.showToaster(res.message); + }).catch(() => { + data.isLoading = false; + }); + } + + searchFriend() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.searchFriend); + } + + ngOnDestroy() { + this.$subscription?.unsubscribe(); + } +} diff --git a/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.html b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.html new file mode 100644 index 0000000..9299d57 --- /dev/null +++ b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.html @@ -0,0 +1,33 @@ + + + + + + Connect suggestions + + + + + + +
+
+ + + +
+
+

{{data.name}}

+
+
+ Connect +
+
+
+ + + + +
diff --git a/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.scss b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.scss new file mode 100644 index 0000000..dc73774 --- /dev/null +++ b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.scss @@ -0,0 +1,132 @@ +app-friends-suggestions-view-all { + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + border-radius: 0 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + h3 { + p { + color: var(--ion-color); + text-transform: uppercase; + } + } + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin: var(--ion-margin-0); + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + .left-data { + display: flex; + align-items: center; + width: calc(100% - 30px); + + .icons { + color: var(--ion-color); + margin-right: var(--ion-margin-10); + position: relative; + + span { + overflow: hidden; + width: 50px; + height: 50px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + } + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + + &.heart { + color: #f00; + } + } + + div { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + width: 20px; + height: 20px; + box-shadow: 0px 0px 2px #000; + display: flex; + align-items: center; + justify-content: center; + + img { + width: auto; + height: 100%; + } + } + } + + .content { + width: calc(100% - 60px); + + ion-button { + height: 25px; + margin: var(--ion-margin-10) 4% 0 0; + width: 48%; + + &:last-child { + margin-right: 0; + } + + &::part(native) { + text-transform: capitalize; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + } + } + } + } + + &.unread { + background: var(--ion-background-content); + } + + ion-button { + height: auto; + margin: 0; + + &::part(native) { + padding-top: 5px; + padding-bottom: 5px; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.ts b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.ts new file mode 100644 index 0000000..2fcf0b1 --- /dev/null +++ b/src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.ts @@ -0,0 +1,66 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; + +@Component({ + selector: 'app-friends-suggestions-view-all', + templateUrl: './friends-suggestions-view-all.page.html', + styleUrls: ['./friends-suggestions-view-all.page.scss'], + standalone: true, + imports: [IonicModule, NgFor, NgIf] +}) +export class FriendsSuggestionsViewAllPage { + pageNumber = 1; + totalPage = 1; + totalCount: number; + suggestedFriendList = []; + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController + ) { } + + ionViewWillEnter() { + this.getSuggestionFriendList(false, ''); + } + + getSuggestionFriendList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.post(api.suggestionShravakList, { + page: this.pageNumber, + limit: 10 + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.totalCount = res.data.total; + this.suggestedFriendList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target.complete(); + } + } + + loadData($event) { + this.getSuggestionFriendList(true, $event); + } + + viewPublicProfile(id: number) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + + sendFriendRequest(id: number, data: any, index: number) { + this.httpRequestService.post(api.connectionRequestSend, { receiver_id: id }) + .then((res: CommonResponse) => { + data.is_friends = 2; + this.suggestedFriendList.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + +} diff --git a/src/app/pages/shravak/passive-user-education/passive-user-education.page.html b/src/app/pages/shravak/passive-user-education/passive-user-education.page.html new file mode 100644 index 0000000..f6ea718 --- /dev/null +++ b/src/app/pages/shravak/passive-user-education/passive-user-education.page.html @@ -0,0 +1,38 @@ + + + + + + Add child + + + +
+ + + + + + + + + +
+

Education

+
+ +
+ + +
+ +
+ More about user + +
+
+
+ + Back + Next + \ No newline at end of file diff --git a/src/app/pages/shravak/passive-user-education/passive-user-education.page.scss b/src/app/pages/shravak/passive-user-education/passive-user-education.page.scss new file mode 100644 index 0000000..aa75c08 --- /dev/null +++ b/src/app/pages/shravak/passive-user-education/passive-user-education.page.scss @@ -0,0 +1,53 @@ +app-passive-user-education { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 31.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #70B2CC; + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/passive-user-education/passive-user-education.page.ts b/src/app/pages/shravak/passive-user-education/passive-user-education.page.ts new file mode 100644 index 0000000..94d3e7b --- /dev/null +++ b/src/app/pages/shravak/passive-user-education/passive-user-education.page.ts @@ -0,0 +1,41 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { Roots } from '@enums/root.enum'; +import { UserEducationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-passive-user-education', + templateUrl: './passive-user-education.page.html', + styleUrls: ['./passive-user-education.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule] +}) +export class PassiveUserEducationPage implements OnInit { + userEducationForm: FormGroup; + constructor( + private navCtrl: NavController, + private stateManagementService: StateManagementService + ) { } + + ngOnInit() { + this.userEducationForm = new FormGroup({ + schoolName: new FormControl(this.stateManagementService?.userInformation?.school_name), + aboutUser: new FormControl(this.stateManagementService?.userInformation?.aboutUser) + }); + } + + moveToNext(form) { + if (!form.valid) { + this.userEducationForm.markAllAsTouched(); + return; + } + this.stateManagementService.userInformation.school_name = form.value.schoolName; + this.stateManagementService.userInformation.aboutUser = form.value.aboutUser; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.passiveUserProfileImage); + } + moveToBack() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.passiveUserInformation); + } +} diff --git a/src/app/pages/shravak/passive-user-information/passive-user-information.page.html b/src/app/pages/shravak/passive-user-information/passive-user-information.page.html new file mode 100644 index 0000000..d75b9be --- /dev/null +++ b/src/app/pages/shravak/passive-user-information/passive-user-information.page.html @@ -0,0 +1,80 @@ + + + + + + Add child + + + +
+ + + + + + + + + +
+

Child information

+
+
+ + +
+ + Full name is required. + +
+
+ +
+ + + {{relationship.name}} + +
+ + Please select relationship. + +
+
+ +
+ + {{childBirthDateValue ? (childBirthDateValue | date: + 'dd-MM-yyyy') : 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + +
+ + Birth date is required. + +
+
+ +
+
+ + Next + \ No newline at end of file diff --git a/src/app/pages/shravak/passive-user-information/passive-user-information.page.scss b/src/app/pages/shravak/passive-user-information/passive-user-information.page.scss new file mode 100644 index 0000000..8a0fd2a --- /dev/null +++ b/src/app/pages/shravak/passive-user-information/passive-user-information.page.scss @@ -0,0 +1,72 @@ +app-passive-user-information { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 31.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #70B2CC; + } + } + } + + .honors-chip { + padding: var(--ion-padding-0) var(--ion-padding-15) 0.5rem; + white-space: nowrap; + overflow: scroll; + + ion-chip { + height: 1.375rem; + background: var(--ion-content-color); + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + + ion-label { + font-size: var(--ion-font-size-12); + color: #fff; + } + + &:last-child { + margin: var(--ion-margin-0); + } + } + } + } + + ion-footer { + background: var(--ion-background-content); + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --height: 382px; + --border-radius: 8px; + } + + ion-datetime { + height: 382px; + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/passive-user-information/passive-user-information.page.ts b/src/app/pages/shravak/passive-user-information/passive-user-information.page.ts new file mode 100644 index 0000000..687baa4 --- /dev/null +++ b/src/app/pages/shravak/passive-user-information/passive-user-information.page.ts @@ -0,0 +1,81 @@ +import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { Roots } from '@enums/root.enum'; +import { UserInformationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; + +@Component({ + selector: 'app-passive-user-information', + templateUrl: './passive-user-information.page.html', + styleUrls: ['./passive-user-information.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, ReactiveFormsModule, NgIf, NgFor, GjDatetimeDirective, DatePipe] +}) +export class PassiveUserInformationPage implements OnInit { + + userInformationForm: FormGroup; + minDate: string; + relationshipsDetails = [ + { + id: 1, + name: 'Son', + }, + { + id: 2, + name: 'Daughter', + } + ]; + currentDate = this.formatDate((new Date()).toISOString()); + childBirthDateValue = ''; + constructor( + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private router: Router, + public utilityService: UtilityService + ) { } + + ngOnInit() { + if (this.router.getCurrentNavigation().extras.state) { + const childData = this.router.getCurrentNavigation().extras.state.childData; + this.stateManagementService.userInformation.id = childData.id; + this.stateManagementService.userInformation.name = childData.name; + this.stateManagementService.userInformation.relationship = childData.relationship; + this.stateManagementService.userInformation.birth_date = childData.birth_date; + this.stateManagementService.userInformation.school_name = childData.school_name; + this.stateManagementService.userInformation.aboutUser = childData.about; + this.stateManagementService.userInformation.avatar = childData.avatar; + } + this.userInformationForm = new FormGroup({ + fullName: new FormControl(this.stateManagementService.userInformation.name, Validators.required), + relationship: new FormControl(this.stateManagementService.userInformation.relationship, Validators.required), + birthDate: new FormControl(this.stateManagementService.userInformation.birth_date, Validators.required), + }); + this.childBirthDateValue = this.stateManagementService.userInformation.birth_date; + this.minDate = this.formatDate(new Date((new Date()).setFullYear((new Date()).getFullYear() - 14)).toISOString()); + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + moveToNext(form) { + if (!form.valid) { + this.userInformationForm.markAllAsTouched(); + return; + } + if (form.value.birthDate) { + this.userInformationForm.controls.birthDate.setValue(this.formatDate(form.value.birthDate)); + form.value.birthDate = this.formatDate(form.value.birthDate); + } + this.stateManagementService.userInformation.name = form.value.fullName; + this.stateManagementService.userInformation.birth_date = this.formatDate(form.value.birthDate); + this.stateManagementService.userInformation.relationship = form.value.relationship; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.passiveUserEducation); + } +} diff --git a/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.html b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.html new file mode 100644 index 0000000..e5d11b1 --- /dev/null +++ b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.html @@ -0,0 +1,33 @@ + + + + + + Add child + + + +
+ + + + + + + + + +
+

Child profile image

+

Please upload clean and original image that can help followers to identify your Sant.

+ + + + + Change profile + image +
+ + Back + Finish + diff --git a/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.scss b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.scss new file mode 100644 index 0000000..720e446 --- /dev/null +++ b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.scss @@ -0,0 +1,91 @@ +app-passive-user-profile-image { + h2 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-color); + } + + ion-button { + margin: var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-content { + text-align: center; + + .top-line { + padding: var(--ion-padding-15); + line-height: 0.375rem; + + ion-chip { + width: 31.33%; + padding: var(--ion-padding-0); + margin: var(--ion-margin-0) 3% var(--ion-margin-0) var(--ion-margin-0); + height: 0.25rem; + background: var(--ion-background-gray); + + &:last-child { + margin: var(--ion-margin-0); + } + + &.orange-color { + background: #70B2CC; + } + } + } + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + } + + .profile-bg { + width: 14rem; + height: 14rem; + margin: 2rem auto; + background: url(/assets/images/profile-bg-design.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: cover; + + img { + border: 2px solid #fff; + border-radius: var(--ion-border-radius-100); + width: 8.75rem; + height: 8.75rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + } + + ion-button { + margin: var(--ion-margin-0) auto; + color: var(--ion-color); + + &::part(native) { + --background: none; + border: 1px solid var(--ion-color); + box-shadow: none; + } + } + } + + ion-footer { + padding: var(--ion-padding-0) 0.938rem; + background: var(--ion-background-content); + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:first-child { + margin-right: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.ts b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.ts new file mode 100644 index 0000000..76c3347 --- /dev/null +++ b/src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.ts @@ -0,0 +1,85 @@ +import { NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { ActionSheetController, IonicModule, NavController } from '@ionic/angular'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-passive-user-profile-image', + templateUrl: './passive-user-profile-image.page.html', + styleUrls: ['./passive-user-profile-image.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, SafeUrlPipe] +}) +export class PassiveUserProfileImagePage implements OnInit { + photo: any; + isImageChanged = false; + constructor( + private navCtrl: NavController, + private alert: AlertService, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + public actionSheetCtrl: ActionSheetController, + private cameraGalleryService: CameraGalleryService + ) { } + + ngOnInit() { + if (this.stateManagementService.userInformation.avatar) { + this.photo = this.stateManagementService.userInformation.avatar; + } + } + + selectProfileImage() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (imageData) { + this.isImageChanged = true; + this.photo = imageData.imgString; + this.stateManagementService.userInformation.avatar = imageData.itemImage; + } + }); + } + + async moveToNext() { + if (!this.photo) { + this.alert.showToaster('Please select any profile image'); + return; + } + const formData = new FormData(); + formData.append('name', this.stateManagementService.userInformation.name); + formData.append('relationship', this.stateManagementService.userInformation.relationship); + formData.append('birth_date', this.stateManagementService.userInformation.birth_date); + formData.append('school_name', this.stateManagementService.userInformation.school_name ? + this.stateManagementService.userInformation.school_name : ''); + if (this.isImageChanged) { + formData.append('avatar', this.stateManagementService.userInformation.avatar); + } + formData.append('about', this.stateManagementService.userInformation.aboutUser ? + this.stateManagementService.userInformation.aboutUser : ''); + this.addPassiveUser(formData); + } + + addPassiveUser(formData) { + this.alert.showSpinner(); + let apiPath = api.addPassiveUser; + if (this.stateManagementService.userInformation.id) { + apiPath = api.addPassiveUser + '/' + this.stateManagementService.userInformation.id; + } + this.httpRequestService.post(apiPath, formData).then((res: any) => { + this.alert.showToaster(res.message); + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + }).catch((err) => { + this.alert.showToasterError(err.error); + }).finally(() => { + this.alert.hideLoader(); + }); + } + + moveToBack() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.passiveUserEducation); + } +} diff --git a/src/app/pages/shravak/search-friend/search-friend.page.html b/src/app/pages/shravak/search-friend/search-friend.page.html new file mode 100644 index 0000000..f276fda --- /dev/null +++ b/src/app/pages/shravak/search-friend/search-friend.page.html @@ -0,0 +1,63 @@ + + + + + + Search Connection + + + + + + +
+ + + +
+
+ + + +
+
+

{{data.name}}

+

{{data.user_detail[0]?.location}}

+
+
+ + + + + + + Message + + + Disconnect + + + + + +
+ + + + +
+ + + + +

+

No data found

+

+
+
+
+
diff --git a/src/app/pages/shravak/search-friend/search-friend.page.scss b/src/app/pages/shravak/search-friend/search-friend.page.scss new file mode 100644 index 0000000..78c7674 --- /dev/null +++ b/src/app/pages/shravak/search-friend/search-friend.page.scss @@ -0,0 +1,226 @@ +app-search-friend { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + display: flex; + justify-content: space-between; + + ion-icon { + margin-right: var(--ion-margin-10); + color: #fff; + float: right; + } + + ion-title { + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-item { + &.search { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-input { + height: inherit; + + input { + padding: var(--ion-padding-10) !important; + } + } + + ion-icon { + position: absolute; + color: #ccc; + right: 2px; + font-size: 22px; + z-index: 99; + } + + ion-button { + width: 48%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: 4%; + + &::part(native) { + --background: var(--ion-content-color); + } + } + + &::part(native) { + min-height: 30px; + height: 30px; + } + } + + } + } + } + + ion-content { + --background: var(--ion-background-content); + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + box-shadow: none; + border-radius: 0 8px; + + ion-card-header { + padding: var(--ion-padding-0); + + h3 { + p { + color: var(--ion-color); + } + } + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin: var(--ion-margin-0); + align-items: center; + padding: var(--ion-padding-10); + border-bottom: 1px solid #efefef; + + .left-data { + display: flex; + align-items: center; + width: calc(100% - 30px); + + .icons { + color: var(--ion-color); + margin-right: var(--ion-margin-10); + position: relative; + + span { + overflow: hidden; + width: 50px; + height: 50px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + } + + ion-icon { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + box-shadow: 0px 0px 2px #000; + + &.heart { + color: #f00; + } + } + + div { + position: absolute; + right: 0; + bottom: 0; + background: var(--ion-color-white); + padding: 3px; + border-radius: var(--ion-border-radius-100); + width: 20px; + height: 20px; + box-shadow: 0px 0px 2px #000; + display: flex; + align-items: center; + justify-content: center; + + img { + width: auto; + height: 100%; + } + } + } + + .content { + width: calc(100% - 60px); + + ion-button { + height: 25px; + margin: var(--ion-margin-10) 4% 0 0; + width: 48%; + + &:last-child { + margin-right: 0; + } + + &::part(native) { + text-transform: capitalize; + } + + &.si { + &.reject-btn { + &::part(native) { + text-transform: capitalize; + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + line-height: 14px; + font-weight: 600; + + span { + color: #585858; + font-size: var(--ion-font-size-12); + font-weight: 400; + } + } + } + } + + &.unread { + background: var(--ion-background-content); + } + + ion-button { + height: auto; + margin: 0; + + &::part(native) { + padding-top: 5px; + padding-bottom: 5px; + } + } + } + } + + h3 { + &.title { + padding: 0 var(--ion-padding-10); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: space-between; + + span { + font-size: var(--ion-font-size-14); + color: #000; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/search-friend/search-friend.page.ts b/src/app/pages/shravak/search-friend/search-friend.page.ts new file mode 100644 index 0000000..b58c536 --- /dev/null +++ b/src/app/pages/shravak/search-friend/search-friend.page.ts @@ -0,0 +1,105 @@ + +import { NgFor, NgIf } from '@angular/common'; +import { Component, NgZone } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, FriendList } from '@interfaces/common'; +import { IonicModule, NavController, PopoverController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-search-friend', + templateUrl: './search-friend.page.html', + styleUrls: ['./search-friend.page.scss'], + standalone: true, + imports: [IonicModule, FormsModule, NgIf, NgFor] +}) +export class SearchFriendPage { + friendList: Array = []; + pageNumber = 1; + totalPage = 1; + totalCount: number; + spinnerFlag = false; + searchValue = ''; + prevValue: string; + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private popoverCtrl: PopoverController, + private ngZone: NgZone, + private utilityService: UtilityService, + ) { } + + ionViewWillEnter() { + this.getFriendList(false, ''); + } + + getFriendList(isFirstLoad, event) { + this.spinnerFlag = false; + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get(api.myFriendList, { + page: this.pageNumber, + limit: 15, + name: this.searchValue.trim() + }).then((res: CommonResponse) => { + if (isFirstLoad) { event.target.complete(); } + if (!event) { this.friendList = []; } + this.totalPage = res.data.last_page; + this.totalCount = res.data.total; + this.friendList.push(...res.data.data); + this.spinnerFlag = true; + this.pageNumber++; + }); + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + loadFriendListData($event) { + this.getFriendList(true, $event); + } + + viewPublicProfile(id: number) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakOtherProfile, { id }]); + } + + moveToMessage(data: FriendList) { + this.popoverCtrl.dismiss().then(() => { + this.ngZone.run(() => this.navCtrl.navigateForward([Roots.page + '/' + Roots.messageChat, { + userId: data.id, + name: data.name + }])).then(); + }); + } + + async confirmationAlert(data: FriendList, index: number) { + const message = 'Are you sure you want to remove User ' + data.name + ' from your connection?'; + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + this.popoverCtrl.dismiss().then(() => { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: data.id, status: 2 }) + .then((res: CommonResponse) => { + this.friendList.splice(index, 1); + this.alert.showToaster(res.message); + }); + }); + } + } + + searchFriend() { + const isSameStr = this.utilityService.isSameStr(this.searchValue, this.prevValue); + this.prevValue = this.searchValue; + if (!isSameStr) { + this.friendList = []; + this.pageNumber = 1; + this.totalPage = 1; + this.getFriendList(false, ''); + } + } + +} diff --git a/src/app/pages/shravak/shravak-about/shravak-about.page.html b/src/app/pages/shravak/shravak-about/shravak-about.page.html new file mode 100644 index 0000000..1a853bb --- /dev/null +++ b/src/app/pages/shravak/shravak-about/shravak-about.page.html @@ -0,0 +1,358 @@ + + + + + + Edit profile + About + + + +
+
Basic info Edit
+ + + +
+ +
+

{{userProfileData?.name}}Full Name

+
+
+
+ +
+
+
+

{{userProfileData?.gender}}Gender

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.birth_date | date: 'dd-MM-yyyy'}}Birthday

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.mother_tongue}}Mother tongue

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.jati_name}}Jaati

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.dharma_name}}Dharm

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.blood_group}}Blood Group

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.marital_status}}Marital status

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.marriage_anniversary | date: 'dd-MM-yyyy'}}Marriage anniversary

+ +

{{privacy.name}}

+
+
+
+
+
+
+
Location Edit
+ + + +
+
+
+

{{userProfileData?.location}}Current location

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.native_place}}Native place

+ +

{{privacy.name}}

+
+
+
+
+
+
+
Contact info Edit
+ + + +
+
+
+

+ {{userProfileData?.country_code}}{{userProfileData?.mobile}}Mobile

+

{{userProfileData?.mobile}}Mobile

+ +

{{privacy.name}}

+
+
+
+
+ +
+
+
+

{{userProfileData?.email}}Email

+ +

{{privacy.name}}

+
+
+
+
+
+
+
Family members
+ + + +
+
+ + + + +
+
+

{{familyDetail?.sent_users?.name}}{{familyDetail?.relation}} (Pending)

+ +

{{privacy.name}}

+
+
+
+
+
+
+
+
+
+ Add family member
+ + +
+
+
+

{{ childData?.name }}{{ relationArray[childData?.relationship] }}

+
+
+
+
+
+
+
+
+ Add child (Minor - under 14) +
+
Qualification
+ + +
+
+
+
+
+
+ +
+
+
+

{{data.university}}University

+ +

+ {{privacy.name}}

+
+

{{data.qualification}}Qualification

+
+

Graduate ({{data.passing_year}})

+
+
+

Currently pursuing

+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+

{{data.highschool}}School

+ +

+ {{privacy.name}}

+
+

{{data.qualification}}Qualification

+

Passing year ({{data.passing_year}})

+
+
+
+
+
+ Add school + Add college +
+
+
Work
+ + +
+
+
+
+
+
+ +
+
+
+
+

{{data.profession}}Profession

+ +

{{privacy.name}}

+
+
+ +

{{data.company_name}}Company name

+ +

{{privacy.name}}

+
+

{{data.profession_speciality}}Speciality

+ +

{{privacy.name}}

+
+
+

{{data.position}}Position

+ +

{{privacy.name}}

+
+
+
+

{{data.website}}Website

+ +

+ {{privacy.name}}

+
+
+
+

{{data.city}}City

+ +

+ {{privacy.name}}

+
+
+
+

{{data.about}}About

+ +

+ {{privacy.name}}

+
+
+
+

({{data.start_year}} - To present)Duration +

+

({{data.start_year}} - + {{data.end_year}})Duration

+
+
+
+
+
+
+ Add work +
+
+
\ No newline at end of file diff --git a/src/app/pages/shravak/shravak-about/shravak-about.page.scss b/src/app/pages/shravak/shravak-about/shravak-about.page.scss new file mode 100644 index 0000000..1b4fd06 --- /dev/null +++ b/src/app/pages/shravak/shravak-about/shravak-about.page.scss @@ -0,0 +1,252 @@ +app-shravak-about { + background: var(--ion-background-content); + + h3 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.25rem var(--ion-margin-0); + font-weight: 700; + } + + ion-button { + margin: var(--ion-margin-0); + --border-radius: 0.313rem; + } + + ion-content { + --background: var(--ion-background-content); + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + h5 { + color: var(--ion-color); + font-weight: 600; + + span { + float: right; + } + } + + ion-button { + height: 30px; + min-width: 49%; + color: var(--ion-color); + + &::part(native) { + --background: var(--ion-background-content); + box-shadow: none; + } + } + + .bg { + background: var(--ion-color-white); + text-align: var(--ion-text-align-center); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + ion-button { + width: 47%; + margin: var(--ion-margin-0); + } + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + margin-bottom: var(--ion-margin-15); + box-shadow: none; + border-radius: 8px; + box-shadow: 2px 2px 7px #ebebeb; + + ion-card-header { + padding: var(--ion-padding-0); + + .edit-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: center; + + &.delete { + img { + width: 11px; + } + } + } + + .delete-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: center; + margin-left: 10px; + + img { + width: 11px; + } + } + + .work-edit-icon { + display: flex; + justify-content: flex-end; + position: absolute; + top: 0; + right: 0; + z-index: 9999; + } + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin-top: var(--ion-margin-0); + align-items: center; + padding-top: 17px; + + ion-icon { + width: 19px; + height: 19px; + padding: 10px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + + .left-data { + display: flex; + align-items: center; + width: 100%; + + .icons { + width: 39px; + height: 39px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + + &.family-members { + padding: var(--ion-padding-0); + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + word-break: break-word; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + } + + &.points { + font-size: var(--ion-font-size-12); + color: var(--ion-content-color); + display: flex; + margin-top: 2px; + + ion-icon { + background: none; + width: 12px; + height: 12px; + margin: var(--ion-margin-0) 2px var(--ion-margin-0) var(--ion-margin-0); + padding: var(--ion-padding-0); + color: var(--ion-content-color); + } + } + } + + &.qualification { + align-items: flex-start; + + .mid-content { + margin: var(--ion-margin-10) var(--ion-margin-0); + } + } + + .content { + width: calc(100% - 49px); + } + } + + .edit-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: center; + } + + .icon-child { + display: flex; + } + } + } + + .qualification-btn { + display: flex; + justify-content: space-between; + } + } + } + } + + ion-footer { + height: 50px; + height: calc(env(safe-area-inset-bottom) + 60px); + + ion-tab-bar { + + &.ios { + padding: 0; + padding-bottom: calc(env(safe-area-inset-bottom) + 10px); + } + } + } +} + +ion-alert { + .alert-head { + padding: var(--ion-padding-15) !important; + } + + .alert-message { + padding: var(--ion-padding-0) var(--ion-padding-15) !important; + } + + .alert-button-group { + padding: var(--ion-padding-0); + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-about/shravak-about.page.ts b/src/app/pages/shravak/shravak-about/shravak-about.page.ts new file mode 100644 index 0000000..a8df7bb --- /dev/null +++ b/src/app/pages/shravak/shravak-about/shravak-about.page.ts @@ -0,0 +1,193 @@ +import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, Privacy, ProfileData, ProfileResponse } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-shravak-about', + templateUrl: './shravak-about.page.html', + styleUrls: ['./shravak-about.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, DatePipe] +}) +export class ShravakAboutPage implements OnInit { + userProfileData: ProfileData; + fromFlag = ''; + relationArray = ['', 'Son', 'Daughter']; + privacyList: Privacy[] = constants.privacy; + + constructor( + private router: Router, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private utilityService: UtilityService + ) { } + + async ngOnInit() { + if (this.router.getCurrentNavigation().extras.state.from) { + this.fromFlag = this.router.getCurrentNavigation().extras.state.from; + } + this.userProfileData = await this.stateManagementService.storage.get(GJainStorage.profileData); + } + + ionViewWillEnter() { + this.getProfileInfo(); + this.stateManagementService.userInformation = {}; + } + + getProfileInfo() { + this.httpRequestService.get(api.shravakProfile).then((res: ProfileResponse) => { + this.userProfileData = res.data; + this.stateManagementService.userProfileData = res.data; + this.stateManagementService.storage.set(GJainStorage.profileData, res.data); + }); + } + + editBasicInfo() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditProfile); + } + + editLocationInfo() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditLocation); + } + + editContactInfo() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditContactInfo); + } + + editWorkInfo(data) { + const navOption = { + state: { + workData: data, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditWork, navOption); + } + + addWorkInfo() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditWork); + } + + addEducationInfo(type) { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.shravakEditEducation, { + type, + }]); + } + + editQualificationInfo(data, type) { + const navOption = { + state: { + qualificationData: data, + type + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditEducation, navOption); + } + + addFamilyMember() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditFamilyMembers); + } + + addChild() { + this.stateManagementService.userInformation.id = null; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.addChild); + } + + editChild(childData) { + const navOption = { + state: { + childData + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.addChild, navOption); + } + + async deleteFamilyMember(id: number, index: number) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure about delete this member from your family?', + 'No', 'Yes', 'Delete Member' + ); + if (isYes) { + const params = { + from_id: id, + status: 2, + }; + this.httpRequestService.post(api.relationshipRequestChange, params).then((res: any) => { + this.userProfileData.family_members.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + } + + editFamilyMember(data: any) { + const navOption = { + state: { + familyData: data, + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakEditFamilyMembers, navOption); + } + + deleteQualification(id: number, index: number, type: number) { + this.presentAlert(id, index, type, 1); + } + + deleteWork(id: number, index: number) { + this.presentAlert(id, index, '', 2); + } + + deleteChild(id: number, index: number) { + this.presentAlert(id, index, '', 3); + } + + async presentAlert(id: number, index: number, type: any, status: number) { + const message = + status === 1 ? 'Are you sure about delete this qualification detail?' : + status === 2 ? 'Are you sure about delete this work detail?' : 'Are you sure about delete this child?'; + + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + if (status === 1) { + this.httpRequestService.post(api.deleteQualification, { qualification_id: id }) + .then((res: CommonResponse) => { + if (type === 1) { + this.userProfileData.qualificaion_details.colleges.splice(index, 1); + } else { + this.userProfileData.qualificaion_details.schools.splice(index, 1); + } + this.alert.showToaster(res.message); + }); + } else if (status === 2) { + this.httpRequestService.post(api.deleteWork, { work_id: id }).then((res: CommonResponse) => { + this.userProfileData.company_details.splice(index, 1); + this.alert.showToaster(res.message); + }); + } else { + this.httpRequestService.delete(api.deleteChild.replace('{id}', String(id))).then((res: CommonResponse) => { + this.userProfileData.passive_users.splice(index, 1); + this.alert.showToaster(res.message); + }); + } + } + } + + address(type: string) { + if (type === 'native') { + this.utilityService.openGoogleMap(this.userProfileData.native_latitude, this.userProfileData.native_longitude); + } else if (type === 'current') { + this.utilityService.openGoogleMap(this.userProfileData.latitude, this.userProfileData.longitude); + } + } + +} diff --git a/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.html b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.html new file mode 100644 index 0000000..d5e07d4 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.html @@ -0,0 +1,87 @@ + + + + + + Edit contact info + + + +
+ + + + Mobile* + + {{privacy.name}} + + + + + + + + + + Verify number + + +
+ + Mobile is required. + + + Country Code is required. + + + Please put {{ numLength }} digit mobile number. + +
+
+

{{timer}}

+

Resend

+
+ + + + OTP* + + + + + + + + + + Email + + {{privacy.name}} + + + + + + + + +
+ + * Please enter valid email. + +
+
+
+ + Save + \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.scss b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.scss new file mode 100644 index 0000000..f6b012e --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.scss @@ -0,0 +1,118 @@ +app-shravak-edit-contact-info { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + ion-buttons { + ion-icon { + color: #fff; + margin: var(--ion-margin-0); + vertical-align: middle; + font-size: 25px; + } + } + } + } + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15) 0 0 0; + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + ion-select { + padding: 0px 6px 0 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + + :not(.legacy-select) { + min-height: initial; + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-input { + input { + --padding-start: var(--ion-padding-15); + } + } + + ionic-selectable { + padding: var(--ion-padding-0) var(--ion-padding-15); + } + + ion-button { + height: 21px; + position: absolute; + bottom: 10px; + right: 10px; + margin: 0; + z-index: 999; + } + } + } + + form { + margin: var(--ion-margin-15); + + .otp-time { + justify-content: space-between; + display: flex; + overflow: auto; + margin: var(--ion-margin-15) var(--ion-margin-0); + + p { + margin: var(--ion-margin-0); + float: left; + padding: var(--ion-padding-0); + + &:last-child { + text-align: right; + } + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.ts b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.ts new file mode 100644 index 0000000..740079b --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.ts @@ -0,0 +1,229 @@ +import { NgClass, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, Countries, Country, Privacy, ProfileData } from '@interfaces/common'; +import { ContactForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { FirebaseService } from '@services/firebase.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; + +@Component({ + selector: 'app-shravak-edit-contact-info', + templateUrl: './shravak-edit-contact-info.page.html', + styleUrls: ['./shravak-edit-contact-info.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor, IonicSelectableComponent, NgClass] +}) +export class ShravakEditContactInfoPage implements OnInit { + privacyList: Privacy[] = constants.privacy; + contactForm: FormGroup; + userProfileData: ProfileData; + numLength = 10; + countryDetails: Array = []; + countryCode: string; + phoneNumber: string; + timer: string; + interval: any; + resendEnable = false; + verifyOtpBtn = false; + codeSentFlag = false; + serializedForm: string; + constructor( + private stateManagementService: StateManagementService, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private firebaseService: FirebaseService + ) { } + + async ngOnInit() { + this.userProfileData = await this.stateManagementService.storage.get(GJainStorage.profileData); + this.contactForm = new FormGroup({ + country_code: new FormControl(null, Validators.required), + mobile: new FormControl(this.userProfileData.mobile, Validators.required), + mobile_privacy: new FormControl(this.userProfileData.mobile_privacy, Validators.required), + email: new FormControl(this.userProfileData.email, [Validators.email]), + email_privacy: new FormControl(this.userProfileData.email_privacy,), + otp: new FormControl(''), + }); + if (this.stateManagementService.countryDetails.length > 0) { + this.countryDetails = this.stateManagementService.countryDetails; + this.setDefaultCountryCodeAndValidate(); + } else { + this.getCountryDetails(); + } + this.serializedForm = this.getSerializedForm(this.contactForm); + } + + setDefaultCountryCodeAndValidate() { + if (this.countryDetails) { + this.countryDetails.forEach((elem) => { + const countryCode = elem.phone_code.replace('(', '').replace(')', ''); + if (countryCode === this.userProfileData.country_code) { + this.contactForm.controls.country_code.setValue(elem); + this.numLength = Number(elem.num_length); + this.contactForm.controls.mobile.setValidators([Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + this.contactForm.controls.mobile.updateValueAndValidity(); + } + }); + } + } + + getSerializedForm(form) { + const formObj = form.getRawValue(); + return JSON.stringify(formObj); + } + + initTimer() { + let seconds = 60; + this.interval = setInterval(() => { + if (seconds > 0) { + seconds--; + this.timer = `00:${(seconds > 10 ? seconds : '0' + seconds)}`; + this.resendEnable = true; + } else { + this.timer = null; + this.resendEnable = false; + clearInterval(this.interval); + } + }, 1000); + } + + onSubmit(form) { + if (!this.contactForm.valid) { + this.contactForm.markAllAsTouched(); + return; + } + if (form.value.country_code.phone_code) { + const codeVal = form.value.country_code.phone_code; + const countryCode = codeVal.replace('(', '').replace(')', ''); + form.value.country_code = countryCode; + } + if (this.serializedForm === this.getSerializedForm(form)) { + this.alert.showToaster('No changes to save'); + return; + } + this.httpRequestService.post(api.updateShravakProfile, form.value).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + } + + async logout() { + const deviceUUID = await this.stateManagementService.storage.get(GJainStorage.deviceUUID); + const params = { + device_id: deviceUUID, + }; + this.httpRequestService.get(api.logout, deviceUUID ? params : '').then((res: any) => { + if (res.status === 200) { + this.stateManagementService.token = ''; + this.stateManagementService.storage.remove(GJainStorage.loginType); + this.stateManagementService.storage.remove(GJainStorage.profileData); + this.stateManagementService.storage.remove(GJainStorage.userData).then(() => { + this.navCtrl.navigateRoot(Roots.auth + '/' + Roots.login); + }); + } + this.alert.showToaster(res.message); + this.alert.hideLoader(); + }).catch(() => { + this.alert.hideLoader(); + }); + } + + codeChange(event) { + this.numLength = event.value.num_length; + this.contactForm.controls.mobile.setValidators([Validators.pattern(`^[0-9]{${this.numLength}}$`)]); + this.contactForm.controls.mobile.updateValueAndValidity(); + } + + getCountryDetails() { + this.httpRequestService.get(api.countryCodes).then((res: Countries) => { + this.countryDetails = res.countries; + this.stateManagementService.countryDetails = res.countries; + this.setDefaultCountryCodeAndValidate(); + }); + } + + async phoneNumberVerification(phoneCode: any, phoneNumber: string) { + const codeVal = phoneCode.phone_code; + const countryCode = codeVal.replace('(', '').replace(')', ''); + const params = { + country_code: countryCode, + mobile: phoneNumber, + }; + try { + this.alert.showLoader(); + const response: any = await this.httpRequestService.post(api.userExistNumber, params); + if (response) { + await this.firebaseService.signInWithPhoneNumber({ + phoneNumber: countryCode + phoneNumber + }); + this.countryCode = countryCode; + this.phoneNumber = phoneNumber; + this.codeSentFlag = true; + this.initTimer(); + this.contactForm.controls.otp.setValidators([Validators.required]); + this.contactForm.controls.otp.updateValueAndValidity(); + this.alert.showToaster(response.message); + } + } catch (error) { + if (!error.error) { this.alert.showToasterError(error.message); } + } finally { + this.alert.hideLoader(); + } + } + + async verifyOtp(form) { + if ( + this.contactForm.controls.mobile.value !== this.userProfileData.mobile && + this.contactForm.controls.country_code.value.phone_code !== this.userProfileData.country_code + ) { + if (!this.contactForm.valid) { + this.contactForm.markAllAsTouched(); + return; + } + if (form.value.country_code.phone_code) { + const codeVal = form.value.country_code.phone_code; + const countryCode = codeVal.replace('(', '').replace(')', ''); + form.value.country_code = countryCode; + } + this.alert.showLoader(); + this.firebaseService.confirmVerificationCode(form.value.otp).then(() => { + this.httpRequestService.post(api.updateShravakProfile, form.value).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + }).catch(e => { + this.alert.showToasterError(e.message); + }).finally(() => { + this.alert.hideLoader(); + }); + } else { + this.onSubmit(form); + } + } + + resendOtp() { + this.phoneNumberVerification(this.contactForm.controls.country_code.value, this.contactForm.controls.mobile.value); + } + + changeNumber(event) { + if (event.detail.value !== this.userProfileData.mobile) { + this.verifyOtpBtn = true; + this.contactForm.controls.otp.setValidators([Validators.required]); + this.contactForm.controls.otp.updateValueAndValidity(); + } else { + this.verifyOtpBtn = false; + this.contactForm.controls.otp.clearValidators(); + this.contactForm.controls.otp.updateValueAndValidity(); + } + } + +} diff --git a/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.html b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.html new file mode 100644 index 0000000..1889f53 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.html @@ -0,0 +1,143 @@ + + + + + + Edit education info + + + +
+ + + + + + {{privacy.name}} + + + + +
+
+ +
+ + School name is required. + +
+
+
+ +
+ + Qualification is required. + +
+
+
+ + {{yearValue ? yearValue : 'Select year'}} + + + + Select Year + + + +
+ + Passing year is required. + +
+
+
+
+
+
+ + +
+ + + + Add university + + {{privacy.name}} + + + + +
+
+ +
+ + University Name is required. + +
+
+
+ +
+ + Qualification is required. + +
+
+
+ + Graduated + +
+ +
+
+ + + {{endYearValue ? endYearValue : 'Select year'}} +
+ + + + Select Year + + + +
+ + End year is required. + +
+
+
+
+
+
+
+ + Save + Save + \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.scss b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.scss new file mode 100644 index 0000000..8c85afc --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.scss @@ -0,0 +1,138 @@ +app-shravak-edit-education { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15); + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + .custom-select { + --border-width: 0; + border-width: 0; + font-size: 14px; + border-radius: 5px; + overflow: hidden; + border-radius: 0.25rem; + + &::part(icon) { + display: none; + } + + &::part(container) { + padding-left: var(--ion-padding-10); + } + + } + + ion-select { + padding: 0px 6px 0 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + } + } + + ion-card-content { + padding: var(--ion-padding-15) !important; + + .school-data { + margin-bottom: var(--ion-margin-15); + + ion-input { + margin: var(--ion-margin-0); + } + + .error { + margin: var(--ion-margin-0); + text-align: left; + margin-top: 3px; + } + } + + ion-label { + font-size: var(--ion-font-size-12); + } + + ion-checkbox { + width: 100%; + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15); + --border-color-checked: var(--ion-color); + --checkbox-background-checked: var(--ion-color); + } + + ion-input { + border: 1px solid #efefef; + margin-bottom: 15px; + border-radius: 5px; + + input { + --padding-start: var(--ion-padding-15); + } + + &#open-modal { + padding-left: var(--ion-padding-15) !important; + } + } + + ion-item { + --min-height: auto; + padding: var(--ion-padding-10) var(--ion-padding-0); + margin: var(--ion-margin-0); + + ion-label { + font-size: var(--ion-font-size-12); + margin-right: var(--ion-margin-15); + } + + ion-input { + text-indent: 10px; + } + } + + .error { + margin: var(--ion-margin-0) 15px var(--ion-margin-0) var(--ion-margin-0); + text-align: right; + } + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.ts b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.ts new file mode 100644 index 0000000..b17b0c5 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.ts @@ -0,0 +1,139 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { College, CommonResponse, Privacy } from '@interfaces/common'; +import { CollegeForm, HighSchoolForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { format, parseISO } from 'date-fns'; + +@Component({ + selector: 'app-shravak-edit-education', + templateUrl: './shravak-edit-education.page.html', + styleUrls: ['./shravak-edit-education.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor] +}) +export class ShravakEditEducationPage implements OnInit { + privacyList: Privacy[] = constants.privacy; + yearValue = ''; + endYearValue = ''; + type: string; + id: number; + collegeForm: FormGroup; + highSchoolForm: FormGroup; + qualificationData: College; + serializedForm: string; + + constructor( + private cRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private router: Router, + ) { } + + async ngOnInit() { + this.type = this.cRoute.snapshot.paramMap.get('type'); + if (this.router.getCurrentNavigation().extras.state) { + this.qualificationData = this.router.getCurrentNavigation().extras.state.qualificationData; + this.id = this.qualificationData.id; + this.type = this.router.getCurrentNavigation().extras.state.type; + } + if (this.type === '1') { + this.highSchoolForm = new FormGroup({ + qualification_id: new FormControl(this.id ? this.id : ''), + type: new FormControl('2'), + highschool: new FormControl(this.id ? this.qualificationData.highschool : '', Validators.required), + qualification: new FormControl(this.id ? this.qualificationData.qualification : '', Validators.required), + passing_year: new FormControl(this.id ? this.qualificationData.passing_year : '', Validators.required), + privacy: new FormControl((this.id && this.qualificationData.privacy) ? this.qualificationData.privacy : 1, Validators.required), + }, {}); + if (this.id) { + this.yearValue = this.qualificationData.passing_year ? this.qualificationData.passing_year : ''; + } + this.serializedForm = this.getSerializedForm(this.highSchoolForm); + } else if (this.type === '2') { + this.collegeForm = new FormGroup({ + qualification_id: new FormControl(this.id ? this.id : ''), + type: new FormControl('1'), + university: new FormControl(this.id ? this.qualificationData.university : '', Validators.required), + qualification: new FormControl(this.id ? this.qualificationData.qualification : '', Validators.required), + is_graduate: new FormControl(this.id ? this.qualificationData.is_graduate : false), + passing_year: new FormControl(this.id ? this.qualificationData.passing_year : ''), + privacy: new FormControl((this.id && this.qualificationData.privacy) ? this.qualificationData.privacy : 1, Validators.required), + }, { + }); + if (this.id) { + this.endYearValue = this.qualificationData.passing_year ? this.qualificationData.passing_year : ''; + } + this.serializedForm = this.getSerializedForm(this.collegeForm); + } + } + + getSerializedForm(form) { + const formObj = form.getRawValue(); + return JSON.stringify(formObj); + } + + formatDate(value, type) { + if (!value) { return; } + if (type === 1) { + this.highSchoolForm.controls.passing_year.setValue(format(parseISO(value), 'yyyy')); + } else if (type === 3) { + this.collegeForm.controls.passing_year.setValue(format(parseISO(value), 'yyyy')); + } + return format(parseISO(value), 'yyyy'); + } + + onSubmitCollege(form) { + if (!this.collegeForm.valid) { + this.collegeForm.markAllAsTouched(); + return; + } + if (this.serializedForm === this.getSerializedForm(form)) { + this.alert.showToaster('No changes to save'); + return; + } + this.httpRequestService.post(api.updateShravakProfile, { qualification_details: [form.value] }) + .then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + } + + onSubmitHighSchool(form) { + if (!this.highSchoolForm.valid) { + this.highSchoolForm.markAllAsTouched(); + return; + } + if (this.serializedForm === this.getSerializedForm(form)) { + this.alert.showToaster('No changes to save'); + return; + } + this.httpRequestService.post(api.updateShravakProfile, { qualification_details: [form.value] }) + .then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + } + + onChange(event) { + if (event.detail.checked) { + this.collegeForm.controls.passing_year.setValidators([Validators.required]); + } else { + this.collegeForm.controls.passing_year.clearValidators(); + } + this.collegeForm.controls.passing_year.updateValueAndValidity(); + if (!this.collegeForm.controls.is_graduate.value) { + this.collegeForm.controls.passing_year.setValue(''); + this.endYearValue = ''; + } + } + +} diff --git a/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.html b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.html new file mode 100644 index 0000000..d90d68a --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.html @@ -0,0 +1,59 @@ + + + + + + Edit family info + + + +
+ + + + Add family member* + + {{privacy.name}} + + + + + +
+ + Member name is required. + +
+
+ + + + + + +

{{ user.name }}

+
+
+
+
+ +
+ + Relationship is required. + +
+
+ Add + members + Update + relation +
+
+

Note: Only your connections will appear in the family members list.

+
\ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.scss b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.scss new file mode 100644 index 0000000..a806949 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.scss @@ -0,0 +1,110 @@ +app-shravak-edit-family-members { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15); + overflow: visible; + padding-bottom: 1px; + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + ion-select { + padding: 0px 6px 0 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-input { + input { + --padding-start: var(--ion-padding-15); + } + } + + ion-select { + border-top: 1px solid #efefef; + border-bottom: 1px solid #efefef; + --padding-start: var(--ion-padding-15); + --padding-end: var(--ion-padding-15); + + &::part(icon) { + right: 15px; + } + } + + .error { + margin: var(--ion-margin-0) 15px var(--ion-margin-0) var(--ion-margin-0); + text-align: right; + } + + .search-data { + top: 40px; + } + } + + ion-button { + height: 30px; + min-width: 49%; + color: var(--ion-color); + margin: var(--ion-margin-10); + + &::part(native) { + --background: var(--ion-background-content); + box-shadow: none; + border-radius: 5px; + } + } + + p { + margin: 0 var(--ion-margin-10); + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-button { + margin: var(--ion-margin-0); + } + } + + .member-note { + font-size: 12px; + padding-left: 18px; + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.ts b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.ts new file mode 100644 index 0000000..3f4198e --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.ts @@ -0,0 +1,124 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, FamilyMember, FriendList, Privacy } from '@interfaces/common'; +import { FamilyForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-shravak-edit-family-members', + templateUrl: './shravak-edit-family-members.page.html', + styleUrls: ['./shravak-edit-family-members.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor] +}) +export class ShravakEditFamilyMembersPage implements OnInit { + privacyList: Privacy[] = constants.privacy; + familyForm: FormGroup; + userList: Array = []; + selectedRelation: any; + familyData: FamilyMember; + disableFlag = false; + prevValue: string; + + constructor( + private httpRequestService: HttpRequestService, + private navCtrl: NavController, + private alert: AlertService, + private router: Router, + private utilityService: UtilityService + ) { + if (this.router.getCurrentNavigation().extras.state) { + this.familyData = this.router.getCurrentNavigation().extras.state.familyData; + } + this.disableFlag = this.familyData && this.familyData.id ? true : false; + } + + ngOnInit() { + this.familyForm = new FormGroup({ + memberName: new FormControl(this.disableFlag ? this.familyData.sent_users.name : '', Validators.required), + relation: new FormControl(this.disableFlag ? this.familyData.relation : '', Validators.required), + relationPrivacy: new FormControl(this.disableFlag ? this.familyData.relation_privacy : 1, Validators.required), + }, {}); + } + + getUserList(event) { + if (!event.value.trim()) { + return this.userList = []; + } + const isSameStr = this.utilityService.isSameStr(event.value, this.prevValue); + this.prevValue = event.value; + if (!isSameStr) { + const params = { + name: event.value.trim() + }; + this.httpRequestService.get(api.friendListForFamily, params).then((res: any) => { + this.userList = res.data; + this.selectedRelation = ''; + }); + } + } + + addUser(user) { + this.familyForm.patchValue({ memberName: user.name }); + this.selectedRelation = user; + this.userList = []; + } + + onSubmit(form) { + if (!this.selectedRelation && !this.selectedRelation?.id) { + this.alert.showToaster('Please select member from existing user list.'); + return; + } + if (!this.familyForm.valid) { + this.familyForm.markAllAsTouched(); + return; + } + const formData = new FormData(); + formData.append('to_id', this.selectedRelation.id); + formData.append('relation', form.value.relation); + formData.append('relation_privacy', form.value.relationPrivacy); + this.alert.showSpinner(); + this.httpRequestService.post(api.sendRelationshipList, formData).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.hideLoader(); + this.alert.showToaster(res.message); + }).catch(() => { + this.alert.hideLoader(); + }); + } + + addRelation(value) { + if (value) { + this.familyForm.controls.relation.clearValidators(); + this.familyForm.controls.relation.updateValueAndValidity(); + } + } + + editRelationship() { + if (!this.familyForm.valid) { + this.familyForm.markAllAsTouched(); + return; + } + const params = { + relation: this.familyForm.controls.relation.value, + relation_privacy: this.familyForm.controls.relationPrivacy.value, + }; + this.alert.showSpinner(); + this.httpRequestService.post(api.editFamilyRelation.replace('{id}', String(this.familyData.id)), params).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.hideLoader(); + this.alert.showToaster(res.message); + }).catch(() => { + this.alert.hideLoader(); + }); + } + +} diff --git a/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.html b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.html new file mode 100644 index 0000000..8b9e4a0 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.html @@ -0,0 +1,61 @@ + + + + + + Edit location + + + +
+ + + + Current location* + + {{privacy.name}} + + + + + + + +
+ + Current location is required. + +
+ + + + Native place* + + {{privacy.name}} + + + + + + + +
+ + Native location is required. + +
+
+
+ + Save + \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.scss b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.scss new file mode 100644 index 0000000..6cedd32 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.scss @@ -0,0 +1,96 @@ +app-shravak-edit-location { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + ion-buttons { + ion-icon { + color: #fff; + margin: var(--ion-margin-0); + vertical-align: middle; + font-size: 25px; + } + } + } + } + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15) 0 0 0; + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + ion-select { + padding: 0px 6px 0 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + + :not(.legacy-select) { + min-height: initial; + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-input { + input { + --padding-start: var(--ion-padding-15); + } + } + + input { + width: 100%; + border: none; + line-height: 2.2em; + padding-left: 16px; + outline: none; + } + } + } + + form { + margin: var(--ion-margin-15); + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.ts b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.ts new file mode 100644 index 0000000..610ace3 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.ts @@ -0,0 +1,107 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, Privacy, ProfileData } from '@interfaces/common'; +import { LocationForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +@Component({ + selector: 'app-shravak-edit-location', + templateUrl: './shravak-edit-location.page.html', + styleUrls: ['./shravak-edit-location.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor] +}) +export class ShravakEditLocationPage implements OnInit { + @ViewChild('currentLocation') currentLocation: ElementRef; + @ViewChild('nativeLocation') nativeLocation: ElementRef; + privacyList: Privacy[] = constants.privacy; + locationForm: FormGroup; + userProfileData: ProfileData; + longitude = ''; + latitude = ''; + native_longitude = ''; + native_latitude = ''; + serializedForm: string; + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private utilityService: UtilityService + ) { } + + async ngOnInit() { + this.userProfileData = await this.stateManagementService.storage.get(GJainStorage.profileData); + this.longitude = this.userProfileData.longitude; + this.latitude = this.userProfileData.latitude; + this.native_longitude = this.userProfileData.native_longitude; + this.native_latitude = this.userProfileData.native_latitude; + this.locationForm = new FormGroup({ + location: new FormControl(this.userProfileData.location, Validators.required), + location_privacy: new FormControl(this.userProfileData.location_privacy, Validators.required), + native_place: new FormControl(this.userProfileData.native_place, Validators.required), + native_place_privacy: new FormControl(this.userProfileData.native_place_privacy, Validators.required), + }); + this.serializedForm = this.getSerializedForm(this.locationForm); + } + + onSubmit(form) { + if (!this.locationForm.valid) { + this.locationForm.markAllAsTouched(); + return; + } + if (this.serializedForm === this.getSerializedForm(form)) { + this.alert.showToaster('No changes to save'); + return; + } + const params = form.value; + params.native_longitude = this.native_longitude; + params.native_latitude = this.native_latitude; + params.longitude = this.longitude; + params.latitude = this.latitude; + this.httpRequestService.post(api.updateShravakProfile, params).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + } + + getSerializedForm(form) { + const formObj = form.getRawValue(); + return JSON.stringify(formObj); + } + + initAutocompleteCurrent(): void { + this.utilityService.createAutocomplete(this.currentLocation.nativeElement, []).subscribe((details) => { + this.locationForm.controls.location.setValue(this.currentLocation.nativeElement.value); + this.longitude = details.geometry.location.lng(); + this.latitude = details.geometry.location.lat(); + }); + } + + removeLatAndLongCurrent() { + this.longitude = ''; + this.latitude = ''; + } + + initAutocompleteNative(): void { + this.utilityService.createAutocomplete(this.nativeLocation.nativeElement, []).subscribe((details) => { + this.locationForm.controls.native_place.setValue(this.nativeLocation.nativeElement.value); + this.native_longitude = details.geometry.location.lng(); + this.native_latitude = details.geometry.location.lat(); + }); + } + + removeLatAndLongNative() { + this.native_longitude = ''; + this.native_latitude = ''; + } + +} diff --git a/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.html b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.html new file mode 100644 index 0000000..3895606 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.html @@ -0,0 +1,227 @@ + + + + + + Edit profile + + + +
+ + + + Name* + + + + + + +
+ + Name is required. + +
+ + + + + + {{privacy.name}} + + + + + + {{dharma.name}} + + + +
+ + Dharm is required. + +
+ + + + Jaati + + {{privacy.name}} + + + + + + + + +

Jaati Missing? please write to us Here

+ + + + Gender* + + {{privacy.name}} + + + + + + + Male + + + Female + + + + +
+ + Gender is required. + +
+ + + + Birthday* + + {{privacy.name}} + + + + + {{userBirthDateValue ? (userBirthDateValue | date: + 'dd-MM-yyyy') : 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + + + + + + + Mother tongue + + {{privacy.name}} + + + + + + {{motherTongue.name}} + + + + + + + Blood Group + + {{privacy.name}} + + + + + + {{bloodGroup.name}} + + + + + + + Marital status + + {{privacy.name}} + + + + + + + Single + + + Married + + + Separated + + + + + + + + Marriage anniversary + + {{privacy.name}} + + + + + {{marriageDateValue ? (marriageDateValue | date: + 'dd-MM-yyyy') : 'dd-mm-yyyy'}} + + + + + CANCEL + + DONE + + + + + + + +
+
+ + Save + \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.scss b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.scss new file mode 100644 index 0000000..3af5f64 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.scss @@ -0,0 +1,219 @@ +app-shravak-edit-profile { + background: var(--ion-background-content); + + ion-header { + ion-toolbar { + ion-buttons { + ion-icon { + color: #fff; + margin: var(--ion-margin-0); + vertical-align: middle; + font-size: 25px; + } + } + } + } + + ion-content { + --background: var(--ion-background-content); + + ion-card { + margin: var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0); + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + ion-select { + padding: 0px 0px 0px 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + + &.privacy-label { + text-transform: capitalize; + + .select-wrapper { + float: right; + } + } + + } + + :not(.legacy-select) { + min-height: initial !important; + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-radio-group { + display: flex; + flex-wrap: wrap; + gap: 15px; + + ion-item { + margin: var(--ion-margin-0); + --min-height: 40px; + border-bottom: 1px solid #e5e5e5; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14) !important; + } + + ion-radio { + margin: var(--ion-margin-0); + } + + &:last-child { + border: none; + } + } + } + + + ion-select { + padding-left: 15px; + + .select-wrapper { + justify-content: end; + } + } + + .name { + height: 44px; + } + + ion-input { + --padding-start: var(--ion-padding-15) !important; + + } + + + .sc-ion-input-md-h:not(.legacy-input) { + min-height: initial; + } + + ionic-selectable { + padding: var(--ion-padding-0) var(--ion-padding-15); + } + } + + &.calendar { + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15) !important; + } + + ion-card-content { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-15) !important; + + ion-input { + margin: var(--ion-margin-0); + } + } + } + } + + p { + font-size: var(--ion-font-size-14); + + span { + color: var(--ion-color); + } + } + + form { + margin: var(--ion-margin-15); + } + + ion-input { + padding: var(--ion-padding-0) !important; + + &.date-padding { + display: flex; + align-items: center; + height: 40px; + } + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} + +ion-popover { + --offset-x: -3% !important; + + &.md { + --offset-x: -1% !important; + } + + ion-select-popover { + ion-list { + ion-radio-group { + ion-item { + margin: var(--ion-margin-0); + } + } + } + } +} + +ion-modal { + &.date-modal { + --width: 290px; + --height: 382px; + --border-radius: 8px; + } + + ion-datetime { + height: 382px; + } + + ionic-selectable-modal { + ion-content { + ion-list { + ion-item-group { + ion-item { + ion-label { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-10); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.ts b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.ts new file mode 100644 index 0000000..655b40f --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.ts @@ -0,0 +1,191 @@ +import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { GjDatetimeDirective } from '@directives/gj-datetime.directive'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { BloodGroup, CommonResponse, Dharma, Jaati, MTongue, Privacy, ProfileData } from '@interfaces/common'; +import { BasicInfoForm } from '@interfaces/form'; +import { AlertController, IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; +import { format, parseISO } from 'date-fns'; + +@Component({ + selector: 'app-shravak-edit-profile', + templateUrl: './shravak-edit-profile.page.html', + styleUrls: ['./shravak-edit-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor, IonicSelectableComponent, GjDatetimeDirective, DatePipe] +}) +export class ShravakEditProfilePage implements OnInit { + privacyList: Privacy[] = constants.privacy; + basicInfoForm: FormGroup; + userProfileData: ProfileData; + dharmaDetails: Array = []; + jaatiDetails: Array = []; + bloodGroupDetails: Array = []; + motherTongueDetails: Array = []; + maxDate: string; + currentDate = this.formatDate((new Date()).toISOString()); + serializedForm: string; + userBirthDateValue = ''; + marriageDateValue = ''; + constructor( + private navCtrl: NavController, + private alert: AlertService, + private httpRequestService: HttpRequestService, + private stateManagementService: StateManagementService, + private alertController: AlertController, + public utilityService: UtilityService + ) { + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.motherTongueDetails.length > 0) { + this.motherTongueDetails = this.stateManagementService.motherTongueDetails; + } else { + this.getMotherTongueList(); + } + if (this.stateManagementService.bloodGroupDetails.length > 0) { + this.bloodGroupDetails = this.stateManagementService.bloodGroupDetails; + } else { + this.getBloodGroupList(); + } + } + + async ngOnInit() { + const userData = await this.stateManagementService.storage.get(GJainStorage.profileData); + if (userData) { + this.userProfileData = userData; + this.basicInfoForm = new FormGroup({ + name: new FormControl(String(this.userProfileData.name), Validators.required), + gender: new FormControl(String(this.userProfileData.gender_id), Validators.required), + gender_privacy: new FormControl(this.userProfileData.gender_privacy, Validators.required), + birth_date: new FormControl(this.userProfileData.birth_date), + birth_date_privacy: new FormControl(this.userProfileData.birth_date_privacy), + mother_tongue: new FormControl(this.userProfileData.mother_tongue_id,), + mother_tongue_privacy: new FormControl(this.userProfileData.mother_tongue_privacy,), + jati: new FormControl(), + jati_privacy: new FormControl(this.userProfileData.jati_privacy,), + dharma: new FormControl(this.userProfileData.dharma_id, Validators.required), + dharma_privacy: new FormControl(this.userProfileData.dharma_privacy, Validators.required), + blood_group: new FormControl(this.userProfileData.blood_group_id,), + blood_group_privacy: new FormControl(this.userProfileData.blood_group_privacy,), + marital_status: new FormControl(this.userProfileData.marital_status,), + marital_status_privacy: new FormControl(this.userProfileData.marital_status_privacy,), + marriage_anniversary: new FormControl(this.userProfileData.marriage_anniversary, []), + marriage_anniversary_privacy: new FormControl(this.userProfileData.marriage_anniversary_privacy, []), + }, {}); + this.maxDate = this.formatDate(new Date((new Date()).setFullYear((new Date()).getFullYear() - 14)).toISOString()); + this.userBirthDateValue = this.userProfileData.birth_date; + this.marriageDateValue = this.userProfileData.marriage_anniversary; + } + this.getJaatiList(true); + this.serializedForm = this.getSerializedForm(this.basicInfoForm); + } + + onSubmit(form) { + if (!this.basicInfoForm.valid) { + this.basicInfoForm.markAllAsTouched(); + return; + } + form.controls.jati.setValue(this.basicInfoForm.controls.jati.value ? this.basicInfoForm.controls.jati.value.id : null); + if (this.serializedForm === this.getSerializedForm(form)) { + this.alert.showToaster('No changes to save'); + return; + } + this.httpRequestService.post(api.updateShravakProfile, form.value).then((res: CommonResponse) => { + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }); + } + + getSerializedForm(form) { + const formObj = form.getRawValue(); + return JSON.stringify(formObj); + } + + formatDate(value) { + return format(parseISO(value), 'yyyy-MM-dd'); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getJaatiList(isFirst?: boolean) { + this.httpRequestService.get(api.jaatiList).then((res: any) => { + this.jaatiDetails = res.data; + if (isFirst) { + this.jaatiDetails.forEach((elem) => { + if (elem.id === this.userProfileData.jati_id) { + this.basicInfoForm.controls.jati.setValue(elem); + } + }); + } + }); + } + + getMotherTongueList() { + this.httpRequestService.get(api.getMotherTongueList).then((res: any) => { + this.motherTongueDetails = res.data; + this.stateManagementService.motherTongueDetails = res.data; + }); + } + + getBloodGroupList() { + this.httpRequestService.get(api.bloodGroupList).then((res: any) => { + this.bloodGroupDetails = res.data; + this.stateManagementService.bloodGroupDetails = res.data; + }); + } + + async jaatiRequest() { + const alert = await this.alertController.create({ + cssClass: 'my-custom-class', + header: 'Add Jaati', + message: 'Please add jaati here so admin will review and update in list after approval!', + inputs: [ + { + name: 'jaati', + type: 'text', + placeholder: 'Jaati' + }, + ], + buttons: [ + { + text: 'Ok', + handler: (data) => { + const params = { + name: data.jaati + }; + if (data.jaati) { + this.httpRequestService.post(api.addJaati, params).then((res: any) => { + this.alert.showToaster(res.message); + }); + } else { + this.alert.showToasterError('Please enter jaati for make a request'); + return false; + } + } + }, { + text: 'Cancel', + role: 'cancel', + cssClass: 'secondary', + } + ] + }); + await alert.present(); + } +} diff --git a/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.html b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.html new file mode 100644 index 0000000..9eeb2f2 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.html @@ -0,0 +1,220 @@ + + + + + + {{workData ? 'Edit' : 'Add'}} work info + + + +
+ + + + Profession* + + {{privacy.name}} + + + + + + + + + + + + +
+ + Profession is required. + +
+ + + + + Company name* + + {{privacy.name}} + + + + + + + + +
+ + Company name is required. + +
+
+ + Profession is required. + +
+ + + + Speciality* + + {{privacy.name}} + + + + + + + + +
+ + Speciality is required. + +
+ + + + Position + + {{privacy.name}} + + + + + + + + + + + + Website + + {{privacy.name}} + + + + + + + + + + + + City + + {{privacy.name}} + + + + + + + + + + + + About + + {{privacy.name}} + + + + + + + + + + + + + + + + + + + + + Work Duration + + {{privacy.name}} + + + + + + + + {{startYearValue ? startYearValue : 'Select year'}} + + + + + + + Select year + + + +
+ + * From year is required. + +
+ + + + + {{endYearValue ? endYearValue : 'Select year'}} + + + + + + + Select year + + + +
+ + * To year is required. + +
+
+
+
+ + Save + \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.scss b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.scss new file mode 100644 index 0000000..0fb5bb0 --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.scss @@ -0,0 +1,122 @@ +app-shravak-edit-work { + background: var(--ion-background-content); + + ion-content { + --background: var(--ion-background-content); + + form { + margin: var(--ion-margin-15); + } + + ion-card { + margin: var(--ion-margin-15) 0 0 0; + + ion-card-header { + padding: var(--ion-padding-10) var(--ion-padding-15); + border-bottom: 1px solid #efefef; + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + align-items: center; + + ion-select { + padding: 0px 6px 0 12px; + background: var(--ion-background-content); + border-radius: 10px; + + &::part(icon) { + left: -3px; + width: 12px; + height: 18px; + right: 15px; + } + + &::part(text) { + font-size: var(--ion-font-size-14); + text-transform: capitalize; + font-weight: 500; + line-height: 19px; + } + } + + ion-label { + font-weight: 600; + line-height: 19px; + } + } + } + + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-item { + margin: var(--ion-margin-0); + --min-height: 40px; + + ion-label { + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14) !important; + } + + ion-checkbox { + margin: var(--ion-margin-0); + } + + &.fromdate { + padding: var(--ion-padding-10) var(--ion-padding-15); + + ion-label { + margin-right: var(--ion-margin-15); + width: 43px; + } + + ion-input { + padding: var(--ion-padding-10) !important; + } + } + } + + ion-input { + input { + --padding-start: var(--ion-padding-15); + } + } + + ionic-selectable { + align-self: auto; + margin-right: 10px; + margin-bottom: 0; + padding: var(--ion-padding-0) var(--ion-padding-10); + + .ionic-selectable-inner { + height: 100%; + align-items: center; + + .ionic-selectable-value { + padding-left: 6px; + } + + .ionic-selectable-icon-inner { + top: inherit; + } + } + } + } + } + + ion-checkbox { + margin: var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-15); + } + } + + ion-footer { + padding: var(--ion-padding-0) var(--ion-padding-15); + background: var(--ion-background-content); + + ion-button { + margin: var(--ion-margin-0); + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.ts b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.ts new file mode 100644 index 0000000..9a8868a --- /dev/null +++ b/src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.ts @@ -0,0 +1,190 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { IonicSelectableComponent } from '@components/ionic-selectable/ionic-selectable.component'; +import { api } from '@enums/api.enum'; +import { constants } from '@enums/constants.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse, CompanyDetails, Privacy, ProfessionList } from '@interfaces/common'; +import { WorkForm } from '@interfaces/form'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { format, parseISO } from 'date-fns'; +@Component({ + selector: 'app-shravak-edit-work', + templateUrl: './shravak-edit-work.page.html', + styleUrls: ['./shravak-edit-work.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, FormsModule, ReactiveFormsModule, NgFor, IonicSelectableComponent] +}) +export class ShravakEditWorkPage implements OnInit { + privacyList: Privacy[] = constants.privacy; + workForm: FormGroup; + professionDetails: Array = []; + workId: number; + workData: CompanyDetails; + startYearValue = ''; + endYearValue = ''; + serializedForm: string; + + constructor( + private alert: AlertService, + private httpRequestService: HttpRequestService, + private navCtrl: NavController, + private router: Router + ) { } + + async ngOnInit() { + if (this.router.getCurrentNavigation().extras.state) { + this.workData = this.router.getCurrentNavigation().extras.state.workData; + this.workId = this.workData.id; + this.startYearValue = this.workData.start_year ? this.workData.start_year : ''; + this.endYearValue = this.workData.end_year ? this.workData.end_year : ''; + } + + this.workForm = new FormGroup({ + work_id: new FormControl(this.workId ? this.workId : ''), + company_name: new FormControl(this.workData?.company_name ? this.workData.company_name : '', Validators.required), + company_name_privacy: new FormControl(this.workData?.company_name_privacy ? + this.workData.company_name_privacy : 1, Validators.required), + profession_id: new FormControl(null, Validators.required), + profession_privacy: new FormControl(this.workData?.profession_privacy ? this.workData.profession_privacy : 2, Validators.required), + profession: new FormControl(this.workData?.profession ? this.workData.profession : ''), + profession_speciality: new FormControl(this.workData?.profession_speciality, Validators.required), + profession_speciality_privacy: new FormControl(this.workData?.profession_speciality_privacy ? + this.workData.profession_speciality_privacy : 2, Validators.required), + position: new FormControl(this.workData?.position ? this.workData.position : ''), + position_privacy: new FormControl(this.workData?.position_privacy ? this.workData.position_privacy : 2), + website: new FormControl(this.workData?.website ? this.workData.website : ''), + website_privacy: new FormControl(this.workData?.website_privacy ? this.workData.website_privacy : 2), + city: new FormControl(this.workData?.city ? this.workData.city : ''), + city_privacy: new FormControl(this.workData?.city_privacy), + about: new FormControl(this.workData?.about ? this.workData.about : ''), + about_privacy: new FormControl(this.workData?.about_privacy ? this.workData.about_privacy : 2), + is_working: new FormControl(this.workData?.is_working ? this.workData.is_working : false, Validators.required), + work_duration_privacy: new FormControl(this.workData?.work_duration_privacy ? + this.workData.work_duration_privacy : 2, Validators.required), + start_year: new FormControl(this.workData?.start_year ? this.workData.start_year : '', Validators.required), + end_year: new FormControl(this.workData?.end_year ? this.workData.end_year : ''), + }); + this.getProfessionList(); + this.serializedForm = this.getSerializedForm(this.workForm); + } + + getSerializedForm(form) { + const formObj = form.getRawValue(); + return JSON.stringify(formObj); + } + + getProfessionList() { + this.httpRequestService.get(api.professionList).then((res: CommonResponse) => { + this.professionDetails = res.data; + this.professionDetails.forEach((elem) => { + if (this.workData && (elem.id === this.workData.profession_id)) { + this.workForm.controls.profession_id.setValue(elem); + } + }); + }); + } + + // update validation based on profession selection. Remove validation if Housewife selected + updateValidation() { + ['company_name', 'company_name_privacy', 'profession_speciality', + 'profession_speciality_privacy', 'is_working', 'start_year' + ].forEach(key => { + if (this.workForm.get('profession_id').value?.name === 'Housewife') { + this.workForm.get(key).clearValidators(); + } else { + this.workForm.get(key).setValidators([Validators.required]); + } + this.workForm.get(key).updateValueAndValidity(); + }); + } + + onSubmit() { + this.updateValidation(); + const form = this.workForm; + if (form.value.profession_id?.id) { + if (form.value.profession_id.name !== 'Other') { + form.controls.profession.setValue(form.value.profession_id.name); + } + form.controls.profession_id.setValue(form.value.profession_id); + } + if (!form.valid) { + this.professionDetails.forEach((ele) => { + if (ele.id === form.value.profession_id?.id) { + form.controls.profession_id.setValue(ele); + } + }); + form.markAllAsTouched(); + return; + } + const formWithoutProfId = JSON.parse(JSON.stringify(form.value)); + formWithoutProfId.profession_id = ''; + if (this.serializedForm === JSON.stringify(formWithoutProfId)) { + this.professionDetails.forEach((ele) => { + if (ele.id === form.value.profession_id.id) { + form.controls.profession_id.setValue(ele); + } + }); + this.alert.showToaster('No changes to save'); + return; + } + + const payload = { + ...form.value, + profession_id: form.value.profession_id.id + }; + this.httpRequestService.post(api.updateShravakProfile, { company_details: [payload] }).then((res: CommonResponse) => { + this.professionDetails.forEach((ele) => { + if (ele.id === form.value.profession_id.id) { + form.controls.profession_id.setValue(ele); + } + }); + this.navCtrl.navigateBack(Roots.page + '/' + Roots.shravakAbout); + this.alert.showToaster(res.message); + }).catch(() => { + this.professionDetails.forEach((ele) => { + if (ele.id === form.controls.profession_id.value.id) { + form.controls.profession_id.setValue(ele); + } + }); + }); + } + + formatDate(value, type) { + if (!value) { return; } + if (type === 1) { + this.workForm.controls.start_year.setValue(format(parseISO(value), 'yyyy')); + } else if (type === 2) { + this.workForm.controls.end_year.setValue(format(parseISO(value), 'yyyy')); + } + return format(parseISO(value), 'yyyy'); + } + + onChange(event) { + if (event.detail.checked) { + this.workForm.controls.end_year.clearValidators(); + } else { + this.workForm.controls.end_year.setValidators([Validators.required]); + } + this.workForm.controls.end_year.updateValueAndValidity(); + if (!this.workForm.controls.is_working.value) { + this.workForm.controls.end_year.setValue(''); + this.endYearValue = ''; + } + } + + changeProfession(event) { + if (event.value.id === 10) { + this.workForm.controls.profession.setValidators([Validators.required]); + } else { + this.workForm.controls.profession.clearValidators(); + } + this.workForm.controls.profession.setValue(''); + this.workForm.controls.profession.updateValueAndValidity(); + } + +} diff --git a/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.html b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.html new file mode 100644 index 0000000..2285584 --- /dev/null +++ b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.html @@ -0,0 +1,108 @@ + + + + + Create Account Logo + + + + + + + + + + + + +
+ + + Sant + + + Sangh + + + Shravak + + +
+ +
+ + + + +
+ Welcome Shravak +

Welcome! to your home page

+ Connect with Shravaks you know + Connect to shravak +
+
+ + + + + + +
+
+ + +
+ +
+ +

Welcome! to your home page

+ Find the Sangh and be Member + Find Sangh +
+
+ + + + + + +
+
+ +
+ +
+ +

Welcome! to your home page

+ Search Sants and follow + Search Sant +
+
+ + + + + +
+
+
+
+
+ \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.scss b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.scss new file mode 100644 index 0000000..0b129c8 --- /dev/null +++ b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.scss @@ -0,0 +1,182 @@ +ion-header { + ion-title { + >img { + width: 130px; + margin-left: 10px; + position: relative; + top: -4px; + } + } + + app-message-notification-badge { + float: right; + } + + ion-toolbar { + --background: var(--ion-color-white); + box-shadow: 1px 1px 1px var(--ion-shadow); + border-radius: 0; + } +} + +ion-content { + .header-search { + padding: var(--ion-padding-10) var(--ion-padding-15); + background: var(--ion-color-white); + + ion-item { + width: 100%; + --min-height: 30px; + + ion-input { + height: 30px; + border-color: var(--ion-color); + margin-top: 2px; + } + } + + ion-icon { + background: var(--ion-background-card); + border: 1px solid var(--ion-search-icon); + color: var(--ion-search-icon); + height: 18px; + width: 20px; + padding: 5px; + margin-left: 5px; + border-radius: 5px; + } + } + + .bg { + background: var(--ion-background-content); + min-height: 90%; + + ion-segment { + background: var(--ion-color-white); + width: auto; + box-shadow: 2px 2px 7px var(--ion-shadow); + + ion-segment-button { + min-width: 33.33%; + min-height: 40px; + + ion-label { + margin: 8px var(--ion-margin-0); + line-height: inherit; + font-size: var(--ion-font-size-14); + } + + &.segment-button-checked { + + &::part(indicator) { + --indicator-color: var(--ion-color-sant); + } + + ion-label { + color: var(--ion-color-sant); + } + } + + &:nth-child(2) { + &.segment-button-checked { + --indicator-color: var(--ion-color-sangh); + --ion-color-sant: var(--ion-color-sangh); + } + } + + &:nth-child(3) { + &.segment-button-checked { + --indicator-color: var(--ion-color); + --ion-color-sant: var(--ion-color); + } + } + } + } + + .bottom-bg-location { + + ion-card { + + .welcome-data { + + p { + font-size: var(--ion-font-size-18); + color: var(--ion-color-dark-medium); + font-weight: 600; + + span { + color: var(--ion-color); + display: inline; + } + } + + span { + display: block; + } + + ion-button { + height: 35px; + + &::part(native) { + background-color: var(--ion-color); + } + } + } + } + + .sant { + --ion-background-button: var(--ion-color-sant); + --ion-color: var(--ion-color-sant); + --ion-color-light-text: var(--ion-color-sant); + } + + .sangh { + --ion-background-button: var(--ion-background-content-sangh); + --ion-color: var(--ion-color-sangh); + --ion-color-light-text: var(--ion-color-sangh); + } + } + } +} + +.medical-card { + background: var(--ion-color-white); + box-shadow: 1px 1px 1px var(--ion-shadow); + display: flex; + align-items: center; + margin: 16px 0; + box-shadow: none; + padding: 15px; + font-weight: 600; +} + +.medical-card-content { + display: flex; + align-items: center; +} + +.medical-card-icon { + margin-right: 16px; +} + +.medical-card-icon img { + width: 60px; + height: 60px; +} + +.medical-card-text h3 { + margin: 0; + font-size: 16px; + color: #449353; +} + +.medical-card-text p { + margin: 4px 0 0 0; + font-size: 12px; + color: #333; +} + +.medical-card-text a { + color: #449353; + text-decoration: underline; +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.ts b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.ts new file mode 100644 index 0000000..2a8380f --- /dev/null +++ b/src/app/pages/shravak/shravak-feeds/shravak-feeds.page.ts @@ -0,0 +1,296 @@ +import { NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { App } from '@capacitor/app'; +import { AvatarPercentageComponent } from '@components/avatar-percentage/avatar-percentage.component'; +import { FooterComponent } from '@components/footer/footer.component'; +import { MessageNotificationBadgeComponent } from '@components/message-notification-badge/message-notification-badge.component'; +import { PostComponent } from '@components/post/post.component'; +import { SantPostComponent } from '@components/sant-post/sant-post.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { Dharma, Jaati, PostList, SantActivityList, UserData } from '@interfaces/common'; +import { IonicModule, NavController, Platform, PopoverController } from '@ionic/angular'; +import { CertificateBannerComponent } from '@pages/common/certificate-banner/certificate-banner.component'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-shravak-feeds', + templateUrl: './shravak-feeds.page.html', + styleUrls: ['./shravak-feeds.page.scss'], + standalone: true, + imports: [IonicModule, AvatarPercentageComponent, CertificateBannerComponent, MessageNotificationBadgeComponent, FormsModule, NgSwitch, NgSwitchCase, NgIf, NgFor, + PostComponent, SantPostComponent, FooterComponent] +}) +export class ShravakFeedsPage implements OnInit, OnDestroy { + feedSegment = 'shravak'; + userData: UserData; + dharmaDetails: Array = []; + jaatiDetails: Array = []; + pageNumber = 1; + totalPage = 1; + totalPostCount: number; + santPageNumber = 1; + santTotalPage = 1; + santTotalPostCount: number; + sanghPageNumber = 1; + sanghTotalPage = 1; + sanghTotalPostCount: number; + postList: Array = []; + santPostList: Array = []; + sanghPostList: Array = []; + avatar: string; + noDataFlag: boolean; + spinnerFlag: boolean; + profileCompletionPercentage = 0; + $subscription: Subscription; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navCtrl: NavController, + private stateManagementService: StateManagementService, + private popoverCtrl: PopoverController, + private platform: Platform, + private router: Router, + private cameraGalleryService: CameraGalleryService, + ) { } + + ngOnInit() { + if (this.stateManagementService.dharmaDetails.length > 0) { + this.dharmaDetails = this.stateManagementService.dharmaDetails; + } else { + this.getDharmaDetails(); + } + if (this.stateManagementService.jaatiDetails.length > 0) { + this.jaatiDetails = this.stateManagementService.jaatiDetails; + } else { + this.getJaatiList(); + } + this.$subscription = this.stateManagementService.pushNotyObservable.subscribe(res => { + this.profileCompletionPercentage = res.profile_completion_percentage; + }); + if (this.router?.url?.includes('sangh')) { + this.feedSegment = 'sangh'; + } + this.noDataFlag = this.stateManagementService.noDataFlag; + } + + async ionViewWillEnter() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + this.avatar = this.userData.avatar; + this.totalPage = 1; + this.pageNumber = 1; + this.santPageNumber = 1; + this.santTotalPage = 1; + this.sanghPageNumber = 1; + this.sanghTotalPage = 1; + this.postList = []; + this.santPostList = []; + this.sanghPostList = []; + this.getPostList(false, '', 'post'); + this.getPostList(false, '', 'sant'); + this.getPostList(false, '', 'sangh'); + } + + ionViewDidEnter() { + + // --- check router path and close the app otherwise navigate to back + const checkAndCloseOrPop = () => { + if (this.router.url === ('/' + Roots.page + '/' + Roots.shravakFeeds)) { + App.exitApp(); + } else { + this.navCtrl.pop(); + } + }; + + if (this.platform.is('android')) { + this.platform.ready().then(() => { + this.platform.backButton.subscribeWithPriority(0, async () => { + if (this.popoverCtrl.getTop()) { + const modal = await this.popoverCtrl.getTop(); + if (modal) { + this.popoverCtrl.dismiss(); + return; + } else { + checkAndCloseOrPop(); + } + } else { + checkAndCloseOrPop(); + } + }); + + }); + } + } + + goToProfile() { + this.navCtrl.navigateForward(Roots.page + '/' + Roots.shravakViewProfile); + } + + getDharmaDetails() { + this.httpRequestService.get(api.dharmaDetails).then((res: any) => { + this.dharmaDetails = res.data; + this.stateManagementService.dharmaDetails = res.data; + }); + } + + getJaatiList() { + this.httpRequestService.get(api.jaatiList).then((res: any) => { + this.jaatiDetails = res.data; + this.stateManagementService.jaatiDetails = res.data; + }); + } + + loadData($event, feedType: string) { + this.getPostList(true, $event, feedType); + } + + // --- fetch post list based on your feed type + getPostList(isFirstLoad, event, feedType) { + const assignDataAndPostProcess = (res: any) => { + switch (feedType) { + case 'post': + this.totalPage = res.data.last_page; + this.stateManagementService.noDataFlag = res.data.data.length > 0; + this.noDataFlag = res.data.data.length > 0; + this.spinnerFlag = true; + this.totalPostCount = res.data.total; + this.postList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber = res.data.current_page + 1; + break; + case 'sant': + this.santTotalPage = res.data.last_page; + this.santTotalPostCount = res.data.total; + this.santPostList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.santPageNumber = res.data.current_page + 1; + break; + case 'sangh': + this.sanghTotalPage = res.data.last_page; + this.sanghTotalPostCount = res.data.total; + this.sanghPostList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.sanghPageNumber = res.data.current_page + 1; + break; + default: + break; + } + }; + + if ((feedType === 'post' && this.pageNumber <= this.totalPage) || + (feedType === 'sant' && this.santPageNumber <= this.santTotalPage) || + (feedType === 'sangh' && this.sanghPageNumber <= this.sanghTotalPage)) { + if (feedType === 'post') { + this.httpRequestService.get(api.postList, { + page: this.pageNumber, + limit: 5 + }).then((res: any) => { + assignDataAndPostProcess(res); + }); + } else if (feedType === 'sant' || feedType === 'sangh') { + const url = feedType === 'sant' ? api.santActivityList : api.sanghPostList; + this.httpRequestService.post(url, { + page: feedType === 'sant' ? this.santPageNumber : this.sanghPageNumber, + limit: 5 + }).then((res: any) => { + assignDataAndPostProcess(res); + }); + } + } else { + event.target.complete(); + this.spinnerFlag = false; + } + } + + selectImages() { + this.cameraGalleryService.selectMultipleImage(512, 512, false).then((imageData: Array<{ imgString: string; itemImage: Blob }>) => { + if (imageData && imageData.length > 0) { + imageData.forEach((image) => { + const imageSize = image.itemImage.size / 1048576; // in MB + if (((imageSize <= 10) && (this.stateManagementService.imageArray.length < 3))) { + this.stateManagementService.imageArray.push(image); + } + if ((this.stateManagementService.imageArray.length) >= 3) { + this.alert.showToaster('Max 3 image can be uploaded'); + return; + } + if (imageSize > 10) { + this.alert.showToaster('Image size must be less than 10Mb'); + } + }); + this.moveToCreatePost(); + } + }); + } + + moveToCreatePost() { + const navOption = { + state: { + isUpdate: false, + fromFeed: true, + redirectTo: 'page/shravak-feeds', + type: 1, + type_id: this.userData.id, + userAvatar: this.userData?.avatar, + userName: this.userData?.name + }, + }; + this.navCtrl.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + } + + async onRefresh(event) { + switch (this.feedSegment) { + case 'shravak': + this.pageNumber = 1; + this.totalPage = 1; + this.postList = []; + await this.getPostList(false, '', 'post'); + break; + case 'sant': + this.santPageNumber = 1; + this.santTotalPage = 1; + this.santPostList = []; + await this.getPostList(false, '', 'sant'); + break; + case 'sangh': + this.sanghPageNumber = 1; + this.sanghTotalPage = 1; + this.sanghPostList = []; + await this.getPostList(false, '', 'sangh'); + break; + } + await event.target.complete(); + } + + redirect(type: string) { + this.navCtrl.navigateRoot([`${Roots.page}/${type === 'sant' ? Roots.createNewSant : Roots.createNewSangh}`]); + } + + globalSearch() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.globalSearch], { + state: { + activeTab: 'shravak' + } + }); + } + + goToCertificate() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.certificate]); + } + + goToSangh() { + this.navCtrl.navigateForward([Roots.page + '/' + Roots.createNewSangh]); + } + + ngOnDestroy(): void { + this.$subscription?.unsubscribe(); + } +} diff --git a/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.html b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.html new file mode 100644 index 0000000..2ca6b20 --- /dev/null +++ b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.html @@ -0,0 +1,225 @@ + + + + + + About + + + +
+
Basic info
+ + + +
+ +
+

{{userProfileData?.name}}Name

+
+
+
+ +
+
+
+

{{userProfileData?.gender}}Gender

+
+
+
+ +
+
+
+

{{userProfileData?.birth_date | date: 'dd-MM-yyyy'}}Birthday

+
+
+
+ +
+
+
+

{{userProfileData?.mother_tongue}}Mother tongue

+
+
+
+ +
+
+
+

{{userProfileData?.jati_name}}Jaati

+
+
+
+ +
+
+
+

{{userProfileData?.dharma_name}}Dharm

+
+
+
+ +
+
+
+

{{userProfileData?.blood_group}}Blood Group

+
+
+
+ +
+
+
+

{{userProfileData?.marital_status}}Marital status

+
+
+
+ +
+
+
+

{{userProfileData?.marriage_anniversary | date: 'dd-MM-yyyy'}}Marriage anniversary

+
+
+
+
+
+
Location
+ + + +
+
+
+

{{userProfileData?.location}}Current location

+
+
+
+ +
+
+
+

{{userProfileData?.native_place}}Native place

+
+
+
+
+
+
Contact info
+ + + +
+
+
+

+ {{userProfileData?.country_code}}{{userProfileData?.mobile}}Mobile

+

{{userProfileData?.mobile}}Mobile

+
+
+
+ +
+
+
+

{{userProfileData?.email}}Email

+
+
+
+
+
+
Family members
+ + + +
+
+
+

{{familyDetail?.sent_users?.name}}{{familyDetail?.relation}}

+
+
+
+
+ + +
+
+
+

{{ childData?.name }}{{ relationArray[childData?.relationship] }}

+
+
+
+
+
+
+ Qualification
+ + + +
+
+
+

{{data.university}}University

+

{{data.qualification}}Qualification

+
+

Graduate ({{data.passing_year}})

+
+
+

Currently pursuing

+
+
+
+
+
+ + +
+
+
+

{{data.highschool}}School

+

{{data.qualification}}Qualification

+

Passing year ({{data.passing_year}})

+
+
+
+
+
+
Work
+ + + +
+
+
+

{{data.company_name}}Company name

+
+

{{data.profession}}Profession

+
+

{{data.profession_speciality}}Speciality

+
+

{{data.position}}Position

+
+
+

{{data.website}}Website

+
+
+

{{data.city}}City

+
+
+

{{data.about}}About

+
+
+

({{data.start_year}} - To present)Duration

+

({{data.start_year}} - + {{data.end_year}})Duration

+
+
+
+
+
+
+
+
diff --git a/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.scss b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.scss new file mode 100644 index 0000000..8f8d708 --- /dev/null +++ b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.scss @@ -0,0 +1,189 @@ +app-shravak-other-about { + background: var(--ion-background-content); + + h3 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.25rem var(--ion-margin-0); + font-weight: 700; + } + + ion-button { + margin: var(--ion-margin-15) var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + --border-radius: 0.313rem; + } + + ion-content { + --background: var(--ion-background-content); + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + h5 { + color: var(--ion-color); + font-weight: 600; + + span { + float: right; + } + } + + ion-button { + height: 30px; + min-width: 49%; + color: var(--ion-color); + + &:nth-child(3n) { + margin-left: 2%; + } + + &::part(native) { + --background: var(--ion-background-content); + box-shadow: none; + } + } + + .bg { + background: var(--ion-color-white); + text-align: var(--ion-text-align-center); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + ion-button { + width: 47%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: var(--ion-margin-15); + } + } + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-15) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + margin-bottom: var(--ion-margin-15); + box-shadow: none; + border-radius: 8px; + box-shadow: 2px 2px 7px #ebebeb; + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + margin-bottom: var(--ion-margin-10); + align-items: center; + + ion-icon { + width: 19px; + height: 19px; + padding: 10px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + + &:last-child { + margin-bottom: var(--ion-margin-0); + } + + .left-data { + display: flex; + align-items: center; + + .icons { + width: 39px; + height: 39px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + + &.family-members { + padding: var(--ion-padding-0); + overflow: hidden; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + word-break: break-word; + + span { + color: var(--ion-content-color); + font-size: var(--ion-font-size-14); + display: block; + } + + &.points { + font-size: var(--ion-font-size-12); + color: var(--ion-content-color); + display: flex; + margin-top: 2px; + + ion-icon { + background: none; + width: 12px; + height: 12px; + margin: var(--ion-margin-0) 2px var(--ion-margin-0) var(--ion-margin-0); + padding: var(--ion-padding-0); + color: var(--ion-content-color); + } + } + } + + &.qualification { + align-items: flex-start; + margin-bottom: var(--ion-margin-15); + + .mid-content { + margin: var(--ion-margin-10) var(--ion-margin-0); + } + } + + .content { + width: calc(100% - 49px); + } + } + + .edit-icon { + width: 25px; + height: 25px; + padding: var(--ion-padding-0); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + display: flex; + align-items: center; + justify-content: center; + } + } + } + + &.family-card { + ion-card-header { + margin-bottom: var(--ion-margin-15); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.ts b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.ts new file mode 100644 index 0000000..77fbaca --- /dev/null +++ b/src/app/pages/shravak/shravak-other-about/shravak-other-about.page.ts @@ -0,0 +1,28 @@ +import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { constants } from '@enums/constants.enum'; +import { Privacy, ProfileData } from '@interfaces/common'; +import { IonicModule } from '@ionic/angular'; + +@Component({ + selector: 'app-shravak-other-about', + templateUrl: './shravak-other-about.page.html', + styleUrls: ['./shravak-other-about.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, DatePipe] +}) +export class ShravakOtherAboutPage implements OnInit { + userProfileData: ProfileData; + privacyList: Privacy[] = constants.privacy; + relationArray = ['', 'Son', 'Daughter']; + constructor( + private router: Router + ) { } + + ngOnInit() { + if (this.router.getCurrentNavigation().extras.state) { + this.userProfileData = this.router.getCurrentNavigation().extras.state.userData; + } + } +} diff --git a/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.html b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.html new file mode 100644 index 0000000..28b8daa --- /dev/null +++ b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.html @@ -0,0 +1,111 @@ + + + + + + Shravak profile + + + + + + + + + Share + + + + Report user + + + + {{ userProfileData?.is_blocked ? 'Unblock' : 'Block' }} user + + + + + + + +
+ + + + +

{{userProfileData?.name}}

+

{{userProfileData?.profession}}

+
karmā points | + {{userProfileData?.karma_dhan}} +
+
+ + Connect + Requested + Connected + + + Accept + + + Delete + + + + +
+
+
+
+ + + +
+

Connections{{userProfileData?.friend_count}}

+
+
+
+ + + +
+

Sangh member{{userProfileData?.sangh_member_count}}

+
+
+
+
+
+ + + +
+

Dharm{{userProfileData?.dharma_name}}

+
+ + +

Native Place{{userProfileData?.native_place}}

+
+ + +

Current Location{{userProfileData?.location}}

+
+
+ See about info +
+
+ + + + + + +
+
+ diff --git a/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.scss b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.scss new file mode 100644 index 0000000..bc445b5 --- /dev/null +++ b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.scss @@ -0,0 +1,397 @@ +app-shravak-other-profile { + background: var(--ion-background-content); + + h3 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.15rem var(--ion-margin-0); + font-weight: 700; + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-header { + ion-toolbar { + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-content { + --background: var(--ion-background-content); + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: 0; + color: var(--ion-content-color); + } + + .profile-bg { + width: 8.875rem; + height: 8.875rem; + margin: var(--ion-margin-0) auto; + background: url(/assets/images/profile-bg-design.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + + img { + border: 2px solid #fff; + border-radius: var(--ion-border-radius-100); + width: 6.25rem; + height: 6.25rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + } + } + + ion-button { + height: 30px; + } + + .bg { + background: var(--ion-color-white); + text-align: var(--ion-text-align-center); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + .points { + font-size: var(--ion-font-size-12); + border: 1px solid #0000001A; + padding: 5px 10px; + border-radius: 15px; + margin: var(--ion-margin-0) auto var(--ion-margin-15); + display: flex; + align-items: center; + width: max-content; + + ion-icon { + color: #FFA500; + margin-right: 3px; + } + + span { + color: #FFA500; + margin-left: 3px; + } + } + + p { + margin-bottom: 5px; + } + + ion-button { + min-width: 30%; + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + + &.delete { + &::part(native) { + --background: #e7e7e7; + color: var(--ion-color); + } + } + + &:last-child { + min-width: auto; + margin: var(--ion-margin-0); + + ion-icon { + margin: var(--ion-margin-0); + } + } + } + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + margin-bottom: var(--ion-margin-15); + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + + ion-icon { + width: 1.438rem; + height: 1.438rem; + padding: 0.375rem; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + } + } + } + + ion-card-content { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0); + display: flex; + justify-content: space-between; + + p { + padding: var(--ion-padding-0); + + span { + color: var(--ion-color); + } + + a { + span { + color: var(--ion-color, #3880ff); + } + } + } + } + + &.detail { + padding: var(--ion-padding-0); + border-radius: 0; + + ion-card-header { + padding: var(--ion-padding-10); + background: #E7F7FE; + border-top: 2px solid var(--ion-color); + + img { + width: 2.625rem; + height: 2.625rem; + margin-right: var(--ion-margin-10); + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + display: flex; + align-items: center; + justify-content: center; + object-fit: cover; + } + + ion-card-title { + font-size: var(--ion-font-size-14); + position: relative; + align-items: center; + margin: var(--ion-margin-0); + + div { + width: calc(100% - 52px); + + p { + font-size: var(--ion-font-size-14); + margin: var(--ion-margin-0); + color: #000; + font-weight: 600; + display: inline; + padding: 0; + word-break: break-word; + } + + span { + font-size: var(--ion-font-size-12); + color: #70B2CC; + margin-top: 0.313rem; + font-weight: 500; + + &:last-child { + display: block; + } + } + } + + ion-icon { + margin: var(--ion-margin-0); + background: none; + color: var(--ion-content-color); + padding: var(--ion-padding-0); + } + } + + p { + margin: 0; + font-size: 12px; + display: inline-block; + margin-top: 5px; + border-radius: 10px; + color: #2482a7; + padding: var(--ion-padding-0); + } + } + + ion-card-content { + display: block; + + p { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-10); + color: #000; + } + + .img-upload { + flex-wrap: wrap; + + swiper-container { + swiper-slide { + text-align: center; + background: #f9f9f9; + } + + &::part(pagination) { + position: absolute; + margin: 5px var(--ion-margin-0) var(--ion-margin-0) var(--ion-margin-0); + bottom: 0px; + background-color: rgba(0, 0, 0, 0.43) !important; + } + + &::part(bullet) { + background-color: rgba(0, 0, 0, 0.43); + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color); + } + } + } + + .footer-icon { + display: flex; + justify-content: space-between; + padding: var(--ion-padding-10); + + div { + display: flex; + align-items: center; + color: #000; + font-weight: 600; + + span { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10); + min-width: 30px; + } + } + + ion-icon { + width: 1.5rem; + height: 1.5rem; + color: var(--ion-color); + + &.heart { + color: red; + } + } + } + } + } + } + + .sangh-members { + display: flex; + justify-content: space-between; + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + padding: 5px; + width: 48%; + + ion-card-header { + ion-card-title { + div { + width: 43px; + height: 43px; + border-radius: 7px; + background: var(--ion-background-content); + display: flex; + align-items: center; + justify-content: center; + + &.green { + background: #f5f0ff; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-12); + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + font-weight: 500; + width: calc(100% - 51px); + + span { + display: block; + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + } + } + } + } + } + } + + .about-info { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + ion-card-header { + ion-card-title { + margin-bottom: var(--ion-margin-10); + align-items: center; + + p { + display: flex; + justify-content: space-between; + align-items: center; + width: calc(100% - 45px); + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + + span { + color: #000; + text-align: right; + width: 50%; + } + } + + .icons { + width: 35px; + height: 35px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + } + } + + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.ts b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.ts new file mode 100644 index 0000000..be8d7aa --- /dev/null +++ b/src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.ts @@ -0,0 +1,192 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component, NgZone, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Share, ShareOptions } from '@capacitor/share'; +import { FooterComponent } from '@components/footer/footer.component'; +import { PostComponent } from '@components/post/post.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { CommonResponse, ProfileData, ProfileResponse, UserData } from '@interfaces/common'; +import { IonicModule, NavController } from '@ionic/angular'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-shravak-other-profile', + templateUrl: './shravak-other-profile.page.html', + styleUrls: ['./shravak-other-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, NgFor, PostComponent, FooterComponent] +}) +export class ShravakOtherProfilePage implements OnInit { + userProfileData: ProfileData; + userData: UserData; + postList = []; + pageNumber = 1; + totalPage = 1; + constructor( + private cRoute: ActivatedRoute, + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navController: NavController, + private ngZone: NgZone, + private stateManagementService: StateManagementService, + public utilityService: UtilityService + ) { } + + async ngOnInit() { + this.userData = await this.stateManagementService.storage.get(GJainStorage.userData); + } + + ionViewWillEnter() { + this.getProfileInfo(); + this.pageNumber = 1; + this.getPostList(false, ''); + this.postList = []; + } + + getProfileInfo() { + this.httpRequestService.get(api.shravakPublicProfile.replace('{id}', this.cRoute.snapshot.paramMap.get('id'))) + .then((res: ProfileResponse) => { + this.userProfileData = res.data; + this.userProfileData.is_blocked = res.data.is_blocked; + }); + } + + getPostList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get(api.userPostList, { + page: this.pageNumber, + limit: 5, + user_id: this.cRoute.snapshot.paramMap.get('id') + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.postList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + this.pageNumber++; + }); + } else { + event.target?.complete(); + } + } + + loadData($event) { + this.getPostList(true, $event); + } + + goToAboutInfo() { + const navOption = { + state: { + userData: this.userProfileData, + }, + }; + this.navController.navigateForward(Roots.page + '/' + Roots.shravakAboutOther, navOption); + } + + async shareProfile() { + const options: ShareOptions = { + url: `${environment.siteUrl}/page/shravak-other-profile/${this.userProfileData.id}`, + }; + await Share.share(options); + } + + sendConnectionRequest(id: number, status: number, actionStatus?: number) { + if (status === 0 || status === 1) { + this.confirmationAlert(status, id); + } else { + if (status === 4) { + this.httpRequestService.post(api.connectionRequestSend, { receiver_id: id }) + .then((res: CommonResponse) => { + this.userProfileData.request_status = 0; + this.alert.showToaster(res.message); + }); + } else if (status === 3) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status: actionStatus }) + .then((res: CommonResponse) => { + if (actionStatus === 1) { + this.userProfileData.request_status = 1; + } else { + this.userProfileData.request_status = 4; + } + this.alert.showToaster(res.message); + }); + } + } + } + + async confirmationAlert(status, id?) { + let message = ''; + if (status === 0) { + message = 'Are you sure about to cancel this request?'; + } else if (status === 1) { + message = 'Are you sure you want to remove User ' + this.userProfileData.name + ' from your connection?'; + } + const isYes = await this.utilityService.presentConfirm(message); + if (isYes) { + this.httpRequestService.post(api.connectionRequestStatusUpdate, { receiver_id: id, status: 2 }) + .then((res: CommonResponse) => { + this.userProfileData.request_status = 4; + this.alert.showToaster(res.message); + }); + } + } + + moveToMessage() { + this.ngZone.run(() => this.navController.navigateForward([Roots.page + '/' + Roots.messageChat, { + userId: this.userProfileData?.id, + name: this.userProfileData?.name + }])).then(); + } + + + goToFriendList() { + if (this.userProfileData.request_status === 1) { + this.navController.navigateForward([Roots.page + '/' + Roots.friendList, { id: this.cRoute.snapshot.paramMap.get('id') }]); + } + } + viewAllSangh(sanghListType) { + if (this.userProfileData.id && this.userProfileData.request_status === 1) { + this.navController.navigateForward([ + Roots.page + '/' + Roots.viewAllSangh.replace(':sanghListType', sanghListType), + { id: this.userProfileData.id } + ]); + } + } + + address(type: string) { + if (type === 'native') { + this.utilityService.openGoogleMap(this.userProfileData.native_latitude, this.userProfileData.native_longitude); + } else if (type === 'current') { + this.utilityService.openGoogleMap(this.userProfileData.latitude, this.userProfileData.longitude); + } + } + + openReport() { + this.utilityService.openReport({ userId: this.userProfileData.id, type: 'shravak' }); + } + + async blockUser() { + const isYes = await this.utilityService.presentConfirm( + `Are you sure you want to ${this.userProfileData.is_blocked ? 'unblock' : 'block'} this user?` + ); + if (isYes) { + const status = this.userProfileData.is_blocked ? 0 : 1; // 0: Unblock, 1: Block + this.alert.showLoader(); + this.httpRequestService.post(api.blockThisUser, { + id: this.userProfileData.id, + status // 0: Unblock, 1: Block + }) + .then((res: CommonResponse) => { + this.userProfileData.is_blocked = status; + this.userProfileData.request_status = 4; + this.alert.showToaster(res.message); + }).finally(() => { + this.alert.hideLoader(); + }); + } + } +} diff --git a/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.html b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.html new file mode 100644 index 0000000..695150c --- /dev/null +++ b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.html @@ -0,0 +1,95 @@ + + + + + + Shravak profile + + + + +
+
+ +
+ + + +
+
+ +
+

{{userProfileData?.name}}

+

{{userProfileData?.profession}}

+
+ karmā points | + {{userProfileData?.karma_dhan}} +
+ + + +
+   Create post +   Edit profile +
+
+
+
+ + + +
+

Connected{{userProfileData?.friend_count}}

+
+
+
+ + + +
+

Sangh member{{userProfileData?.sangh_member_count}}

+
+
+
+
+
+ + + +
+

Dharm{{userProfileData?.dharma_name}}

+
+ +
+

Native Place{{userProfileData?.native_place}}

+
+ +
+

Current Location{{userProfileData?.location}}

+
+
+ See your about info +
+
+ + + + + + +
+
diff --git a/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.scss b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.scss new file mode 100644 index 0000000..364dee5 --- /dev/null +++ b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.scss @@ -0,0 +1,370 @@ +app-shravak-view-profile { + background: var(--ion-background-content); + + h3 { + padding: var(--ion-padding-0) var(--ion-padding-15); + margin: var(--ion-margin-0) var(--ion-margin-0) 0.25rem; + font-weight: 700; + } + + ion-button { + margin: var(--ion-margin-0) var(--ion-margin-15); + --border-radius: 0.313rem; + } + + ion-header { + ion-toolbar { + ion-icon { + font-size: var(--ion-font-size-24); + } + } + } + + ion-content { + --background: var(--ion-background-content); + + p { + font-size: var(--ion-font-size-14); + padding: var(--ion-padding-0) var(--ion-padding-15); + margin-top: var(--ion-margin-0); + color: var(--ion-content-color); + } + + .profile-bg { + width: 8.875rem; + height: 8.875rem; + margin: var(--ion-margin-0) auto 1rem auto; + background: url(/assets/images/profile-bg-design.svg) no-repeat center center; + display: flex; + align-items: center; + justify-content: center; + background-size: contain; + + .complete-progress { + border: 0.1rem solid #a3c5d3; + border-radius: var(--ion-border-radius-100); + width: 6.25rem; + height: 6.25rem; + padding: 3px; + background: conic-gradient(var(--ion-color) var(--progress), var(--ion-background-button) 0deg); + overflow: hidden; + + >img { + border-radius: var(--ion-border-radius-100); + padding: 1px; + background: var(--ion-color-white); + width: 100%; + height: 100%; + } + } + } + + ion-button { + height: 1.875rem; + } + + .bg { + background: var(--ion-color-white); + text-align: var(--ion-text-align-center); + padding: var(--ion-padding-15); + margin-bottom: var(--ion-margin-15); + + .points { + font-size: var(--ion-font-size-12); + border: 0.063rem solid #0000001A; + padding: 0.313rem 0.625rem; + border-radius: 0.938rem; + margin: var(--ion-margin-0) auto var(--ion-margin-15); + display: flex; + align-items: center; + width: max-content; + + ion-icon { + color: #FFA500; + margin-right: 3px; + } + + span { + color: #FFA500; + margin-left: 3px; + } + } + + ion-button { + width: 47%; + margin: var(--ion-margin-0); + + &:last-child { + margin-left: var(--ion-margin-15); + } + + &.edit { + &::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + + ion-avatar { + position: relative; + + ion-button { + position: absolute; + right: 1.25rem; + bottom: 2.063rem; + width: 1.563rem; + height: 1.563rem; + min-height: 1.563rem; + + &::part(native) { + padding: 0.375rem; + border-radius: var(--ion-border-radius-100); + } + + img { + border: 0; + border-radius: 0; + width: auto; + height: auto; + background: none; + } + } + } + + .update-profile-link { + font-size: 10px; + box-shadow: 0px 0px 7px #0000001A; + padding: 2px 5px; + border-radius: 8px; + position: absolute; + bottom: 13px; + left: 50%; + background: #fff; + transform: translate(-50%, 0); + } + } + + .bottom-bg-location { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-15); + margin-bottom: 16px; + + ion-card { + margin: var(--ion-margin-0); + padding: var(--ion-padding-10); + margin-bottom: var(--ion-margin-15); + + ion-card-header { + padding: var(--ion-padding-0); + + ion-card-title { + font-size: var(--ion-font-size-14); + display: flex; + justify-content: space-between; + } + } + + ion-card-content { + padding: var(--ion-padding-0); + justify-content: space-between; + + p { + padding: var(--ion-padding-0); + + span { + color: var(--ion-color); + } + + a { + span { + color: var(--ion-color, #3880ff); + } + } + } + } + + &.detail { + border-radius: 0; + padding: var(--ion-padding-0); + + ion-card-header { + padding: var(--ion-padding-10); + background: #E7F7FE; + border-top: 2px solid var(--ion-color); + border-bottom: 2px solid var(--ion-color); + + + ion-card-title { + align-items: center; + margin: var(--ion-margin-0); + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + width: calc(100% - 23px); + } + + ion-icon { + margin: var(--ion-margin-0); + } + + } + + p { + margin: 0; + display: inline-block; + padding: var(--ion-padding-0); + } + } + + ion-card-content { + display: block; + + + .footer-icon { + display: flex; + justify-content: space-between; + + div { + display: flex; + align-items: center; + color: #000; + font-weight: 600; + + span { + padding: var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10); + min-width: 30px; + } + } + + ion-icon { + width: 1.5rem; + height: 1.5rem; + color: var(--ion-color); + } + } + } + } + } + + .sangh-members { + display: flex; + justify-content: space-between; + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + padding: 0.313rem; + width: 48%; + + ion-card-header { + ion-card-title { + div { + width: 2.688rem; + height: 2.688rem; + border-radius: 0.438rem; + background: var(--ion-background-content); + display: flex; + align-items: center; + justify-content: center; + + &.green { + background: #f5f0ff; + } + } + + p { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-12); + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: calc(100% - 3.213rem); + + span { + display: block; + font-size: var(--ion-font-size-14); + color: #000; + font-weight: 600; + } + } + } + } + } + } + + .about-info { + padding: var(--ion-padding-0) var(--ion-padding-15); + + ion-card { + ion-card-header { + ion-card-title { + margin-bottom: var(--ion-margin-10); + + p { + display: flex; + justify-content: space-between; + align-items: center; + width: calc(100% - 45px); + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + font-size: var(--ion-font-size-14); + + span { + color: #000; + width: 50%; + text-align: right; + font-weight: 500; + } + } + + .icons { + width: 35px; + height: 35px; + padding: 8px; + background: var(--ion-background-content); + border-radius: var(--ion-border-radius-100); + color: var(--ion-color); + margin-right: var(--ion-margin-10); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + } + } + } + + ion-button { + margin: var(--ion-margin-0); + + &::part(native) { + --background: var(--ion-background-button); + color: var(--ion-color); + } + } + } + } + } + } + + .profile-complete-indicator { + margin: 10px 0; + padding: 10px; + } +} + +ion-popover { + ion-content { + ion-list { + padding: var(--ion-padding-0); + + ion-item { + ion-label { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + } + } + } + } +} \ No newline at end of file diff --git a/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.ts b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.ts new file mode 100644 index 0000000..2b72831 --- /dev/null +++ b/src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.ts @@ -0,0 +1,206 @@ +import { NgFor, NgIf } from '@angular/common'; +import { Component } from '@angular/core'; +import { Share, ShareOptions } from '@capacitor/share'; +import { PostComponent } from '@components/post/post.component'; +import { ProfileCompleteIndicatorComponent } from '@components/profile-complete-indicator/profile-complete-indicator.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { environment } from '@environments/environment'; +import { CommonResponse, ProfileData, ProfileResponse } from '@interfaces/common'; +import { ActionSheetController, IonicModule, NavController, PopoverController } from '@ionic/angular'; +import { SafeUrlPipe } from '@pipes/safe-url.pipe'; +import { AlertService } from '@services/alert.service'; +import { CameraGalleryService } from '@services/camera-gallery.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +import { UtilityService } from '@services/utility.service'; + +@Component({ + selector: 'app-shravak-view-profile', + templateUrl: './shravak-view-profile.page.html', + styleUrls: ['./shravak-view-profile.page.scss'], + standalone: true, + imports: [IonicModule, NgIf, ProfileCompleteIndicatorComponent, NgFor, PostComponent, SafeUrlPipe] +}) +export class ShravakViewProfilePage { + userProfileData: ProfileData; + postList = []; + pageNumber = 1; + totalPage = 1; + totalCount: number; + photo: any; + popover: HTMLIonPopoverElement = null; + profileCompletionPercentage = 0; + + constructor( + private httpRequestService: HttpRequestService, + private alert: AlertService, + private navController: NavController, + private stateManagementService: StateManagementService, + private popoverCtrl: PopoverController, + public actionSheetCtrl: ActionSheetController, + private cameraGalleryService: CameraGalleryService, + public utilityService: UtilityService + ) { } + + ionViewWillEnter() { + this.postList = []; + this.getProfileInfo(); + this.pageNumber = 1; + this.totalPage = 1; + this.getPostList(false, ''); + } + + getProfileInfo() { + this.httpRequestService.get(api.shravakProfile).then(async (res: ProfileResponse) => { + this.userProfileData = res.data; + this.profileCompletionPercentage = +this.userProfileData?.profile_statistics?.profile_completion_percentage; + + this.stateManagementService.userProfileData = res.data; + this.stateManagementService.storage.set(GJainStorage.profileData, res.data); + + const userData = await this.stateManagementService.storage.get(GJainStorage.userData); + userData.avatar = res.data.avatar; + this.stateManagementService.storage.set(GJainStorage.userData, userData); + + this.stateManagementService.generalData.profile_completion_percentage = this.profileCompletionPercentage; + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + }); + } + + getPostList(isFirstLoad, event) { + if (this.pageNumber <= this.totalPage) { + this.httpRequestService.get(api.userPostList, { + page: this.pageNumber, + limit: 5, + }).then((res: any) => { + this.totalPage = res.data.last_page; + this.pageNumber = res.data.current_page + 1; + this.totalCount = res.data.total; + this.postList.push(...res.data.data); + if (isFirstLoad) { event.target.complete(); } + }); + } else { + event.target.complete(); + } + } + + loadData($event) { + this.getPostList(true, $event); + } + + async updatePost(postInfo) { + await this.popoverCtrl.dismiss().then(() => { + const navOption = { + state: { + postData: postInfo, + isUpdate: true, + redirectTo: Roots.page + '/' + Roots.shravakViewProfile, + type: postInfo.type ? postInfo.type : 1, + type_id: postInfo.type_id ? postInfo.type_id : postInfo.created_by.id, + userAvatar: this.userProfileData?.avatar, + userName: this.userProfileData?.name + }, + }; + this.navController.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + this.popoverCtrl.dismiss(); + }); + } + + async deletePost(postId) { + await this.popoverCtrl.dismiss().then(() => { + this.presentAlert(postId); + this.popoverCtrl.dismiss(); + }); + } + + async presentAlert(postId) { + const isYes = await this.utilityService.presentConfirm( + 'Are you sure you want to delete this post?', + 'No', 'Yes', 'Delete post' + ); + if (isYes) { + this.httpRequestService.delete(api.deletePost + '/' + postId).then((res: any) => { + this.postList = []; + this.pageNumber = 1; + this.getPostList(false, ''); + this.alert.showToaster(res.message); + }); + } + } + + + goToAboutInfo(from?: string) { + const navOption = { + state: { + userData: this.userProfileData, + from: from ? from : '' + }, + }; + this.navController.navigateForward(Roots.page + '/' + Roots.shravakAbout, navOption); + } + + moveToCreatePost() { + const navOption = { + state: { + isUpdate: false, + redirectTo: Roots.page + '/' + Roots.shravakViewProfile, + type: 1, + type_id: this.userProfileData.id, + userAvatar: this.userProfileData?.avatar, + userName: this.userProfileData?.name + }, + }; + this.navController.navigateForward(Roots.page + '/' + Roots.postFeed, navOption); + } + + + async shareProfile() { + const options: ShareOptions = { + url: `${environment.siteUrl}/page/shravak-other-profile/${this.userProfileData.id}`, + }; + await Share.share(options); + } + + async selectProfileImage() { + this.cameraGalleryService.selectImage(512, 512, true).then((imageData: { imgString: string; itemImage: Blob }) => { + if (imageData) { + const imageSize = imageData.itemImage.size / 1048576; // in MB + if (imageSize <= 10) { + const formdata = new FormData(); + formdata.append('avatar', imageData.itemImage); + this.httpRequestService.post(api.updateShravakProfile, formdata).then(async (res: CommonResponse) => { + this.userProfileData.avatar = imageData.imgString; + this.getProfileInfo(); + this.alert.hideLoader(); + this.alert.showToaster(res.message); + }); + } + if (imageSize > 10) { + this.alert.showToaster('Image size must be less than 10Mb'); + } + } + }); + } + + goToFriendList() { + if (this.userProfileData && this.userProfileData.friend_count > 0) { + this.navController.navigateForward([Roots.page + '/' + Roots.friendRequest]); + } + } + + viewAllSangh(sanghListType) { + if (this.userProfileData && this.userProfileData.sangh_member_count > 0) { + this.navController.navigateForward(`page/view-all-sangh/${sanghListType}`); + } + } + + address(type: string) { + if (type === 'native') { + this.utilityService.openGoogleMap(this.userProfileData.native_latitude, this.userProfileData.native_longitude); + } else if (type === 'current') { + this.utilityService.openGoogleMap(this.userProfileData.latitude, this.userProfileData.longitude); + } + } +} diff --git a/src/app/pipes/add-hours.pipe.ts b/src/app/pipes/add-hours.pipe.ts new file mode 100644 index 0000000..b23358c --- /dev/null +++ b/src/app/pipes/add-hours.pipe.ts @@ -0,0 +1,23 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'addHours', + standalone: true +}) +export class AddHoursPipe implements PipeTransform { + + transform(value: string, hours = 48): string { + if (!value) return ''; + + const inputDate = new Date(value); + const outputDate = new Date(inputDate.getTime() + hours * 60 * 60 * 1000); + + const day = String(outputDate.getDate()).padStart(2, '0'); + const month = String(outputDate.getMonth() + 1).padStart(2, '0'); + const year = String(outputDate.getFullYear()).slice(-2); + const hoursStr = String(outputDate.getHours()).padStart(2, '0'); + const minutes = String(outputDate.getMinutes()).padStart(2, '0'); + + return `${day}-${month}-${year} | ${hoursStr}:${minutes}`; + } +} diff --git a/src/app/pipes/clickable-link.pipe.ts b/src/app/pipes/clickable-link.pipe.ts new file mode 100644 index 0000000..d6d7311 --- /dev/null +++ b/src/app/pipes/clickable-link.pipe.ts @@ -0,0 +1,18 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { UtilityService } from '@services/utility.service'; + +@Pipe({ + name: 'clickableLink', + standalone: true +}) +export class ClickableLinkPipe implements PipeTransform { + + constructor( + private utilityService: UtilityService + ) { } + + transform(value) { + return value && this.utilityService.convertLinksToClickableLinks(value); + } + +} diff --git a/src/app/pipes/highlight-mentions.pipe.ts b/src/app/pipes/highlight-mentions.pipe.ts new file mode 100644 index 0000000..21993d5 --- /dev/null +++ b/src/app/pipes/highlight-mentions.pipe.ts @@ -0,0 +1,23 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { PostList } from '@interfaces/common'; + +@Pipe({ + name: 'highlightMentions', + standalone: true +}) +export class HighlightMentionsPipe implements PipeTransform { + + transform(text: string, mentions: PostList['mentions']): string { + if (text && mentions?.length) { + mentions.forEach((mention) => { + const regex = new RegExp(`@${mention.name}`, 'g'); + text = text.replace( + regex, + `@${mention.name}` + ); + }); + } + return text; + } + +} diff --git a/src/app/pipes/local-date.pipe.ts b/src/app/pipes/local-date.pipe.ts new file mode 100644 index 0000000..31b12bc --- /dev/null +++ b/src/app/pipes/local-date.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'localDate', + standalone: true +}) +export class LocalDatePipe implements PipeTransform { + + transform(value: any): any { + return value ? new Date(value) : false; + } +} diff --git a/src/app/pipes/message-time.pipe.ts b/src/app/pipes/message-time.pipe.ts new file mode 100644 index 0000000..ff3418d --- /dev/null +++ b/src/app/pipes/message-time.pipe.ts @@ -0,0 +1,52 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'messageTime', + standalone: true +}) +export class MessageTimePipe implements PipeTransform { + + transform(someDateTimeStamp: string): void | string { + if (someDateTimeStamp) { + const dt = new Date(someDateTimeStamp); + const today = new Date(); + const yesterday = new Date(Date.now() - 86400000); + if (dt.getDate() === today.getDate() && + dt.getMonth() === today.getMonth() && + dt.getFullYear() === today.getFullYear()) { + return this.formatAMPM(dt); + } else if (dt.getDate() === yesterday.getDate() && + dt.getMonth() === yesterday.getMonth() && + dt.getFullYear() === yesterday.getFullYear()) { + return 'Yesterday'; + } else if (this.getDaysDifferenceFromToday(dt) <= 7) { + return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][dt.getDay()]; + } else { + return this.getMMDDYYFormat(dt); + } + } + } + + formatAMPM(date: Date) { + let hours = date.getHours(); + let minutes = date.getMinutes().toString(); + const ampm = hours >= 12 ? 'pm' : 'am'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + minutes = (+minutes) < 10 ? '0' + minutes : minutes; + const strTime = hours + ':' + minutes + ' ' + ampm; + return strTime; + } + + getDaysDifferenceFromToday(date2: Date) { + const diffTime = Math.abs(date2.valueOf() - new Date().valueOf()); + return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + } + + getMMDDYYFormat(date: Date) { + return ('0' + (date.getMonth() + 1)).slice(-2) + '/' + + ('0' + date.getDate()).slice(-2) + '/' + + date.getFullYear().toString().slice(2); + } + +} diff --git a/src/app/pipes/plural-singular.pipe.ts b/src/app/pipes/plural-singular.pipe.ts new file mode 100644 index 0000000..7f078d2 --- /dev/null +++ b/src/app/pipes/plural-singular.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'pluralSingular' +}) +export class PluralSingularPipe implements PipeTransform { + + transform(num: number, singularText: string, pluralText: string = null, counts = true): string { + const pluralWord = pluralText ? pluralText : `${singularText}s`; + if (counts) { + return num > 1 ? `${num} ${pluralWord}` : `${num} ${singularText}` ; + } else { + return num > 1 ? `${pluralWord}` : `${singularText}` ; + } + } + +} diff --git a/src/app/pipes/safe-html.pipe.ts b/src/app/pipes/safe-html.pipe.ts new file mode 100644 index 0000000..2176f62 --- /dev/null +++ b/src/app/pipes/safe-html.pipe.ts @@ -0,0 +1,16 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +@Pipe({ + name: 'safeHtml', + standalone: true +}) +export class SafeHtmlPipe implements PipeTransform { + + constructor(private sanitizer: DomSanitizer) {} + + transform(value: string): SafeHtml { + return value && this.sanitizer.bypassSecurityTrustHtml(value); + } + +} diff --git a/src/app/pipes/safe-url.pipe.ts b/src/app/pipes/safe-url.pipe.ts new file mode 100644 index 0000000..37669b0 --- /dev/null +++ b/src/app/pipes/safe-url.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ + name: 'safeUrl', + standalone: true +}) +export class SafeUrlPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) { + + } + + transform(value: any): any { + if (value.indexOf('https://') === 0) { + return this.sanitizer.bypassSecurityTrustResourceUrl(value); + } else { + return this.sanitizer.bypassSecurityTrustUrl(value); + } + } + +} diff --git a/src/app/pipes/sanitize-html.pipe.ts b/src/app/pipes/sanitize-html.pipe.ts new file mode 100644 index 0000000..f021c00 --- /dev/null +++ b/src/app/pipes/sanitize-html.pipe.ts @@ -0,0 +1,16 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +@Pipe({ + name: 'sanitizeHtml' +}) +export class SanitizeHtmlPipe implements PipeTransform { + + constructor(private sanitizer: DomSanitizer) { + } + + transform(v: string): SafeHtml { + return this.sanitizer.bypassSecurityTrustHtml(v); + } + +} diff --git a/src/app/services/alert.service.ts b/src/app/services/alert.service.ts new file mode 100644 index 0000000..62d9182 --- /dev/null +++ b/src/app/services/alert.service.ts @@ -0,0 +1,66 @@ +import { Injectable } from '@angular/core'; +import { LoadingController, ToastController } from '@ionic/angular'; + +@Injectable({ + providedIn: 'root' +}) +export class AlertService { + isLoading = false; + + private readonly TOAST_DURATION = 3000; + private readonly TOAST_POSITION = 'top'; + private readonly SUCCESS_TOAST_CLASS = 'success-toast'; + private readonly ERROR_TOAST_CLASS = 'error-toast'; + + constructor( + private toastCtrl: ToastController, + private loadingCtrl: LoadingController, + ) { } + + async showLoader() { + this.isLoading = true; + const loading = await this.loadingCtrl.create({ duration: 7000 }); + await loading.present(); + if (!this.isLoading) { + await loading.dismiss(); + } + } + + async hideLoader() { + this.isLoading = false; + await this.loadingCtrl.dismiss(); + } + + async showToaster(text: string) { + if (text) { + const toast = await this.toastCtrl.create({ + message: text, + duration: this.TOAST_DURATION, + position: this.TOAST_POSITION, + cssClass: this.SUCCESS_TOAST_CLASS, + }); + await toast.present(); + } + } + + async showToasterError(text: string) { + if (text) { + const toast = await this.toastCtrl.create({ + message: text, + duration: this.TOAST_DURATION, + position: this.TOAST_POSITION, + cssClass: this.ERROR_TOAST_CLASS, + }); + await toast.present(); + } + } + + async showSpinner() { + this.isLoading = true; + const loading = await this.loadingCtrl.create(); + await loading.present(); + if (!this.isLoading) { + await loading.dismiss(); + } + } +} diff --git a/src/app/services/camera-gallery.service.ts b/src/app/services/camera-gallery.service.ts new file mode 100644 index 0000000..1e741f0 --- /dev/null +++ b/src/app/services/camera-gallery.service.ts @@ -0,0 +1,203 @@ +import { Injectable } from '@angular/core'; +import { Camera, CameraPermissionType, CameraResultType, CameraSource, GalleryImageOptions, ImageOptions } from '@capacitor/camera'; +import { Filesystem } from '@capacitor/filesystem'; +import { Crop } from '@ionic-native/crop/ngx'; +import { ActionSheetController, Platform } from '@ionic/angular'; +import { AlertService } from './alert.service'; + +@Injectable({ + providedIn: 'root' +}) +export class CameraGalleryService { + submitted = Boolean(false); + constructor( + protected actionSheetController: ActionSheetController, + protected platform: Platform, + protected crop: Crop, + protected alert: AlertService + ) { } + + async pickImage(source: CameraSource, width = 0, height = 0, isCrop = true) { + const cameraOptions: ImageOptions = { + source, + allowEditing: false, + resultType: CameraResultType.Uri, + correctOrientation: true, + quality: 100 + }; + try { + const imageData = await Camera.getPhoto(cameraOptions); + + if (!isCrop) { + return this.resolveURL(imageData.webPath); + } + + let path = imageData.path; + if (this.platform.is('hybrid')) { + path = await this.crop.crop(path, { + quality: 100, + targetHeight: height, + targetWidth: width, + }); + const base64Data = await Filesystem.readFile({ path }); + path = `data:image/jpeg;base64,${base64Data.data}`; + } else { + path = imageData.webPath; + } + + return this.resolveURL(path); + } catch (err) { + return false; + } + } + + selectImage(width = 0, height = 0, isCrop = true) { + return new Promise(async (resolve, reject) => { + const actionSheet = await this.actionSheetController.create({ + header: 'Select Image source', + buttons: [{ + text: 'Load from Library', + icon: 'image', + handler: () => { + this.takePermission('photos').then((res) => { + if (res) { + this.pickImage(CameraSource.Photos, width, height, isCrop).then((val) => { + resolve(val); + }).catch(() => reject(false)); + } + }); + } + }, + { + text: 'Use Camera', + icon: 'camera', + handler: () => { + this.takePermission('camera').then((res) => { + if (res) { + this.pickImage(CameraSource.Camera, width, height, isCrop).then((val) => { + resolve(val); + }).catch(() => reject(false)); + } + }); + } + } + ] + }); + await actionSheet.present(); + }); + } + + selectMultipleImage(width = 0, height = 0, isCrop = true) { + return new Promise(async (resolve, reject) => { + const actionSheet = await this.actionSheetController.create({ + header: 'Select Image source', + buttons: [{ + text: 'Load from Library', + icon: 'image', + handler: () => { + this.takePermission('photos').then((res) => { + if (res) { + this.getMultipleImages(width, height, isCrop) + .then((response) => resolve(response)) + .catch(() => reject(false)); + } + }); + } + }, + { + text: 'Use Camera', + icon: 'camera', + handler: () => { + this.takePermission('camera').then((res) => { + if (res) { + this.pickImage(CameraSource.Camera, width, height, isCrop) + .then((val) => { + resolve([val]); + }) + .catch(() => reject(false)); + } + }); + } + } + ] + }); + await actionSheet.present(); + }); + } + + async resolveURL(filePath: string): Promise<{ + imgString: string; + itemImage: Blob; + }> { + try { + const res = await fetch(filePath); + const itemImageBlob = await res.blob(); + return { + imgString: URL.createObjectURL(itemImageBlob), + itemImage: itemImageBlob + }; + } catch (err) { + console.error(err); + } + } + + async getMultipleImages(width, height, isCrop): Promise<{ imgString: string; itemImage: Blob }[]> { + const cameraOptions: GalleryImageOptions = { + correctOrientation: true, + // height, + // width, + quality: 100 + }; + try { + const galleryImages = await (await Camera.pickImages(cameraOptions)).photos; + + return new Promise(async (resolve) => { + const imageArray: Array<{ imgString: string; itemImage: Blob }> = []; + + for (const image of galleryImages) { + let path = image.path; + if (this.platform.is('hybrid')) { + if (isCrop) { + path = await this.crop.crop(path, { + quality: 100, + targetHeight: height, + targetWidth: width + }); + } + const base64Data = await Filesystem.readFile({ path }); + path = `data:image/jpeg;base64,${base64Data.data}`; + } else { + path = image.webPath; + } + + const imgObj = await this.resolveURL(path); + imageArray.push(imgObj); + if (imageArray.length === galleryImages.length) { + resolve(imageArray); + } + } + }); + } catch (err) { + console.log('error:imagePicker', err); + } + } + + private async takePermission(imageSource: CameraPermissionType) { + try { + const permissionGranted = await Camera.checkPermissions(); + if (permissionGranted[imageSource] === 'denied' && this.platform.is('ios')) { + this.alert.showToaster('please allow camera/gallery permission from settings'); + return false; + } + if (permissionGranted[imageSource] === 'granted' || permissionGranted[imageSource] === 'limited') { + return true; + } else { + const cameraPermission = await Camera.requestPermissions(); + return (cameraPermission[imageSource] === 'granted' || permissionGranted[imageSource] === 'limited'); + } + } catch (e) { + console.error(e); + } + } + +} diff --git a/src/app/services/firebase.service.ts b/src/app/services/firebase.service.ts new file mode 100644 index 0000000..002a820 --- /dev/null +++ b/src/app/services/firebase.service.ts @@ -0,0 +1,70 @@ +import { Injectable, NgZone } from '@angular/core'; +import { + FirebaseAuthentication, + SignInResult, + SignInWithPhoneNumberOptions +} from '@capacitor-firebase/authentication'; +import { environment } from '@environments/environment'; +import { Platform } from '@ionic/angular'; +import { initializeApp } from 'firebase/app'; +import { Subject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class FirebaseService { + verificationId!: string; + otpVerified$ = new Subject(); + + constructor( + private readonly platform: Platform, + private readonly ngZone: NgZone, + ) { + FirebaseAuthentication.removeAllListeners().then(() => { + FirebaseAuthentication.addListener('phoneVerificationCompleted', (e) => { + this.ngZone.run(() => { + this.otpVerified$.next(e); + this.signOut(); + }); + }); + FirebaseAuthentication.addListener('phoneVerificationFailed', (e) => { + console.log('phoneVerificationFailed', e); + }); + FirebaseAuthentication.addListener('phoneCodeSent', (e) => { + this.verificationId = e.verificationId; + console.log('phoneCodeSent', e); + }); + }); + } + + async initialize(): Promise { + if (this.platform.is('capacitor')) { + return; + } + /** + * Only needed if the Firebase JavaScript SDK is used. + * + * Read more: https://github.com/robingenz/capacitor-firebase/blob/main/packages/authentication/docs/firebase-js-sdk.md + */ + initializeApp(environment.firebaseOptions); + } + + async signInWithPhoneNumber( + options: SignInWithPhoneNumberOptions + ): Promise { + return FirebaseAuthentication.signInWithPhoneNumber(options); + } + + async confirmVerificationCode( + verificationCode: string + ): Promise { + return await FirebaseAuthentication.confirmVerificationCode({ + verificationId: this.verificationId, + verificationCode, + }); + } + + async signOut(): Promise { + await FirebaseAuthentication.signOut(); + } +} diff --git a/src/app/services/http-request.service.ts b/src/app/services/http-request.service.ts new file mode 100644 index 0000000..26377a9 --- /dev/null +++ b/src/app/services/http-request.service.ts @@ -0,0 +1,70 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Subject, filter, takeUntil } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class HttpRequestService { + private cancelPendingRequests = new Subject(); + private ignoreUrls: string[] = []; + + constructor( + public http: HttpClient + ) { } + + get(url: string, params = {}) { + params = this.cleanParams(params); + + // Cancel any pending requests for the same URL + if (!this.ignoreUrls.includes(url)) { + this.cancelPendingRequests.next(url); + } + + return new Promise((resolve, reject) => { + this.http.get(url, { params }) + .pipe(takeUntil(this.cancelPendingRequests.pipe(filter((k) => k === url)))) + .subscribe({ + next: (res) => resolve(res), + error: (err) => reject(err), + }); + }); + } + + post(url: string, payload: any) { + // Cancel any pending requests for the same URL + this.cancelPendingRequests.next(url); + + return new Promise((resolve, reject) => { + this.http.post(url, payload) + .pipe(takeUntil(this.cancelPendingRequests.pipe(filter((k) => k === url)))) + .subscribe({ + next: (res) => resolve(res), + error: (err) => reject(err), + }); + }); + } + + delete(url: string, params = {}) { + params = this.cleanParams(params); + + // Cancel any pending requests for the same URL + this.cancelPendingRequests.next(url); + + return new Promise((resolve, reject) => { + this.http.delete(url, { params }) + .pipe(takeUntil(this.cancelPendingRequests.pipe(filter((k) => k === url)))) + .subscribe({ + next: (res) => resolve(res), + error: (err) => reject(err), + }); + }); + } + + private cleanParams(params: T): T { + Object.keys(params).forEach(key => + (params[key] == null || params[key] === '' || params[key] === undefined) && delete params[key] + ); + return params; + } +} diff --git a/src/app/services/push.service.ts b/src/app/services/push.service.ts new file mode 100644 index 0000000..1106660 --- /dev/null +++ b/src/app/services/push.service.ts @@ -0,0 +1,258 @@ +import { Injectable, NgZone } from '@angular/core'; +import { Router } from '@angular/router'; +import { Device } from '@capacitor/device'; +import { + ActionPerformed, + PushNotificationSchema, + PushNotifications, + Token +} from '@capacitor/push-notifications'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { NavController, Platform, ToastController } from '@ionic/angular'; +import { HttpRequestService } from './http-request.service'; +import { StateManagementService } from './state-management.service'; + +@Injectable({ + providedIn: 'root' +}) + +export class PushService { + constructor( + private platform: Platform, + private httpRequestService: HttpRequestService, + private navController: NavController, + private stateManagementService: StateManagementService, + private router: Router, + private toastController: ToastController, + private zone: NgZone, + ) { + + } + + init() { + // Request permission to use push notifications + // iOS will prompt user and return if they granted permission or not + // Android will just grant without prompting + PushNotifications.requestPermissions().then(result => { + if (result.receive === 'granted') { + // Register with Apple / Google to receive push via APNS/FCM + PushNotifications.register(); + } else { + // Show some error + } + }); + + // On success, we should be able to receive notifications + PushNotifications.addListener('registration', + async (token: Token) => { + const deviceUUID = (await Device.getId()).identifier; + this.stateManagementService.storage.set(GJainStorage.pushToken, token.value); + this.stateManagementService.storage.set(GJainStorage.deviceUUID, deviceUUID); + this.registerPushToken(); + } + ); + + + // Show us the notification payload if the app is open on our device + PushNotifications.addListener('pushNotificationReceived', + (notification: PushNotificationSchema) => { + this.displayToast(notification.data); + } + ); + + // Method called when tapping on a notification + PushNotifications.addListener('pushNotificationActionPerformed', + (notification: ActionPerformed) => { + this.redirectUserTo(notification.notification.data); + } + ); + } + + async displayToast(data: any) { + if (data.type === 'NewMessage') { + const payload = { + id: +data.id, + user_id: +data.user_id, + avatar: data.avatar, + avatar_url: data.avatar_url, + name: data.name, + created_at: data.created_at, + message: data.message, + unread_count: this.router.url.match(/\/message-chat/g) === null ? +data.unread_count : 0 + }; + this.stateManagementService.generalData.unread_message_count = payload.unread_count; + this.stateManagementService.messageObservable.next(payload); + this.stateManagementService.messageDetailObservable.next(payload); + if (this.router.url.match(/\/message-chat/g) === null && this.router.url.match(/\/message/g) === null) { + this.toast(data); + } + } else { + this.stateManagementService.generalData.unread_notification_count++; + } + if (data.type === 'SanghAddedMember') { + this.stateManagementService.generalData.sangh_menu = 1; + this.stateManagementService.generalData.pending_sangh_invitation = 1; + } else if (data.type === 'FriendRequest') { + this.stateManagementService.generalData.shravak_menu = 1; + this.stateManagementService.generalData.pending_friend_request = 1; + } else if (data.type === 'SantSendBack') { + this.stateManagementService.generalData.sant_menu = 1; + this.stateManagementService.generalData.pending_sant_action = 1; + } + this.stateManagementService.pushNotyObservable.next(this.stateManagementService.generalData); + } + + async toast(data: any) { + const payload: any = { + message: data.message, + position: 'top', + duration: 2000, + cssClass: 'message-toast', + buttons: [{ + side: 'end', + text: 'View', + handler: () => { + if (data.type === 'NewMessage') { + if (this.router.url.match(/\/message-chat/g) !== null) { + const payload1 = { + id: +data.id, + user_id: +data.user_id, + avatar: data.avatar, + avatar_url: data.avatar_url, + name: data.name, + created_at: data.created_at, + message: data.message, + unread_count: this.router.url.match(/\/message-chat/g) === null ? +data.unread_count : 0 + }; + this.stateManagementService.messageObservable.next(payload1); + this.stateManagementService.messageDetailObservable.next(payload1); + } else { + this.navController + .navigateForward(Roots.page + '/' + + 'message-chat;userId=' + data.user_id + + ';name=' + encodeURIComponent(data.name) + ); + } + } + } + }] + }; + if (data.type === 'NewMessage') { + payload.mode = 'md'; + payload.header = data.name + ' messaged you.'; + } + const toast = await this.toastController.create(payload); + toast.present(); + } + + redirectUserTo(data: any) { + setTimeout(() => { + this.zone.run(() => { + const sanghNotification = [ + 'SanghAddedMember', + 'SanghAddedCoreCommitteeMember', + 'UserSentMemberRequest', + 'UserAcceptedMemberRequest', + 'AdminAcceptedMemberRequest', + 'AdminRemovedMember', + 'AdminDeclinedMemberRequest', + 'SanghUpdatedMember' + ]; + if (data.type === 'NewMessage') { + this.navController.navigateRoot(Roots.page + '/' + Roots.message); + } else if (data.type === 'FriendRequest') { + const navOption = { + state: { + friendRequestSegment: 'received' + }, + }; + this.navController.navigateRoot(Roots.page + '/' + Roots.friendRequest, navOption); + } else if (data.type === 'FriendRequestAccepted') { + const navOption = { + state: { + friendRequestSegment: 'friend' + }, + }; + this.navController.navigateRoot(Roots.page + '/' + Roots.friendRequest, navOption); + } else if ( + ['CommentPost', 'LikePost', 'TagPost', 'NewSanghPost', 'NewFriendPost'].includes(data.type) + ) { + const navOption = { + state: { + postId: data.from_id, + type: data.user_type === 'shravak' ? '1' : '3' + }, + }; + this.navController.navigateRoot(Roots.page + '/' + Roots.postDetail, navOption); + } else if (data.type === 'SantApproved' || data.type === 'SantSendBack') { + this.navController.navigateRoot(Roots.page + '/sant-profile/' + data.from_id); + } else if (sanghNotification.includes(data.type)) { + this.navController.navigateRoot(Roots.page + '/sangh-profile/' + data.from_id); + } else { + this.navController.navigateRoot(Roots.page + '/' + Roots.notification); + } + }); + }, 500); + } + + async registerPushToken() { + let platformName: string; + const pushToken = await this.stateManagementService.storage.get(GJainStorage.pushToken); + const deviceUUID = await this.stateManagementService.storage.get(GJainStorage.deviceUUID); + if (!this.stateManagementService.token || !pushToken) { + return; + } else if (this.platform.is('android')) { + platformName = 'android'; + } else if (this.platform.is('ios') || this.platform.is('iphone')) { + platformName = 'ios'; + } else { + return; + } + this.httpRequestService + .post(api.registerPushToken, { + os: platformName, + device_id: deviceUUID, + fcm_token: pushToken + }); + } + + async unRegisterPushToken() { + let platformName: string; + if (this.platform.is('android')) { + platformName = 'android'; + } else if (this.platform.is('ios') || this.platform.is('iphone')) { + platformName = 'ios'; + } else { + return; + } + const deviceUUID = await this.stateManagementService.storage.get(GJainStorage.deviceUUID); + this.httpRequestService + .post(api.unRegisterPushToken, { + os: platformName, + device_id: deviceUUID, + }).then(() => { + this.stateManagementService.token = ''; + }); + } + + async deleteExistingToken() { + let platformName: string; + if (this.platform.is('android')) { + platformName = 'android'; + } else if (this.platform.is('ios') || this.platform.is('iphone')) { + platformName = 'ios'; + } else { + return; + } + const deviceUUID = await this.stateManagementService.storage.get(GJainStorage.deviceUUID); + this.httpRequestService + .post(api.deleteExistingToken, { + os: platformName, + device_id: deviceUUID, + }).then(() => { + this.stateManagementService.token = ''; + }); + } +} diff --git a/src/app/services/sant-info.service.ts b/src/app/services/sant-info.service.ts new file mode 100644 index 0000000..ab87618 --- /dev/null +++ b/src/app/services/sant-info.service.ts @@ -0,0 +1,187 @@ +import { Injectable } from '@angular/core'; +import { FormControl, FormGroup, UntypedFormBuilder, Validators } from '@angular/forms'; +import { reviewedFields } from '@interfaces/common'; +import { + CertificateForm, + CertificateTermConditionForm, + DikshaInformationForm, + SanghAddressForm, SanghDonationForm, SanghFacilitiesForm, SanghInformationForm, SanghMemberForm, SanghProfileImageForm, SansarikJeevanInformationForm, + SantInformationForm, SantProfileImageForm +} from '@interfaces/form'; +import { aadharValidator, accountNumberValidator } from '../validators/common.validator'; + +@Injectable({ + providedIn: 'root' +}) +export class SantInfoService { + + santInformationForm: FormGroup; + sanghInformationForm: FormGroup; + certificateInformationForm: FormGroup; + sanghMemberForm: FormGroup; + updateSant = false; + updateSantId: string; + reviewed_fields: reviewedFields | null; + + constructor( + private formBuilder: UntypedFormBuilder + ) { + this.santInformationForm = this.formBuilder.group({ + santInfoForm: this.formBuilder.group({ + name: new FormControl('', Validators.required), + honor: new FormControl(''), + dharma_id: new FormControl('', Validators.required), + sampraday_id: new FormControl('', Validators.required), + birth_date: new FormControl(''), + gender: new FormControl('', Validators.required) + }), + dikshaInfoForm: this.formBuilder.group({ + diksha_date: new FormControl(''), + diksha_place: new FormControl(''), + diksha_place_latitude: new FormControl(''), + diksha_place_longitude: new FormControl(''), + guru: new FormControl(''), + guru_id: new FormControl('') + }), + sansarikJeevanInfoForm: this.formBuilder.group({ + father_name: new FormControl(''), + father_id: new FormControl(''), + father_type: new FormControl(''), + mother_name: new FormControl(''), + mother_id: new FormControl(''), + mother_type: new FormControl(''), + about: new FormControl('') + }), + santProfileImage: this.formBuilder.group({ + avatar: new FormControl('') + }) + }); + this.sanghInformationForm = this.formBuilder.group({ + sanghInfoForm: this.formBuilder.group({ + sangh_type: new FormControl('', Validators.required), + name: new FormControl('', Validators.required), + mulnayak_bhagwan_name: new FormControl('', Validators.required), + dharma_id: new FormControl(''), + sampraday_id: new FormControl(''), + reg_number: new FormControl(''), + reg_date: new FormControl(''), + type_of_template: new FormControl(null, Validators.required) + }), + sanghAddressForm: this.formBuilder.group({ + address: new FormControl('', Validators.required), + city: new FormControl('', Validators.required), + state: new FormControl('', Validators.required), + email: new FormControl('', Validators.email), + mobile_number: new FormControl('', Validators.required), + phoneCode: new FormControl(null), + sangh_website: new FormControl(''), + apartment_name: new FormControl(''), + number_of_members: new FormControl(null, Validators.required), + longitude: new FormControl(''), + latitude: new FormControl(''), + about: new FormControl(''), + }), + sanghFacilitiesForm: this.formBuilder.group({ + aaradhana_bhavan_status: new FormControl(1, Validators.required), + pathshala_status: new FormControl(1, Validators.required), + no_of_students: new FormControl('', Validators.required), + library_status: new FormControl(1, Validators.required), + library_name: new FormControl('', Validators.required), + librarian_name: new FormControl('', Validators.required), + librarian_mobile_number: new FormControl('', Validators.required), + phoneCode: new FormControl(null, Validators.required), + number_of_books: new FormControl('', Validators.required), + tifin_service_status: new FormControl(1, Validators.required), + bhojanshala_status: new FormControl(1, Validators.required), + aayambilshala_status: new FormControl(1, Validators.required), + mahila_mandal_status: new FormControl(1, Validators.required), + yuva_mandal_status: new FormControl(1, Validators.required), + swapna_chadawa_organised_status: new FormControl(1, Validators.required), + }), + sanghDonationForm: this.formBuilder.group({ + bank_account_number: new FormControl(null, accountNumberValidator), + bank_ifsc: new FormControl(''), + bank_branch: new FormControl(''), + bank_upi_id: new FormControl(''), + bank_qr_code: new FormControl(null), + bank_qr_code_url: new FormControl(null), + }), + sanghProfileImage: this.formBuilder.group({ + avatar: new FormControl('', Validators.required), + }) + }); + this.certificateInformationForm = this.formBuilder.group({ + certificateInfoForm: this.formBuilder.group({ + hospital: new FormControl('', [Validators.required]), + fullName: new FormControl('', [Validators.required]), + email: new FormControl('', [Validators.required, Validators.email]), + address: new FormControl('', [Validators.required]), + aadharNumber: new FormControl('', [Validators.required, aadharValidator]), + medicalDescription: new FormControl(null, [Validators.required]), + }), + + certificateTermConditionInfoForm: this.formBuilder.group({ + termCondition: new FormControl(false) + }) + }); + + + this.sanghMemberForm = this.formBuilder.group({ + memberId: new FormControl('123', [Validators.required]), + fullName: new FormControl('', [Validators.required]), + address: new FormControl('', [Validators.required]), + profile_url: new FormControl(''), + profile: new FormControl(null) + }); + + } + + get santInfoForm() { + return this.santInformationForm.get('santInfoForm') as FormGroup; + } + + get dikshaInfoForm() { + return this.santInformationForm.get('dikshaInfoForm') as FormGroup; + } + + get sansarikJeevanInfoForm() { + return this.santInformationForm.get('sansarikJeevanInfoForm') as FormGroup; + } + + get santProfileImage() { + return this.santInformationForm.get('santProfileImage') as FormGroup; + } + + get sanghInfoForm() { + return this.sanghInformationForm.get('sanghInfoForm') as FormGroup; + } + + get sanghAddressForm() { + return this.sanghInformationForm.get('sanghAddressForm') as FormGroup; + } + + get sanghProfileImage() { + return this.sanghInformationForm.get('sanghProfileImage') as FormGroup; + } + + get certificateForm() { + return this.certificateInformationForm.get('certificateInfoForm') as FormGroup; + } + + get certificateTermConditionForm() { + return this.certificateInformationForm.get('certificateTermConditionInfoForm') as FormGroup; + } + + get sanghFacilitiesForm() { + return this.sanghInformationForm.get('sanghFacilitiesForm') as FormGroup; + } + + get sanghDonationForm() { + return this.sanghInformationForm.get('sanghDonationForm') as FormGroup; + } + + get memberCardForm() { + return this.sanghMemberForm as FormGroup; + } + +} diff --git a/src/app/services/state-management.service.ts b/src/app/services/state-management.service.ts new file mode 100644 index 0000000..07feec1 --- /dev/null +++ b/src/app/services/state-management.service.ts @@ -0,0 +1,90 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { + BloodGroup, Country, + Dharma, GeneralData, Jaati, + MTongue, + Message, + ProfileData, + Sampraday, + addPassiveUser, + viharInfo +} from '@interfaces/common'; +import { Storage } from '@ionic/storage'; +import { BehaviorSubject, Subject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class StateManagementService { + generalData: GeneralData = { + profile_completion_percentage: 0, + pending_friend_request: 0, + pending_sangh_invitation: 0, + pending_sant_action: 0, + sangh_menu: 0, + sant_menu: 0, + shravak_menu: 0, + unread_message_count: 0, + unread_notification_count: 0, + }; + storage: Storage = new Storage({}); + countryDetails: Array = []; + dharmaDetails: Array = []; + jaatiDetails: Array = []; + motherTongueDetails: Array = []; + sampradayDetails: Array = []; + bloodGroupDetails: Array = []; + chaturmasYear = []; + userInformation: addPassiveUser = {}; + userProfileData: ProfileData; + postType: string; + postTypeList = []; + userSanghList = []; + noDataFlag = false; + imageArray: Array<{ imgString: string; itemImage: Blob }> = []; + santDetails: any; + postTypeSubject = new Subject(); + postLocationSubject = new Subject(); + postLocationLatSubject = new Subject(); + postLocationLongSubject = new Subject(); + postSelectedSanghSubject = new Subject(); + viharInfo: viharInfo; + messageObservable = new Subject(); + messageDetailObservable = new Subject(); + messageClearObservable = new Subject(); + messageThreadRemoveObservable = new Subject(); + pushNotyObservable = new BehaviorSubject(this.generalData); + shareData: any = null; + common: any; + + constructor( + private http: HttpClient, + ) { + this.storage.create(); + } + + get userData(): string | null { + return localStorage.getItem(GJainStorage.userData); + } + + get token(): string | null { + return localStorage.getItem(GJainStorage.token); + } + + set token(v: string) { + localStorage.setItem(GJainStorage.token, v); + } + + fetchNotificationCounts() { + if (!this.token) { return; } + this.http.get(api.unreadCounts) + .subscribe((res: { data: GeneralData }) => { + this.generalData = res.data; + this.pushNotyObservable.next(this.generalData); + }); + } + +} diff --git a/src/app/services/utility.service.ts b/src/app/services/utility.service.ts new file mode 100644 index 0000000..b29ea02 --- /dev/null +++ b/src/app/services/utility.service.ts @@ -0,0 +1,290 @@ +import { Injectable } from '@angular/core'; +import { Browser } from '@capacitor/browser'; +import { ConnectionStatus, Network } from '@capacitor/network'; +import { AlertController, IonDatetime, ModalController, NavController } from '@ionic/angular'; +import { Observable } from 'rxjs'; +import Swiper from 'swiper'; + +import { ImageModalComponent } from '@components/image-modal/image-modal.component'; +import { ReportContentComponent } from '@components/report-content/report-content.component'; +import { api } from '@enums/api.enum'; +import { GJainStorage } from '@enums/gjain-storage.enum'; +import { Roots } from '@enums/root.enum'; +import { CommonResponse } from '@interfaces/common'; +import { AlertService } from '@services/alert.service'; +import { HttpRequestService } from '@services/http-request.service'; +import { StateManagementService } from '@services/state-management.service'; +declare let google: any; +@Injectable({ + providedIn: 'root' +}) +export class UtilityService { + + constructor( + private modalController: ModalController, + private alert: AlertService, + private stateManagementService: StateManagementService, + private navController: NavController, + private httpRequestService: HttpRequestService, + private alertController: AlertController, + ) { } + + async defaultButton(confirmButton: 'DONE' | 'CANCEL', ionDatetime: IonDatetime): Promise { + const nativeElement = (ionDatetime as any).el; + if (nativeElement.classList.contains('show-month-and-year')) { + const el: any = nativeElement.shadowRoot.querySelector('.calendar-month-year'); + el.querySelector('ion-item').shadowRoot.querySelector('button').click(); + return; + } + if (confirmButton === 'DONE') { + await ionDatetime?.confirm(true); + } else { + await ionDatetime?.cancel(true); + } + } + + createAutocomplete(addressEl: HTMLInputElement, componentRestrictions = ['IN']): Observable { + const autocomplete = new google.maps.places.Autocomplete(addressEl, { + types: [], strictBounds: false, componentRestrictions: { + country: componentRestrictions + } + }); + return new Observable((sub: any) => { + google.maps.event.addListener(autocomplete, 'place_changed', () => { + const place = autocomplete.getPlace(); + if (!place.geometry) { + sub.error({ + message: 'Autocomplete returned place with no geometry' + }); + } else { + sub.next(place); + } + }); + }); + } + + getAddress(address: string): any { + const geocoder = new google.maps.Geocoder(); + return new Observable((sub: any) => { + geocoder.geocode({ 'address': address }, function (results, status) { + if (status == 'OK') { + sub.next(results); + } + }); + }); + } + + handleInternetStatus() { + function displayToaster(status: ConnectionStatus) { + if (!status.connected) { + this.alert.showToasterError('Please check internet connectivity'); + } + } + Network.addListener('networkStatusChange', status => { + displayToaster.bind(this)(status); + }); + Network.getStatus().then(status => { + displayToaster.bind(this)(status); + }); + } + + async imagePreview(url: string, slider?: Swiper) { + if (slider) { + slider.isLocked = true; + } + const modal = await this.modalController.create({ + component: ImageModalComponent, + componentProps: { + imgUrl: url, + slider + } + }); + return await modal.present(); + } + + async logout() { + const deviceUUID = await this.stateManagementService.storage.get(GJainStorage.deviceUUID); + const params = { + device_id: deviceUUID, + }; + this.httpRequestService.get(api.logout, deviceUUID ? params : '').then((res: any) => { + if (res.status === 200) { + this.stateManagementService.token = ''; + this.stateManagementService.storage.remove(GJainStorage.loginType); + this.stateManagementService.storage.remove(GJainStorage.profileData); + this.stateManagementService.storage.remove(GJainStorage.userData).then(() => { + this.navController.navigateRoot(Roots.auth + '/' + Roots.login); + this.alert.showToaster('Logout successfully...'); + }); + } + this.alert.showToaster(res.message); + this.alert.hideLoader(); + }).catch(() => { + this.alert.hideLoader(); + }); + } + + async openReport(data) { + const modal = await this.modalController.create({ + component: ReportContentComponent, + componentProps: { data }, + mode: 'ios', + backdropDismiss: true, + breakpoints: [0, 0.8, 1], + initialBreakpoint: 0.8, + canDismiss: true + }); + return await modal.present(); + } + + async hidePost(post) { + const alert = await this.alertController.create({ + header: 'Confirm!', + message: `Are you sure you want to ${post.hide ? 'show' : 'hide'} this post?`, + buttons: [{ + text: 'Yes', + handler: async () => { + this.alert.showLoader(); + const status = post.hide ? 0 : 1; // 0: Unhide, 1: Hide + this.httpRequestService.post(api.hideThisPost, { + id: post.id, + status + }) + .then((res: CommonResponse) => { + post.hide = status; + this.alert.showToaster(res.message); + }).finally(() => { + this.alert.hideLoader(); + }); + } + }, { + text: 'No', + role: 'cancel', + cssClass: 'secondary' + }] + }); + await alert.present(); + } + + async presentConfirm( + message: string, + noText = 'No', + okText = 'Yes', + header = 'Confirm!' + ): Promise { + + return new Promise(async (resolve) => { + const alert = await this.alertController.create({ + header, + message, + mode: 'ios', + buttons: [{ + text: okText, + handler: () => { + resolve(1); + } + }, { + text: noText, + role: 'cancel', + cssClass: 'secondary', + handler: () => { + resolve(0); + } + }] + }); + await alert.present(); + }); + } + + async presentAcceptDecline( + message: string, + noText = 'Decline', + okText = 'Accept', + header = 'Membership Request'): Promise { + + return new Promise(async (resolve) => { + const alert = await this.alertController.create({ + header, + message, + mode: 'ios', + buttons: [{ + text: okText, + handler: () => { + resolve(1); + } + }, { + text: noText, + handler: () => { + resolve(2); + } + }, { + text: 'Cancel', + role: 'cancel', + cssClass: 'secondary', + handler: () => { + resolve(0); + } + }] + }); + await alert.present(); + }); + } + + openGoogleMap(lat: string, lng: string) { + if (lat && lng) { + window.open(`https://www.google.com/maps/search/?api=1&query=${lat},${lng}`, '_system'); + } + } + + convertLinksToClickableLinks(text: string) { + const urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g; + return text?.replace(urlRegex, (url: string) => { + if (url.startsWith('http')) { + return '' + url + ''; + } + return '' + url + ''; + }); + } + + extractMentionedNames(description: string, mentionsArr: any[]) { + const regex = /(?<=@)[^@]+/g; + const matches = description.match(regex); + if (matches) { + return mentionsArr.filter(item => matches.some(str => str.startsWith(item.name))); + } + return []; + } + + extractWordsAfterAtSign(str) { + const lastLine = str.split('\n').pop(); + const lastWords = lastLine.split(/\s+/).slice(-3); + for (let i = lastWords.length - 1; i >= 0; i--) { + if (lastWords[i].charAt(0) === '@') { + const wordsAfterAtSign = lastWords.slice(i).join(' '); + return wordsAfterAtSign; + } + } + return ''; + } + + async openBrowser(url: string) { + await Browser.open({ url }); + } + + isSameStr(currentValue: string, prevValue: string, isIgnoredBlankCall = false): boolean { + let res = true; + if ((prevValue?.trim() && !currentValue?.trim()) || + (!prevValue?.trim() && currentValue?.trim()) || + (prevValue?.trim() && currentValue?.trim() && prevValue?.trim() !== currentValue?.trim())) { + res = false; + } + if (isIgnoredBlankCall && !currentValue?.trim()) { res = true; } + return res; + } + + isMaxFileSize(size: number): boolean { + const MAX_SIZE = 2 * 1024 * 1024; // 2MB in bytes + return size > MAX_SIZE ? true : false; + } + +} diff --git a/src/app/validators/common.validator.ts b/src/app/validators/common.validator.ts new file mode 100644 index 0000000..7e023ae --- /dev/null +++ b/src/app/validators/common.validator.ts @@ -0,0 +1,32 @@ +import { AbstractControl, ValidationErrors } from '@angular/forms'; + +export function aadharValidator(control: AbstractControl): ValidationErrors | null { + const aadharNumber = control.value; + const aadharRegex = /^\d{12}$/; // Aadhar number must be exactly 12 digits + + if (aadharNumber?.length && !aadharRegex.test(aadharNumber)) { + return { invalidAadhar: true }; + } + + return null; +} + + +export function accountNumberValidator(control: AbstractControl): ValidationErrors | null { + const accountNumber = control.value; + const accountNumberRegex = /^[0-9]{10,17}$/; + if (accountNumber?.length && !accountNumberRegex.test(accountNumber)) { + return { invalidAccountNumber: true }; + } + return null; +} + +export function ifscValidator(control: AbstractControl): ValidationErrors | null { + const ifsc = control.value; + const ifscRegex = /^[A-Z]{4}0[A-Z0-9]{6}$/; + if (ifsc?.length && !ifscRegex.test(ifsc)) { + return { invalidIfsc: true }; + } + return null; +} + diff --git a/src/assets/fonts/Gilroy/Gilroy-Black.eot b/src/assets/fonts/Gilroy/Gilroy-Black.eot new file mode 100644 index 0000000..cf971d0 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Black.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Black.svg b/src/assets/fonts/Gilroy/Gilroy-Black.svg new file mode 100644 index 0000000..d8dd406 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Black.svg @@ -0,0 +1,8035 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:06 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Black.ttf b/src/assets/fonts/Gilroy/Gilroy-Black.ttf new file mode 100644 index 0000000..bee3a37 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Black.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Black.woff b/src/assets/fonts/Gilroy/Gilroy-Black.woff new file mode 100644 index 0000000..d76b8e1 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Black.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Black.woff2 b/src/assets/fonts/Gilroy/Gilroy-Black.woff2 new file mode 100644 index 0000000..357c4a9 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Black.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Bold.eot b/src/assets/fonts/Gilroy/Gilroy-Bold.eot new file mode 100644 index 0000000..4ef95af Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Bold.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Bold.svg b/src/assets/fonts/Gilroy/Gilroy-Bold.svg new file mode 100644 index 0000000..9f46a70 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Bold.svg @@ -0,0 +1,7847 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:14 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Bold.ttf b/src/assets/fonts/Gilroy/Gilroy-Bold.ttf new file mode 100644 index 0000000..842953d Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Bold.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Bold.woff b/src/assets/fonts/Gilroy/Gilroy-Bold.woff new file mode 100644 index 0000000..3cf2d5f Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Bold.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Bold.woff2 b/src/assets/fonts/Gilroy/Gilroy-Bold.woff2 new file mode 100644 index 0000000..03776c6 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Bold.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-ExtraBold.eot b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.eot new file mode 100644 index 0000000..d5d3ba7 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-ExtraBold.svg b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.svg new file mode 100644 index 0000000..8d64dd9 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.svg @@ -0,0 +1,7730 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:14 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-ExtraBold.ttf b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.ttf new file mode 100644 index 0000000..0c6e7ee Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff new file mode 100644 index 0000000..96b2b47 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff2 b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff2 new file mode 100644 index 0000000..b13b60a Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-ExtraBold.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Heavy.eot b/src/assets/fonts/Gilroy/Gilroy-Heavy.eot new file mode 100644 index 0000000..12b5a14 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Heavy.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Heavy.svg b/src/assets/fonts/Gilroy/Gilroy-Heavy.svg new file mode 100644 index 0000000..2200fbc --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Heavy.svg @@ -0,0 +1,7919 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:27 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Heavy.ttf b/src/assets/fonts/Gilroy/Gilroy-Heavy.ttf new file mode 100644 index 0000000..d4495c9 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Heavy.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Heavy.woff b/src/assets/fonts/Gilroy/Gilroy-Heavy.woff new file mode 100644 index 0000000..9d9db16 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Heavy.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Heavy.woff2 b/src/assets/fonts/Gilroy/Gilroy-Heavy.woff2 new file mode 100644 index 0000000..9805de6 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Heavy.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Light.eot b/src/assets/fonts/Gilroy/Gilroy-Light.eot new file mode 100644 index 0000000..ee934f2 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Light.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Light.svg b/src/assets/fonts/Gilroy/Gilroy-Light.svg new file mode 100644 index 0000000..522a4dc --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Light.svg @@ -0,0 +1,7563 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:53:55 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Light.ttf b/src/assets/fonts/Gilroy/Gilroy-Light.ttf new file mode 100644 index 0000000..72cdc40 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Light.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Light.woff b/src/assets/fonts/Gilroy/Gilroy-Light.woff new file mode 100644 index 0000000..a5189cf Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Light.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Light.woff2 b/src/assets/fonts/Gilroy/Gilroy-Light.woff2 new file mode 100644 index 0000000..bc5a5c1 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Light.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Medium.eot b/src/assets/fonts/Gilroy/Gilroy-Medium.eot new file mode 100644 index 0000000..141eab7 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Medium.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Medium.svg b/src/assets/fonts/Gilroy/Gilroy-Medium.svg new file mode 100644 index 0000000..b751717 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Medium.svg @@ -0,0 +1,7857 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:00 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Medium.ttf b/src/assets/fonts/Gilroy/Gilroy-Medium.ttf new file mode 100644 index 0000000..af7fe0d Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Medium.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Medium.woff b/src/assets/fonts/Gilroy/Gilroy-Medium.woff new file mode 100644 index 0000000..987583a Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Medium.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Medium.woff2 b/src/assets/fonts/Gilroy/Gilroy-Medium.woff2 new file mode 100644 index 0000000..2764710 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Medium.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Regular.eot b/src/assets/fonts/Gilroy/Gilroy-Regular.eot new file mode 100644 index 0000000..3dff68d Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Regular.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Regular.svg b/src/assets/fonts/Gilroy/Gilroy-Regular.svg new file mode 100644 index 0000000..8b99bf4 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Regular.svg @@ -0,0 +1,7540 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:02 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Regular.ttf b/src/assets/fonts/Gilroy/Gilroy-Regular.ttf new file mode 100644 index 0000000..1e778f4 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Regular.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Regular.woff b/src/assets/fonts/Gilroy/Gilroy-Regular.woff new file mode 100644 index 0000000..c0e4821 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Regular.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Regular.woff2 b/src/assets/fonts/Gilroy/Gilroy-Regular.woff2 new file mode 100644 index 0000000..64fd436 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Regular.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-SemiBold.eot b/src/assets/fonts/Gilroy/Gilroy-SemiBold.eot new file mode 100644 index 0000000..5caa3b9 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-SemiBold.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-SemiBold.svg b/src/assets/fonts/Gilroy/Gilroy-SemiBold.svg new file mode 100644 index 0000000..c7276b5 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-SemiBold.svg @@ -0,0 +1,7857 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:53:54 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-SemiBold.ttf b/src/assets/fonts/Gilroy/Gilroy-SemiBold.ttf new file mode 100644 index 0000000..2165f32 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-SemiBold.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff b/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff new file mode 100644 index 0000000..d748f19 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff2 b/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff2 new file mode 100644 index 0000000..d193f13 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-SemiBold.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Thin.eot b/src/assets/fonts/Gilroy/Gilroy-Thin.eot new file mode 100644 index 0000000..1389eb2 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Thin.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Thin.svg b/src/assets/fonts/Gilroy/Gilroy-Thin.svg new file mode 100644 index 0000000..90a8703 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-Thin.svg @@ -0,0 +1,7523 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:01 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-Thin.ttf b/src/assets/fonts/Gilroy/Gilroy-Thin.ttf new file mode 100644 index 0000000..7475b82 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Thin.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Thin.woff b/src/assets/fonts/Gilroy/Gilroy-Thin.woff new file mode 100644 index 0000000..de7fe31 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Thin.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-Thin.woff2 b/src/assets/fonts/Gilroy/Gilroy-Thin.woff2 new file mode 100644 index 0000000..395956c Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-Thin.woff2 differ diff --git a/src/assets/fonts/Gilroy/Gilroy-UltraLight.eot b/src/assets/fonts/Gilroy/Gilroy-UltraLight.eot new file mode 100644 index 0000000..bdcfbad Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-UltraLight.eot differ diff --git a/src/assets/fonts/Gilroy/Gilroy-UltraLight.svg b/src/assets/fonts/Gilroy/Gilroy-UltraLight.svg new file mode 100644 index 0000000..e746e26 --- /dev/null +++ b/src/assets/fonts/Gilroy/Gilroy-UltraLight.svg @@ -0,0 +1,7569 @@ + + + + +Created by FontForge 20170731 at Fri Jul 8 21:54:05 2016 + By Aleksey,,, +Copyright (c) 2016 by Radomir Tinkov. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/Gilroy/Gilroy-UltraLight.ttf b/src/assets/fonts/Gilroy/Gilroy-UltraLight.ttf new file mode 100644 index 0000000..24db8e3 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-UltraLight.ttf differ diff --git a/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff b/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff new file mode 100644 index 0000000..dccc924 Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff differ diff --git a/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff2 b/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff2 new file mode 100644 index 0000000..b96c8ad Binary files /dev/null and b/src/assets/fonts/Gilroy/Gilroy-UltraLight.woff2 differ diff --git a/src/assets/icon/favicon.png b/src/assets/icon/favicon.png new file mode 100644 index 0000000..7a96ad4 Binary files /dev/null and b/src/assets/icon/favicon.png differ diff --git a/src/assets/images/Menu.svg b/src/assets/images/Menu.svg new file mode 100644 index 0000000..6ccdeea --- /dev/null +++ b/src/assets/images/Menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/assistance.svg b/src/assets/images/assistance.svg new file mode 100644 index 0000000..af93504 --- /dev/null +++ b/src/assets/images/assistance.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/bank.svg b/src/assets/images/bank.svg new file mode 100644 index 0000000..e75d020 --- /dev/null +++ b/src/assets/images/bank.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/bell.svg b/src/assets/images/bell.svg new file mode 100644 index 0000000..97463a8 --- /dev/null +++ b/src/assets/images/bell.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/bg-circle-signup.svg b/src/assets/images/bg-circle-signup.svg new file mode 100644 index 0000000..d043778 --- /dev/null +++ b/src/assets/images/bg-circle-signup.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/birthday-icon.svg b/src/assets/images/birthday-icon.svg new file mode 100644 index 0000000..c807ba9 --- /dev/null +++ b/src/assets/images/birthday-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/black.svg b/src/assets/images/black.svg new file mode 100644 index 0000000..11b5da6 --- /dev/null +++ b/src/assets/images/black.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/bloodgroup.svg b/src/assets/images/bloodgroup.svg new file mode 100644 index 0000000..25fc377 --- /dev/null +++ b/src/assets/images/bloodgroup.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/src/assets/images/book.svg b/src/assets/images/book.svg new file mode 100644 index 0000000..f33901c --- /dev/null +++ b/src/assets/images/book.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/bullet-point-red.svg b/src/assets/images/bullet-point-red.svg new file mode 100644 index 0000000..335a96f --- /dev/null +++ b/src/assets/images/bullet-point-red.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/src/assets/images/card-payment.svg b/src/assets/images/card-payment.svg new file mode 100644 index 0000000..35c2640 --- /dev/null +++ b/src/assets/images/card-payment.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/chaturmas-icon.svg b/src/assets/images/chaturmas-icon.svg new file mode 100644 index 0000000..ecfec63 --- /dev/null +++ b/src/assets/images/chaturmas-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/chaturmas-red-icon.svg b/src/assets/images/chaturmas-red-icon.svg new file mode 100644 index 0000000..2a5de71 --- /dev/null +++ b/src/assets/images/chaturmas-red-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/circle-bg.svg b/src/assets/images/circle-bg.svg new file mode 100644 index 0000000..2c796c5 --- /dev/null +++ b/src/assets/images/circle-bg.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/city-icon.svg b/src/assets/images/city-icon.svg new file mode 100644 index 0000000..91fc1a7 --- /dev/null +++ b/src/assets/images/city-icon.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/assets/images/close-with-shadow.svg b/src/assets/images/close-with-shadow.svg new file mode 100644 index 0000000..32b9459 --- /dev/null +++ b/src/assets/images/close-with-shadow.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/coming-soon-shravak.svg b/src/assets/images/coming-soon-shravak.svg new file mode 100644 index 0000000..e3ee22d --- /dev/null +++ b/src/assets/images/coming-soon-shravak.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/company-icon.svg b/src/assets/images/company-icon.svg new file mode 100644 index 0000000..98aba6a --- /dev/null +++ b/src/assets/images/company-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/contribution.svg b/src/assets/images/contribution.svg new file mode 100644 index 0000000..2dbd302 --- /dev/null +++ b/src/assets/images/contribution.svg @@ -0,0 +1,1984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/creat-account-top-bg.svg b/src/assets/images/creat-account-top-bg.svg new file mode 100644 index 0000000..fbca58a --- /dev/null +++ b/src/assets/images/creat-account-top-bg.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/create-account-logo.svg b/src/assets/images/create-account-logo.svg new file mode 100644 index 0000000..ecddd7c --- /dev/null +++ b/src/assets/images/create-account-logo.svg @@ -0,0 +1,17 @@ + + + diff --git a/src/assets/images/create-new-sangh.svg b/src/assets/images/create-new-sangh.svg new file mode 100644 index 0000000..4f8262b --- /dev/null +++ b/src/assets/images/create-new-sangh.svg @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/create-sant-profile-image.svg b/src/assets/images/create-sant-profile-image.svg new file mode 100644 index 0000000..d3c4a5f --- /dev/null +++ b/src/assets/images/create-sant-profile-image.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/delete.svg b/src/assets/images/delete.svg new file mode 100644 index 0000000..de5daff --- /dev/null +++ b/src/assets/images/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/dharm-sangh.svg b/src/assets/images/dharm-sangh.svg new file mode 100644 index 0000000..65dcf37 --- /dev/null +++ b/src/assets/images/dharm-sangh.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/dharm.svg b/src/assets/images/dharm.svg new file mode 100644 index 0000000..fdc5a11 --- /dev/null +++ b/src/assets/images/dharm.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/done.svg b/src/assets/images/done.svg new file mode 100644 index 0000000..9799ecb --- /dev/null +++ b/src/assets/images/done.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/eat.svg b/src/assets/images/eat.svg new file mode 100644 index 0000000..fb6a6d0 --- /dev/null +++ b/src/assets/images/eat.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/edit-blur-icon.svg b/src/assets/images/edit-blur-icon.svg new file mode 100644 index 0000000..33b10e8 --- /dev/null +++ b/src/assets/images/edit-blur-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/edit-icon-white.svg b/src/assets/images/edit-icon-white.svg new file mode 100644 index 0000000..e30f3c3 --- /dev/null +++ b/src/assets/images/edit-icon-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/edit-icon.svg b/src/assets/images/edit-icon.svg new file mode 100644 index 0000000..b2ab72e --- /dev/null +++ b/src/assets/images/edit-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/edit-sangh-icon.svg b/src/assets/images/edit-sangh-icon.svg new file mode 100644 index 0000000..74b2f08 --- /dev/null +++ b/src/assets/images/edit-sangh-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/friends-big-icon-sangh.svg b/src/assets/images/friends-big-icon-sangh.svg new file mode 100644 index 0000000..9d73e53 --- /dev/null +++ b/src/assets/images/friends-big-icon-sangh.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/images/friends-big-icon.svg b/src/assets/images/friends-big-icon.svg new file mode 100644 index 0000000..5942d81 --- /dev/null +++ b/src/assets/images/friends-big-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/images/gender-icon.svg b/src/assets/images/gender-icon.svg new file mode 100644 index 0000000..673ce5f --- /dev/null +++ b/src/assets/images/gender-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/global-jain-logo.png b/src/assets/images/global-jain-logo.png new file mode 100644 index 0000000..0669fc1 Binary files /dev/null and b/src/assets/images/global-jain-logo.png differ diff --git a/src/assets/images/global-jain-logo.svg b/src/assets/images/global-jain-logo.svg new file mode 100644 index 0000000..0b5abf7 --- /dev/null +++ b/src/assets/images/global-jain-logo.svg @@ -0,0 +1,19 @@ + + + diff --git a/src/assets/images/god.svg b/src/assets/images/god.svg new file mode 100644 index 0000000..239ad70 --- /dev/null +++ b/src/assets/images/god.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/high-school.svg b/src/assets/images/high-school.svg new file mode 100644 index 0000000..f21ba12 --- /dev/null +++ b/src/assets/images/high-school.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/home-fill-new.svg b/src/assets/images/home-fill-new.svg new file mode 100644 index 0000000..53a8713 --- /dev/null +++ b/src/assets/images/home-fill-new.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/home-line-icon.svg b/src/assets/images/home-line-icon.svg new file mode 100644 index 0000000..96fd1cf --- /dev/null +++ b/src/assets/images/home-line-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/homeschooling.svg b/src/assets/images/homeschooling.svg new file mode 100644 index 0000000..1297db2 --- /dev/null +++ b/src/assets/images/homeschooling.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/images/id-card.svg b/src/assets/images/id-card.svg new file mode 100644 index 0000000..2cbb894 --- /dev/null +++ b/src/assets/images/id-card.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/intro-bg-2.svg b/src/assets/images/intro-bg-2.svg new file mode 100644 index 0000000..e4418e0 --- /dev/null +++ b/src/assets/images/intro-bg-2.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/intro-bg.svg b/src/assets/images/intro-bg.svg new file mode 100644 index 0000000..64d077d --- /dev/null +++ b/src/assets/images/intro-bg.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/invite-icon.svg b/src/assets/images/invite-icon.svg new file mode 100644 index 0000000..700dc90 --- /dev/null +++ b/src/assets/images/invite-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/invite-member.svg b/src/assets/images/invite-member.svg new file mode 100644 index 0000000..1d9ae77 --- /dev/null +++ b/src/assets/images/invite-member.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/jaati.svg b/src/assets/images/jaati.svg new file mode 100644 index 0000000..121e8ea --- /dev/null +++ b/src/assets/images/jaati.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/images/libraryan.svg b/src/assets/images/libraryan.svg new file mode 100644 index 0000000..3f1f30e --- /dev/null +++ b/src/assets/images/libraryan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/like-icon-fill.svg b/src/assets/images/like-icon-fill.svg new file mode 100644 index 0000000..0fd3bf5 --- /dev/null +++ b/src/assets/images/like-icon-fill.svg @@ -0,0 +1,9 @@ + + like-icon + + + + + + \ No newline at end of file diff --git a/src/assets/images/like-icon-outline.svg b/src/assets/images/like-icon-outline.svg new file mode 100644 index 0000000..b0a5c69 --- /dev/null +++ b/src/assets/images/like-icon-outline.svg @@ -0,0 +1,9 @@ + + like-icon-outline + + + + + + \ No newline at end of file diff --git a/src/assets/images/location-sangh.svg b/src/assets/images/location-sangh.svg new file mode 100644 index 0000000..e635111 --- /dev/null +++ b/src/assets/images/location-sangh.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/location.svg b/src/assets/images/location.svg new file mode 100644 index 0000000..ac4ebbf --- /dev/null +++ b/src/assets/images/location.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/logo-sign-up.svg b/src/assets/images/logo-sign-up.svg new file mode 100644 index 0000000..0ea2c04 --- /dev/null +++ b/src/assets/images/logo-sign-up.svg @@ -0,0 +1,17 @@ + + + Connecting Sant, Sangh and Shravaks + + + + + + + + + + + + + + diff --git a/src/assets/images/mahila-mandal.svg b/src/assets/images/mahila-mandal.svg new file mode 100644 index 0000000..2a5746a --- /dev/null +++ b/src/assets/images/mahila-mandal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/mail.svg b/src/assets/images/mail.svg new file mode 100644 index 0000000..8d81a97 --- /dev/null +++ b/src/assets/images/mail.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/marital-status.svg b/src/assets/images/marital-status.svg new file mode 100644 index 0000000..64592f2 --- /dev/null +++ b/src/assets/images/marital-status.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/marriage-anniversary.svg b/src/assets/images/marriage-anniversary.svg new file mode 100644 index 0000000..135621b --- /dev/null +++ b/src/assets/images/marriage-anniversary.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/member-id.svg b/src/assets/images/member-id.svg new file mode 100644 index 0000000..48ba50c --- /dev/null +++ b/src/assets/images/member-id.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/members-group.svg b/src/assets/images/members-group.svg new file mode 100644 index 0000000..a449180 --- /dev/null +++ b/src/assets/images/members-group.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/menu-shravak.svg b/src/assets/images/menu-shravak.svg new file mode 100644 index 0000000..218240b --- /dev/null +++ b/src/assets/images/menu-shravak.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/message-icon.svg b/src/assets/images/message-icon.svg new file mode 100644 index 0000000..6cb2584 --- /dev/null +++ b/src/assets/images/message-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/mobile-call-icon.svg b/src/assets/images/mobile-call-icon.svg new file mode 100644 index 0000000..087a88b --- /dev/null +++ b/src/assets/images/mobile-call-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/mother-tongue-sangh.svg b/src/assets/images/mother-tongue-sangh.svg new file mode 100644 index 0000000..964363b --- /dev/null +++ b/src/assets/images/mother-tongue-sangh.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/mother-tongue.svg b/src/assets/images/mother-tongue.svg new file mode 100644 index 0000000..991d5fd --- /dev/null +++ b/src/assets/images/mother-tongue.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/nature_and_child.jpg b/src/assets/images/nature_and_child.jpg new file mode 100644 index 0000000..71d96a2 Binary files /dev/null and b/src/assets/images/nature_and_child.jpg differ diff --git a/src/assets/images/next-arrow-black.svg b/src/assets/images/next-arrow-black.svg new file mode 100644 index 0000000..e15dd29 --- /dev/null +++ b/src/assets/images/next-arrow-black.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/no-data-found-image.svg b/src/assets/images/no-data-found-image.svg new file mode 100644 index 0000000..1c74829 --- /dev/null +++ b/src/assets/images/no-data-found-image.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/notification-fill.svg b/src/assets/images/notification-fill.svg new file mode 100644 index 0000000..75de2ee --- /dev/null +++ b/src/assets/images/notification-fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/plus-icon.svg b/src/assets/images/plus-icon.svg new file mode 100644 index 0000000..0fba4c7 --- /dev/null +++ b/src/assets/images/plus-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/pray-icon-fill.svg b/src/assets/images/pray-icon-fill.svg new file mode 100644 index 0000000..15efcd7 --- /dev/null +++ b/src/assets/images/pray-icon-fill.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/src/assets/images/pray-icon-outline.svg b/src/assets/images/pray-icon-outline.svg new file mode 100644 index 0000000..5e3b491 --- /dev/null +++ b/src/assets/images/pray-icon-outline.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/assets/images/privacy-policy.svg b/src/assets/images/privacy-policy.svg new file mode 100644 index 0000000..1ee5914 --- /dev/null +++ b/src/assets/images/privacy-policy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/profession.svg b/src/assets/images/profession.svg new file mode 100644 index 0000000..35a7664 --- /dev/null +++ b/src/assets/images/profession.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/images/profile-bg-design.svg b/src/assets/images/profile-bg-design.svg new file mode 100644 index 0000000..445793b --- /dev/null +++ b/src/assets/images/profile-bg-design.svg @@ -0,0 +1,2142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/profile-bg-sangh.svg b/src/assets/images/profile-bg-sangh.svg new file mode 100644 index 0000000..196936f --- /dev/null +++ b/src/assets/images/profile-bg-sangh.svg @@ -0,0 +1,2142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/profile-bg.svg b/src/assets/images/profile-bg.svg new file mode 100644 index 0000000..1cc995c --- /dev/null +++ b/src/assets/images/profile-bg.svg @@ -0,0 +1,2142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/profile-img.png b/src/assets/images/profile-img.png new file mode 100644 index 0000000..ae0050a Binary files /dev/null and b/src/assets/images/profile-img.png differ diff --git a/src/assets/images/qualification.svg b/src/assets/images/qualification.svg new file mode 100644 index 0000000..c25b40d --- /dev/null +++ b/src/assets/images/qualification.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/red.svg b/src/assets/images/red.svg new file mode 100644 index 0000000..d13d89b --- /dev/null +++ b/src/assets/images/red.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/registration-no-icon.svg b/src/assets/images/registration-no-icon.svg new file mode 100644 index 0000000..9d9f935 --- /dev/null +++ b/src/assets/images/registration-no-icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/src/assets/images/round-like-icon.svg b/src/assets/images/round-like-icon.svg new file mode 100644 index 0000000..f8c4e6f --- /dev/null +++ b/src/assets/images/round-like-icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/src/assets/images/round-pray-icon.svg b/src/assets/images/round-pray-icon.svg new file mode 100644 index 0000000..d03f323 --- /dev/null +++ b/src/assets/images/round-pray-icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/sangh-dharm.svg b/src/assets/images/sangh-dharm.svg new file mode 100644 index 0000000..f07575b --- /dev/null +++ b/src/assets/images/sangh-dharm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/sangh-fill-icon.svg b/src/assets/images/sangh-fill-icon.svg new file mode 100644 index 0000000..3693252 --- /dev/null +++ b/src/assets/images/sangh-fill-icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/sangh-fill-icon_old.svg b/src/assets/images/sangh-fill-icon_old.svg new file mode 100644 index 0000000..5cc24e7 --- /dev/null +++ b/src/assets/images/sangh-fill-icon_old.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/sangh-profile-bg.svg b/src/assets/images/sangh-profile-bg.svg new file mode 100644 index 0000000..ef6740c --- /dev/null +++ b/src/assets/images/sangh-profile-bg.svg @@ -0,0 +1,2142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/sangh-profile.png b/src/assets/images/sangh-profile.png new file mode 100644 index 0000000..a6922ff Binary files /dev/null and b/src/assets/images/sangh-profile.png differ diff --git a/src/assets/images/sangh-sampraday.svg b/src/assets/images/sangh-sampraday.svg new file mode 100644 index 0000000..1e3710a --- /dev/null +++ b/src/assets/images/sangh-sampraday.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/sangh-type.svg b/src/assets/images/sangh-type.svg new file mode 100644 index 0000000..0178aab --- /dev/null +++ b/src/assets/images/sangh-type.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/sangh.svg b/src/assets/images/sangh.svg new file mode 100644 index 0000000..2a7b965 --- /dev/null +++ b/src/assets/images/sangh.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/sant-fill-green.svg b/src/assets/images/sant-fill-green.svg new file mode 100644 index 0000000..4de7b77 --- /dev/null +++ b/src/assets/images/sant-fill-green.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/images/sant-profile.png b/src/assets/images/sant-profile.png new file mode 100644 index 0000000..a2e2160 Binary files /dev/null and b/src/assets/images/sant-profile.png differ diff --git a/src/assets/images/sant.svg b/src/assets/images/sant.svg new file mode 100644 index 0000000..ceb1375 --- /dev/null +++ b/src/assets/images/sant.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/share-icon.svg b/src/assets/images/share-icon.svg new file mode 100644 index 0000000..b28b3fc --- /dev/null +++ b/src/assets/images/share-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/shravak-fill.svg b/src/assets/images/shravak-fill.svg new file mode 100644 index 0000000..54270c3 --- /dev/null +++ b/src/assets/images/shravak-fill.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/shravak-icon.svg b/src/assets/images/shravak-icon.svg new file mode 100644 index 0000000..5942d81 --- /dev/null +++ b/src/assets/images/shravak-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/images/shravak-logo.svg b/src/assets/images/shravak-logo.svg new file mode 100644 index 0000000..9609fce --- /dev/null +++ b/src/assets/images/shravak-logo.svg @@ -0,0 +1,16 @@ + + + diff --git a/src/assets/images/shravak-outline.svg b/src/assets/images/shravak-outline.svg new file mode 100644 index 0000000..fc036ba --- /dev/null +++ b/src/assets/images/shravak-outline.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/shravak-profile.png b/src/assets/images/shravak-profile.png new file mode 100644 index 0000000..92badd5 Binary files /dev/null and b/src/assets/images/shravak-profile.png differ diff --git a/src/assets/images/splash-banner.svg b/src/assets/images/splash-banner.svg new file mode 100644 index 0000000..c000169 --- /dev/null +++ b/src/assets/images/splash-banner.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/students.svg b/src/assets/images/students.svg new file mode 100644 index 0000000..491146a --- /dev/null +++ b/src/assets/images/students.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/success.svg b/src/assets/images/success.svg new file mode 100644 index 0000000..2c1a48c --- /dev/null +++ b/src/assets/images/success.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/tag-people-sangh.svg b/src/assets/images/tag-people-sangh.svg new file mode 100644 index 0000000..4b6dd45 --- /dev/null +++ b/src/assets/images/tag-people-sangh.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/tag-people.svg b/src/assets/images/tag-people.svg new file mode 100644 index 0000000..7dd965f --- /dev/null +++ b/src/assets/images/tag-people.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/terms-conditions.svg b/src/assets/images/terms-conditions.svg new file mode 100644 index 0000000..5b71f32 --- /dev/null +++ b/src/assets/images/terms-conditions.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/thana-icon.svg b/src/assets/images/thana-icon.svg new file mode 100644 index 0000000..e177f3f --- /dev/null +++ b/src/assets/images/thana-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/thana-leader.svg b/src/assets/images/thana-leader.svg new file mode 100644 index 0000000..9e437f9 --- /dev/null +++ b/src/assets/images/thana-leader.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/tiffin.svg b/src/assets/images/tiffin.svg new file mode 100644 index 0000000..22e98e7 --- /dev/null +++ b/src/assets/images/tiffin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/upi.svg b/src/assets/images/upi.svg new file mode 100644 index 0000000..3fde8f9 --- /dev/null +++ b/src/assets/images/upi.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/user.jpg b/src/assets/images/user.jpg new file mode 100644 index 0000000..7e588cd Binary files /dev/null and b/src/assets/images/user.jpg differ diff --git a/src/assets/images/vector-blue.svg b/src/assets/images/vector-blue.svg new file mode 100644 index 0000000..a902d65 --- /dev/null +++ b/src/assets/images/vector-blue.svg @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-green.svg b/src/assets/images/vector-green.svg new file mode 100644 index 0000000..3274b58 --- /dev/null +++ b/src/assets/images/vector-green.svg @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-image-s1.svg b/src/assets/images/vector-image-s1.svg new file mode 100644 index 0000000..1dc0821 --- /dev/null +++ b/src/assets/images/vector-image-s1.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-image-s2.svg b/src/assets/images/vector-image-s2.svg new file mode 100644 index 0000000..0d5ebc4 --- /dev/null +++ b/src/assets/images/vector-image-s2.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-image-welcome.svg b/src/assets/images/vector-image-welcome.svg new file mode 100644 index 0000000..2a80e35 --- /dev/null +++ b/src/assets/images/vector-image-welcome.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-image.svg b/src/assets/images/vector-image.svg new file mode 100644 index 0000000..1fc16e9 --- /dev/null +++ b/src/assets/images/vector-image.svg @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vector-orange.svg b/src/assets/images/vector-orange.svg new file mode 100644 index 0000000..e31c6c9 --- /dev/null +++ b/src/assets/images/vector-orange.svg @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vihar-icon.svg b/src/assets/images/vihar-icon.svg new file mode 100644 index 0000000..0924431 --- /dev/null +++ b/src/assets/images/vihar-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/vihar-red-icon.svg b/src/assets/images/vihar-red-icon.svg new file mode 100644 index 0000000..8b1d0f6 --- /dev/null +++ b/src/assets/images/vihar-red-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/web-like-animation.svg b/src/assets/images/web-like-animation.svg new file mode 100644 index 0000000..8057b1a --- /dev/null +++ b/src/assets/images/web-like-animation.svg @@ -0,0 +1,17 @@ + + web_like_animation-01 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/web-pray-animation.svg b/src/assets/images/web-pray-animation.svg new file mode 100644 index 0000000..15c677d --- /dev/null +++ b/src/assets/images/web-pray-animation.svg @@ -0,0 +1,13 @@ + + web_pray_animation-01 + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/welcome-sangh.svg b/src/assets/images/welcome-sangh.svg new file mode 100644 index 0000000..7fa2dbc --- /dev/null +++ b/src/assets/images/welcome-sangh.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/welcome-sant.svg b/src/assets/images/welcome-sant.svg new file mode 100644 index 0000000..349d690 --- /dev/null +++ b/src/assets/images/welcome-sant.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/welcome-shravak.svg b/src/assets/images/welcome-shravak.svg new file mode 100644 index 0000000..192302d --- /dev/null +++ b/src/assets/images/welcome-shravak.svg @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/yellow.svg b/src/assets/images/yellow.svg new file mode 100644 index 0000000..a72c71c --- /dev/null +++ b/src/assets/images/yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/youtube-logo.svg b/src/assets/images/youtube-logo.svg new file mode 100644 index 0000000..e498231 --- /dev/null +++ b/src/assets/images/youtube-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/scss/css/form.scss b/src/assets/scss/css/form.scss new file mode 100644 index 0000000..8a639b7 --- /dev/null +++ b/src/assets/scss/css/form.scss @@ -0,0 +1,104 @@ +ion-card { + height: 200px; + padding-top: 96px; + + ion-card-header { + + ion-card-title { + font-size: var(--ion-font-size-20); + margin-bottom: var(--ion-margin-10); + margin-left: var(--ion-margin-20); + } + } +} + +h1 { + font-weight: var(--ion-font-weight-bold); + margin-top: var(--ion-margin-40); +} + +p { + font-size: var(--ion-font-size-14); + + ion-button { + height: auto; + color: var(--ion-color); + + &::part(native) { + --background: none; + padding: var(--ion-padding-0); + line-height: 16px; + } + } + + &.agreed-content { + margin-top: 0; + color: var(--ion-content-color); + + ion-label { + padding-left: var(--ion-padding-10); + width: calc(100% - 18px); + } + + ion-button { + &::part(native) { + line-height: 19px; + } + } + } +} + +ion-item { + font-size: var(--ion-font-size-14); + + &.country-dropdown { + --min-height: auto; + + &.mobile-no { + margin-bottom: var(--ion-margin-0); + } + + ionic-selectable { + width: 100px; + margin-right: 10px; + margin-bottom: var(--ion-margin-0); + padding-left: 6px; + padding-right: 15px; + } + } + + &.select-dharm { + margin-top: var(--ion-margin-20); + } + + ion-select { + &::part(icon) { + display: none; + } + } + + ion-label { + font-weight: 600; + + span { + &.suffix { + color: var(--ion-content-color); + font-size: 12px; + } + } + } + +} + +.error { + font-size: var(--ion-font-size-12); + color: var(--ion-color-danger); +} + +.sc-ion-input-md-h:not(.legacy-input) { + min-height: 40px; +} + +.sc-ion-input-md-h { + --padding-start: var(--ion-padding-10) +} \ No newline at end of file diff --git a/src/assets/shapes.svg b/src/assets/shapes.svg new file mode 100644 index 0000000..d370b4d --- /dev/null +++ b/src/assets/shapes.svg @@ -0,0 +1 @@ + diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..1bd0d66 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,20 @@ +export const environment = { + production: true, + + // ✅ Laravel backend API (Localhost) + apiUrl: 'https://lightyellow-mule-306456.hostingersite.com/api/v1/', + + // ✅ Local site URL (Ionic runs here) + siteUrl: 'https://lightyellow-mule-306456.hostingersite.com/', + + // ✅ Google Maps API Key (same as before) + mapKey: 'AIzaSyAoZv-67UKDVz5Rp3fa3e2xcHunahFGKOc', + + // ✅ Firebase config (no change) + firebaseOptions: { + apiKey: 'AIzaSyDvBIP5p4o8zVhLXq0CjmRyh6mT99vYY_4', + projectId: 'global-jain-dev', + messagingSenderId: '738197080970', + appId: '1:738197080970:ios:f75c031175109ec6141673' + } +}; diff --git a/src/environments/environment.stg.ts b/src/environments/environment.stg.ts new file mode 100644 index 0000000..1e01a3d --- /dev/null +++ b/src/environments/environment.stg.ts @@ -0,0 +1,14 @@ +export const environment = { + production: false, + apiUrl: 'https://lightyellow-mule-306456.hostingersite.com/api/v1/', + + // ✅ Local site URL (Ionic runs here) + siteUrl: 'https://lightyellow-mule-306456.hostingersite.com/', + mapKey: 'AIzaSyAoZv-67UKDVz5Rp3fa3e2xcHunahFGKOc', + firebaseOptions: { + apiKey: 'AIzaSyDvBIP5p4o8zVhLXq0CjmRyh6mT99vYY_4', + projectId: 'global-jain-dev', + messagingSenderId: '738197080970', + appId: '1:738197080970:ios:f75c031175109ec6141673' + } +}; \ No newline at end of file diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..63d28a9 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,37 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + apiUrl: 'https://lightyellow-mule-306456.hostingersite.com/api/v1/', + + // ✅ Local site URL (Ionic runs here) + siteUrl: 'https://lightyellow-mule-306456.hostingersite.com/', + + + // apiUrl: 'http://127.0.0.1:8000/api/v1/', + + // // ✅ Local site URL (Ionic runs here) + // siteUrl: 'http://127.0.0.1:8000/', + + + + // mapKey: 'AIzaSyAIysa34NQkPDqveMiKh2hYrCuMwpYYaK4', + mapKey: 'AIzaSyAoZv-67UKDVz5Rp3fa3e2xcHunahFGKOc', + firebaseOptions: { + apiKey: 'AIzaSyDvBIP5p4o8zVhLXq0CjmRyh6mT99vYY_4', + projectId: 'global-jain-dev', + messagingSenderId: '738197080970', + appId: '1:738197080970:ios:f75c031175109ec6141673' + } +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/src/global.scss b/src/global.scss new file mode 100644 index 0000000..6e09f24 --- /dev/null +++ b/src/global.scss @@ -0,0 +1,1642 @@ +/* + * App Global CSS + * ---------------------------------------------------------------------------- + * Put style rules here that you want to apply globally. These styles are for + * the entire app and not just one component. Additionally, this file can be + * used as an entry point to import other CSS/Sass files to be included in the + * output CSS. + * For more information on global stylesheets, visit the documentation: + * https://ionicframework.com/docs/layout/global-stylesheets + */ + +/* Core CSS required for Ionic components to work properly */ +@import "~@ionic/angular/css/core.css"; + +/* Basic CSS for apps built with Ionic */ +@import "~@ionic/angular/css/normalize.css"; +@import "~@ionic/angular/css/structure.css"; +@import "~@ionic/angular/css/typography.css"; +@import "~@ionic/angular/css/display.css"; + +/* Optional CSS utils that can be commented out */ +@import "~@ionic/angular/css/padding.css"; +@import "~@ionic/angular/css/float-elements.css"; +@import "~@ionic/angular/css/text-alignment.css"; +@import "~@ionic/angular/css/text-transformation.css"; +@import "~@ionic/angular/css/flex-utils.css"; + +@import "../src/app/pages/sant/sant-information/sant-information.page.scss"; +@import "../src/app/pages/shravak/passive-user-education/passive-user-education.page.scss"; +@import "../src/app/pages/shravak/passive-user-profile-image/passive-user-profile-image.page.scss"; +@import "../src/app/pages/shravak/passive-user-information/passive-user-information.page.scss"; +@import "../src/app/pages/sant/about-diksha/about-diksha.page.scss"; +@import "../src/app/pages/sant/about-sansarik-jeevan/about-sansarik-jeevan.page.scss"; +@import "../src/app/pages/sant/sant-profile-image/sant-profile-image.page.scss"; +@import "../src/app/pages/sant/search-sant/search-sant.page.scss"; +@import "../src/app/pages/sant/vihar-info/vihar-info.page.scss"; +@import "../src/app/pages/sant/chaturmas-info/chaturmas-info.page.scss"; +@import "../src/app/pages/sant/add-chaturmas/add-chaturmas.page.scss"; +@import "../src/app/pages/auth/otp/otp.page.scss"; +@import "../src/app/pages/common/menu/menu.page.scss"; +@import "../src/app/pages/common/create-account/create-account.page.scss"; +@import "../src/app/pages/shravak/shravak-view-profile/shravak-view-profile.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-profile/shravak-edit-profile.page.scss"; +@import "../src/app/pages/shravak/shravak-about/shravak-about.page.scss"; +@import "../src/app/pages/sant/create-new-sant/create-new-sant.page.scss"; +@import "../src/app/pages/shravak/shravak-other-profile/shravak-other-profile.page.scss"; +@import "../src/app/pages/post/post-feed/post-feed.page.scss"; +@import "../src/app/pages/post/post-type/post-type.page.scss"; +@import "../src/app/pages/post/add-location/add-location.page.scss"; +@import "../src/app/pages/common/global-search/global-search.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-location/shravak-edit-location.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-contact-info/shravak-edit-contact-info.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-family-members/shravak-edit-family-members.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-work/shravak-edit-work.page.scss"; +@import "../src/app/pages/shravak/shravak-edit-education/shravak-edit-education.page.scss"; +@import "../src/app/pages/shravak/shravak-other-about/shravak-other-about.page.scss"; +@import "../src/app/pages/messages/message/message.page.scss"; +@import "../src/app/pages/messages/message-chat/message-chat.page.scss"; +@import "../src/app/pages/common/notification/notification.page.scss"; +@import "../src/app/pages/shravak/friend-request/friend-request.page.scss"; +@import "../src/app/pages/sangh/sangh-information/sangh-information.page.scss"; +@import "../src/app/pages/sangh/sangh-address/sangh-address.page.scss"; +@import "../src/app/pages/sangh/sangh-profile-image/sangh-profile-image.page.scss"; +@import "../src/app/pages/sangh/invite-members/invite-members.page.scss"; +@import "../src/app/pages/sangh/sangh-profile/sangh-profile.page.scss"; +@import "../src/app/pages/sant/vihar-modal/vihar-modal.page.scss"; +@import "../src/app/pages/sangh/sangh-members-admin-view/sangh-members-admin-view.page.scss"; +@import "../src/app/pages/sangh/sangh-search-member/sangh-search-member.page.scss"; +@import "../src/app/pages/sangh/sangh-role-select/sangh-role-select.page.scss"; +@import "../src/app/pages/sangh/sangh-edit-profile/sangh-edit-profile.page.scss"; +@import "../src/app/pages/post/tagged-user/tagged-user.page.scss"; +@import "../src/app/pages/post/post-detail/post-detail.page.scss"; +@import "../src/app/pages/sangh/create-new-sangh/create-new-sangh.page.scss"; +@import "../src/app/pages/sangh/view-all-sangh/view-all-sangh.page.scss"; +@import "../src/app/pages/sangh/add-committee-member/add-committee-member.page.scss"; +@import "../src/app/pages/sangh/invitations/invitations.page.scss"; +@import "../src/app/pages/sangh/about-sangh/about-sangh.page.scss"; +@import "../src/app/pages/common/visibility-policy/visibility-policy.page.scss"; +@import "../src/app/pages/common/terms-policy/terms-policy.page.scss"; +@import "../src/app/pages/sant/thana-list/thana-list.page.scss"; +@import "../src/app/pages/sant/add-thana/add-thana.page.scss"; +@import "../src/app/pages/shravak/friend-list/friend-list.page.scss"; +@import "../src/app/pages/shravak/friends-suggestions-view-all/friends-suggestions-view-all.page.scss"; +@import "../src/app/pages/shravak/search-friend/search-friend.page.scss"; +@import "swiper/scss"; +@import "@ionic/angular/css/ionic-swiper"; +@import "swiper/scss/pagination"; +@import "swiper/scss/zoom"; + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Bold.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Bold.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Bold.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Bold.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Bold.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Bold.svg#Gilroy-Bold") format("svg"); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-SemiBold.eot"); + src: url("assets/fonts/Gilroy/Gilroy-SemiBold.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-SemiBold.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-SemiBold.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-SemiBold.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-SemiBold.svg#Gilroy-SemiBold") format("svg"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-ExtraBold.eot"); + src: url("assets/fonts/Gilroy/Gilroy-ExtraBold.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-ExtraBold.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-ExtraBold.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-ExtraBold.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-ExtraBold.svg#Gilroy-ExtraBold") format("svg"); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Black.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Black.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Black.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Black.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Black.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Black.svg#Gilroy-Black") format("svg"); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Light.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Light.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Light.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Light.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Light.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Light.svg#Gilroy-Light") format("svg"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Heavy.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Heavy.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Heavy.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Heavy.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Heavy.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Heavy.svg#Gilroy-Heavy") format("svg"); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Regular.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Regular.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Regular.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Regular.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Regular.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Regular.svg#Gilroy-Regular") format("svg"); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Medium.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Medium.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Medium.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Medium.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Medium.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Medium.svg#Gilroy-Medium") format("svg"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-Thin.eot"); + src: url("assets/fonts/Gilroy/Gilroy-Thin.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-Thin.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-Thin.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-Thin.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-Thin.svg#Gilroy-Thin") format("svg"); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Gilroy"; + src: url("assets/fonts/Gilroy/Gilroy-UltraLight.eot"); + src: url("assets/fonts/Gilroy/Gilroy-UltraLight.eot?#iefix") format("embedded-opentype"), + url("assets/fonts/Gilroy/Gilroy-UltraLight.woff2") format("woff2"), + url("assets/fonts/Gilroy/Gilroy-UltraLight.woff") format("woff"), + url("assets/fonts/Gilroy/Gilroy-UltraLight.ttf") format("truetype"), + url("assets/fonts/Gilroy/Gilroy-UltraLight.svg#Gilroy-UltraLight") format("svg"); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +h1 { + font-size: var(--ion-font-size-24); +} + +h2 { + font-size: var(--ion-font-size-20); +} + +h3 { + font-size: var(--ion-font-size-18); +} + +h4 { + font-size: var(--ion-font-size-14); +} + +h5 { + font-size: var(--ion-font-size-14); +} + +.ml-2 { + margin-left: 2px !important; +} + +.ml-8 { + margin-left: 8px !important; +} + +.mb-5 { + margin-bottom: 5px !important; +} + +.mb-3 { + margin-bottom: 3px !important; +} + +.mb-10 { + margin-bottom: var(--ion-margin-10) !important; +} + +.mb-20 { + margin-bottom: var(--ion-margin-20) !important; +} + +.mt-10 { + margin-top: var(--ion-margin-10) !important; +} + +.p-10 { + padding: 10px; +} + +.d-flex { + display: flex; +} + +.w-100 { + width: 100%; +} + +.success-toast { + --background: var(--ion-color-success); + --color: var(--ion-color-white); +} + +.error-toast { + --background: var(--ion-color-danger); + --color: var(--ion-color-white); +} + +.blink_me { + animation: blinker 1.5s linear infinite; +} + +.ionic-selectable-icon { + display: none; +} + +@keyframes blinker { + 50% { + opacity: 0; + } +} + +ion-button { + height: 45px; +} + +ion-button::part(native) { + --background: var(--ion-color); + font-size: var(--ion-font-size-12); + text-transform: capitalize; + border-radius: 5px; + box-shadow: none; + letter-spacing: 1px; +} + +.global-form { + font-size: var(--ion-font-size-14); + width: 100%; + + &.shravak-edit-profile-form, + &.shravak-edit-work-form, + &.shravak-edit-contact-info { + width: calc(100% - 30px); + } + + .sc-ion-input-md-h:not(.legacy-input) { + min-height: 40px; + } + + &.shravak-edit-location { + width: calc(100% - 32px); + } + + + div { + + .sc-ion-input-md-h:not(.legacy-input), + .sc-ion-input-ios-h:not(.legacy-input) { + min-height: 40px; + } + + + &.country-dropdown { + --min-height: auto; + + &.mobile-no { + margin-bottom: var(--ion-margin-0); + } + + ionic-selectable { + width: 100px; + margin-right: 10px; + margin-bottom: var(--ion-margin-0); + padding-left: 6px; + padding-right: 15px; + + &.custom-arrow { + &::after { + top: 22px; + right: 8px; + } + } + } + } + + &.select-dharm { + margin-top: var(--ion-margin-20); + + ion-select { + .select-wrapper { + display: initial !important; + } + } + } + + .custom-select { + --border-width: 0; + border-width: 0; + font-size: 14px; + border-radius: 5px; + min-height: 40px; + overflow: hidden; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + + &::part(icon) { + display: none; + } + + &::part(container) { + padding-left: var(--ion-padding-10); + } + + } + + ionic-selectable { + align-items: center; + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + position: relative; + font-size: var(--ion-font-size-14) !important; + background: transparent; + max-width: 100%; + padding-left: var(--ion-padding-10); + } + + &.mobile-no-position { + position: relative; + + + .mobile-number { + position: absolute; + top: 0; + width: calc(100% - 112px); + right: 0px; + } + } + + label { + font-size: var(--ion-font-size-14); + font-weight: 600; + display: flex; + + + .suffix { + color: var(--ion-content-color); + font-size: 12px; + padding-left: 3px; + } + } + + // --- For OTP Page + .opt-verification-label { + font-weight: normal; + } + + ion-input { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + --highlight-color-focused: none; + --highlight-color-valid: none; + text-align: left; + font-weight: normal; + --padding-start: var(--ion-padding-10); + + label { + font-weight: normal; + } + + } + + .date-padding { + padding-left: var(--ion-padding-10) !important; + height: 40px; + display: flex; + align-items: center; + } + + .disable-label { + pointer-events: none !important; + opacity: 0.4 !important; + } + + .normal-label { + font-weight: normal; + } + + ion-button { + position: absolute; + right: 7px; + top: 19px; + margin: var(--ion-margin-0); + height: 30px; + z-index: 99; + } + + input { + :focus { + outline: none; + } + } + + ion-textarea { + border: 1px solid var(--ion-content-color); + padding: var(--ion-padding-10) !important; + border-radius: .25rem; + --highlight-color-focused: none; + --highlight-color-valid: none; + + label>.native-wrapper>textarea { + padding: var(--ion-padding-0) !important; + } + + .textarea-wrapper.sc-ion-textarea-ios textarea.sc-ion-textarea-ios, + .textarea-wrapper.sc-ion-textarea-md textarea.sc-ion-textarea-md { + font-weight: 400; + } + } + + &.filter-btn { + padding: var(--ion-padding-0) !important; + + ion-button { + position: initial; + } + } + + } + + .passing-year { + ion-input { + height: 40px; + padding-top: var(--ion-padding-10) !important; + } + } + + .university-graduated-to { + div { + display: flex; + + label { + padding-top: var(--ion-padding-10); + } + + ion-input { + height: 40px; + padding-left: var(--ion-padding-10) !important; + } + } + } + + ion-card { + ion-card-header { + ion-card-title { + ion-select { + &.privacy-label { + width: auto; + padding-right: 25px; + } + } + } + } + + ion-card-header ion-card-title, + ion-card-content { + .custom-select { + --border-width: 0; + border-width: 0; + font-size: 14px; + border-radius: 5px; + min-height: 40px; + overflow: hidden; + border-radius: 0.25rem; + height: 2.5rem; + + &::part(icon) { + display: none; + } + } + + + + ionic-selectable { + border-radius: 0.25rem; + height: 2.5rem; + position: relative; + font-size: var(--ion-font-size-14) !important; + background: transparent; + max-width: 100%; + padding-left: var(--ion-padding-10); + + .ionic-selectable-inner { + .ionic-selectable-value { + padding-top: var(--ion-padding-10); + } + } + } + + ion-radio-group { + ion-item { + font-size: var(--ion-font-size-14); + } + } + + ion-input { + --padding-start: var(--ion-padding-15); + } + } + + ion-card-header ion-card-title .custom-select { + height: initial !important; + min-height: unset; + + } + } + + ion-text { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + font-size: var(--ion-font-size-14) !important; + background: transparent; + display: inherit; + padding: var(--ion-padding-10) var(--ion-padding-0) var(--ion-padding-0) var(--ion-padding-10); + } + + &.shravak-edit-work-form { + ion-card { + ion-card-content { + ion-item { + ion-input { + margin-top: 5px; + + label { + position: absolute; + top: 0; + } + } + + ion-checkbox { + width: 100%; + } + } + } + } + } +} + +app-shravak-edit-education, +app-passive-user-education, +app-about-sansarik-jeevan, +app-sangh-edit-profile { + .global-form div label { + font-weight: normal; + } +} + +.custom-arrow { + position: relative; + + &::after { + position: absolute; + content: ""; + top: 50%; + transform: translateY(-50%); + right: 12px; + box-sizing: border-box; + height: 6px; + width: 6px; + border-color: var(--ion-content-color); + border-width: 0px 1px 1px 0px; + transition: border-width 150ms ease-in-out; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid var(--ion-content-color); + } +} + +ion-header { + box-shadow: none !important; + + &.header-md::after { + display: none; + } + + ion-toolbar { + --background: var(--ion-color); + --min-height: 68px; + border-radius: 0 0 15px 15px; + position: relative; + padding-top: calc(env(safe-area-inset-top) - 10px) !important; + + &.ios { + --min-height: 58px; + } + + ion-title { + padding: var(--ion-padding-0) var(--ion-padding-15); + text-align: left; + color: var(--ion-color-white); + + &.back-btn { + padding-left: 45px; + } + } + + ion-icon { + margin-right: var(--ion-margin-15); + color: #fff; + position: relative; + z-index: 99; + } + + ion-back-button { + color: #fff; + } + + &.sant { + --background: var(--ion-color-sant); + } + + &.sangh { + --background: var(--ion-color-sangh); + } + + &.hospital { + --background: var(--ion-color-hospital); + } + + ion-badge { + position: absolute; + top: 12px; + width: 18px; + padding: 0 !important; + right: 9px; + left: auto; + height: 18px; + border-radius: 100%; + font-size: 10px; + font-weight: 400; + z-index: 2; + background: red; + } + } +} + +.required-label { + color: var(--ion-color-danger); +} + +ion-item { + --inner-border-width: 0; + --inner-padding-end: 0; + padding: var(--ion-padding-0) var(--ion-padding-15); + --border-width: 0; + --border-style: none; + margin-bottom: var(--ion-margin-20); + --background: none; + + ion-label { + margin-top: 0; + font-size: var(--ion-font-size-14) !important; + + &.label-stacked.sc-ion-label-md-h { + transform: translate(0) scale(1); + color: #000 !important; + } + } + + label { + font-size: var(--ion-font-size-14) !important; + + &.show-lbl { + font-size: var(--ion-font-size-15) !important; + } + } + + input { + height: 2.5rem; + padding: var(--ion-padding-10) !important; + background: transparent; + } + + .sc-ion-input-md-h:not(.legacy-input), + .sc-ion-input-ios-h:not(.legacy-input) { + min-height: initial; + } + + ion-input, + ion-text { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + font-size: var(--ion-font-size-14) !important; + background: transparent; + + input[type="text"], + input[type="number"] { + padding: var(--ion-padding-10) !important; + font-size: var(--ion-font-size-14) !important; + background: transparent; + } + } + + ion-select, + ion-textarea { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + margin-bottom: var(--ion-margin-20); + padding: var(--ion-padding-10) var(--ion-padding-15) !important; + font-size: var(--ion-font-size-14) !important; + margin-top: 0 !important; + background: transparent; + + textarea { + --padding-inline-end: 0; + --padding-top: 0; + --padding-bottom: 0; + background: transparent; + } + + &::part(icon) { + transform: translate3d(0, 0, 0); + } + } + + ionic-selectable { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + margin-bottom: var(--ion-margin-20); + font-size: var(--ion-font-size-14) !important; + background: transparent; + } + + ion-text { + width: 100%; + display: flex; + align-items: center; + padding-left: 5px; + font-size: 12px; + background: transparent; + } + + ion-popover { + --offset-x: 0; + } + + &::part(native) { + padding: var(--ion-padding-0); + } + + &.item-has-focus { + border: none; + --highlight-background: none; + --show-full-highlight: 0; + } +} + +ion-popover { + --width: 60%; + --offset-x: 4%; + + ion-label { + padding-left: var(--ion-padding-15); + } + + ion-item { + margin: var(--ion-margin-0); + } + + ion-select-popover { + ion-list { + ion-radio-group { + ion-item { + margin: var(--ion-margin-0); + padding: var(--ion-padding-0); + --min-height: 30px; + } + } + } + } + + &.content-dropdown { + &::part(content) { + left: auto; + right: 10px; + width: 70%; + } + } +} + +ion-footer { + background: var(--ion-color-white); + box-shadow: 2px 2px 7px #ebebeb; + + &.footer-md::before { + display: none; + } + + &.sant { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + } + } + } + + &.sangh { + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + } + } + } + + ion-tabs { + ion-tab-bar { + ion-tab-button { + ion-label { + font-size: var(--ion-font-size-12); + --ripple-color: #b4b4b4; + } + } + } + } +} + +:host(.privacy-label) { + label { + float: right; + } +} + +.error { + color: #f00; + margin-top: 5px; + font-size: 0.68rem; +} + +ion-content { + --background: var(--ion-background-content); + + ion-item::part(detail-icon) { + display: none; + } + + .search-data { + padding: 5px 0; + position: absolute; + top: 60px; + width: 100%; + z-index: 9999; + + ion-list { + box-shadow: 0px 0px 3px 0px #dbdbdb; + padding: var(--ion-padding-0); + max-height: 200px; + overflow-y: auto; + + ion-item { + margin: var(--ion-margin-0); + border-bottom: 1px solid #dbdbdb; + + ion-avatar { + margin: var(--ion-margin-0) var(--ion-margin-10) var(--ion-margin-0) var(--ion-margin-0); + } + + ion-label { + h2 { + padding: var(--ion-padding-0); + margin: var(--ion-margin-0); + } + } + } + } + } + + ion-card { + box-shadow: 2px 2px 7px #ebebeb; + border-radius: 5px; + } +} + +ion-tabs { + ion-tab-bar { + ion-tab-button { + color: #666666; + font-size: 10px; + + &.active { + color: #2482a7 !important; + --ripple-color: #2482a7 !important; + } + + img { + margin-bottom: 0px; + } + + &:last-child { + img { + margin-top: 6px; + } + } + + ion-label { + margin-top: 4px; + } + + &:nth-child(4) { + position: relative; + + ion-badge { + position: absolute; + top: 2px; + width: 18px; + padding: 0 !important; + right: 12px; + left: auto; + height: 18px; + border-radius: 100%; + font-size: 10px; + font-weight: 400; + z-index: 2; + background: red; + } + } + } + + &.sant { + ion-tab-button { + &.active { + color: #4e9c81 !important; + --ripple-color: #4e9c81 !important; + + ion-label { + color: #4e9c81 !important; + --ripple-color: #4e9c81 !important; + } + } + } + } + + &.sangh { + ion-tab-button { + &.active { + color: var(--ion-color-sangh) !important; + --ripple-color: var(--ion-color-sangh) !important; + + ion-label { + color: var(--ion-color-sangh) !important; + --ripple-color: var(--ion-color-sangh) !important; + } + } + } + } + } +} + +ion-modal { + ion-content { + --background: var(--ion-color-white); + + ion-item { + + ion-select, + ionic-selectable { + margin-bottom: var(--ion-margin-0); + } + } + } + + ionic-selectable-modal { + ion-header { + ion-toolbar { + --background: none; + --min-height: 48px; + + &.toolbar-searchbar { + padding-top: 0 !important; + } + + ion-buttons { + ion-button { + &::part(native) { + color: #fff !important; + } + + color: #fff !important; + } + } + } + } + + ion-content { + background: var(--ion-color-white); + + ion-list { + ion-item { + --min-height: 25px; + + ion-icon { + margin: var(--ion-margin-0); + + &.ion-color-primary { + --ion-color-base: var(--ion-color) !important; + } + } + } + } + } + + ion-searchbar { + padding: 0 15px !important; + --box-shadow: none !important; + + .searchbar-input-container { + border: 1px solid var(--ion-content-color); + border-radius: 0.25rem; + height: 2.5rem; + font-size: var(--ion-font-size-14) !important; + + input { + height: 38px !important; + --min-height: 38px; + } + } + } + + ion-footer { + ion-toolbar { + padding-bottom: 5px !important; + } + } + } + + ion-selectable-modal { + ion-buttons { + ion-button { + --color: #fff !important; + } + } + } +} + +ion-app { + letter-spacing: 1px !important; +} + +ion-action-sheet { + .action-sheet-wrapper { + .action-sheet-container { + .action-sheet-group-cancel { + button { + display: flex; + width: calc(100% - 30px); + margin: var(--ion-margin-0) auto; + height: 35px; + border-radius: 5px; + + span { + justify-content: center; + } + } + } + } + } +} + +.calendar { + ion-card-content { + padding: var(--ion-padding-0) !important; + + ion-input { + input { + --padding-end: var(--ion-padding-15); + --padding-start: 0; + } + } + } +} + +.sant { + ion-item { + + ion-input, + ion-text { + border: 1px solid var(--ion-content-color-sant); + } + + ion-select, + ion-textarea, + ionic-selectable { + border: 1px solid var(--ion-content-color-sant); + padding: var(--ion-padding-10) !important; + } + } +} + +ion-radio { + &::part(container) { + --ion-color-base: var(--ion-color); + } + + &::part(mark) { + --ion-color-base: var(--ion-color); + } +} + +.item-has-focus .label-stacked.sc-ion-label-md-h:not(.ion-color) { + color: inherit !important; +} + +.ion-activated { + --background-activated: transparent !important; +} + +.message-toast { + &::part(container) { + word-break: break-all; + } + + &::part(message) { + max-height: 80px; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.ios { + .alert-wrapper { + .alert-head { + h2 { + margin: var(--ion-margin-0); + } + } + + .alert-message { + padding-bottom: var(--ion-padding-15) !important; + } + + .alert-button-group { + button { + margin-bottom: var(--ion-margin-0) !important; + font-weight: normal !important; + } + } + } +} + +.pre-fill { + white-space: pre-wrap; +} + + +/*----- 12-09-2022 -----*/ + +app-shravak-view-profile, +app-shravak-other-profile, +app-sangh-profile { + ion-content { + .bottom-bg-location { + ion-card { + &.detail { + ion-card-content { + .img-upload { + swiper-container { + swiper-slide { + background: #e7f7fe; + } + + &::part(pagination) { + width: 100%; + height: 21px; + background-color: var(--ion-color); + bottom: 6px; + } + + &::part(bullet) { + background-color: var(--ion-background-gray); + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + } + } + } + } + } + } +} + +.bottom-bg-location { + ion-card { + &.detail { + ion-card-content { + .img-upload { + .swiper-wrapper { + .swiper-slide { + .slide { + img { + width: auto; + height: auto; + } + } + } + } + } + } + } + } +} + +.bottom-bg-location { + .shravak { + ion-card { + &.detail { + ion-card-header { + border-bottom: 2px solid var(--ion-color); + position: relative; + } + + ion-card-content { + .img-upload { + swiper-container { + swiper-slide { + text-align: center; + background: #e7f7fe; + + } + + &::part(pagination) { + width: 100%; + height: 21px; + background-color: var(--ion-color); + bottom: 6px; + } + + &::part(bullet) { + background-color: var(--ion-background-gray); + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + } + } + } + } + } + + .sant { + ion-card { + &.detail { + ion-card-header { + border-bottom: 2px solid var(--ion-color-sant); + } + + ion-card-content { + .img-upload { + .swiper { + .swiper-wrapper { + .swiper-slide { + background: #dfeae2; + } + } + } + + &::part(pagination) { + background-color: var(--ion-color-sant); + + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + } + } + } + } + + .sangh { + ion-card { + &.detail { + ion-card-header { + border-bottom: 2px solid var(--ion-color-sangh); + position: relative; + } + + ion-card-content { + .img-upload { + + swiper-container { + swiper-slide { + text-align: center; + background: #e7f7fe; + } + + &::part(pagination) { + width: 100%; + height: 21px; + background-color: var(--ion-color-sangh); + bottom: 6px; + } + + &::part(bullet) { + background-color: var(--ion-background-gray); + opacity: 1; + } + + &::part(bullet-active) { + background-color: var(--ion-color-white); + } + } + } + } + } + } + } +} + +.post-hidden-message { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 160px; + padding: 15px 15px 50px; + + img { + margin-bottom: 5px; + } + + p { + margin: var(--ion-margin-0) !important; + } + + ion-button { + height: 1.875rem; + position: absolute; + bottom: 15px; + left: 0; + right: 0; + width: 80%; + margin: 0 auto; + + &::part(native) { + --background: var(--ion-color); + background: var(--ion-color); + } + } +} + +.sangh { + .post-hidden-message { + ion-button { + &::part(native) { + --background: var(--ion-color-sangh); + background: var(--ion-color-sangh); + } + } + } +} + +.sant { + .post-hidden-message { + ion-button { + &::part(native) { + --background: var(--ion-color-sant); + background: var(--ion-color-sant); + } + } + } +} + +ion-tab-button { + &.highlight { + position: relative; + + &::after { + position: absolute; + content: ''; + width: 8px; + height: 8px; + border-radius: 100%; + background: #FF0A0A; + top: 5px; + right: 20px; + } + } +} + +.sent-back-info-icon { + width: 16px; + height: 16px; + color: var(--ion-color-sant); + background: rgba(78, 156, 130, 0.09); + border-radius: 50%; + margin-left: 3px; + vertical-align: middle; + padding: 3px; +} + +.sent-back-info { + --max-width: 90%; + + .alert-head { + padding-top: 0 !important; + } + + .alert-wrapper { + width: 100%; + } + + .sent-back-info-icon { + width: 30px; + height: 30px; + } + + .alert-message { + text-align: center; + + p { + font-size: 12px; + color: #000; + } + } + + .alert-button-group { + justify-content: center; + margin: 5px 0; + + .alert-button { + height: 30px; + background: var(--ion-color-sant); + color: white; + font-weight: 600; + border-radius: 5px; + margin-right: 0; + padding: 0 20px; + } + } +} + +.ripple-container { + display: flex; + align-items: center; +} + +.ripple-circle { + border-radius: 100%; + border: none; + outline: none; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + width: 6px; + height: 6px; + margin-right: 10px; + + &::before { + content: ""; + width: 6px; + height: 6px; + position: absolute; + border-radius: 100%; + } + + &.shravak { + background-color: var(--ion-color); + + &::before { + background-color: rgba(36, 130, 167, .7); + -webkit-animation: ripple 1.2s ease-in-out; + animation: ripple 1.2s ease-in-out infinite; + } + + @keyframes ripple { + 0% { + border: 1px solid transparent; + } + + 100% { + border: 6px solid rgba(36, 130, 167, .5); + opacity: 0; + } + } + } + + &.sant { + background-color: var(--ion-color-sant); + + &::before { + background-color: rgba(78, 156, 129, .7); + -webkit-animation: ripple 1.2s ease-in-out; + animation: ripple 1.2s ease-in-out infinite; + } + + @keyframes ripple { + 0% { + border: 1px solid transparent; + } + + 100% { + border: 6px solid rgba(78, 156, 129, .5); + opacity: 0; + } + } + } + + &.sangh { + background-color: var(--ion-color-sangh); + + &::before { + background-color: rgba(166, 101, 204, .7); + -webkit-animation: ripple 1.2s ease-in-out; + animation: ripple 1.2s ease-in-out infinite; + } + + @keyframes ripple { + 0% { + border: 1px solid transparent; + } + + 100% { + border: 6px solid rgba(166, 101, 204, .5); + opacity: 0; + } + } + } +} + +.mention-user { + color: var(--ion-color) !important; +} + +.mention-sant { + color: var(--ion-color-sant) !important; +} + +.mention-sangh { + color: var(--ion-color-sangh) !important; +} + +.pac-item { + white-space: pre-line; +} \ No newline at end of file diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..6cf05cb --- /dev/null +++ b/src/index.html @@ -0,0 +1,48 @@ + + + + + + Global Jain + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c970d68 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,51 @@ +import { enableProdMode, importProvidersFrom } from '@angular/core'; + + +import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { BrowserModule, bootstrapApplication } from '@angular/platform-browser'; +import { RouteReuseStrategy, Routes, provideRouter } from '@angular/router'; +import { Crop } from '@ionic-native/crop/ngx'; +import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; +import { AppComponent } from './app/app.component'; +import { Roots } from './app/enums/root.enum'; +import { AuthGuard } from './app/guards/auth.guard'; +import { AutoLogoutInterceptorService } from './app/interceptors/auto-logout.interceptor'; +import { TokenInterceptorService } from './app/interceptors/token.interceptor'; +import { environment } from './environments/environment'; + +export const routes: Routes = [ + { + path: '', + redirectTo: Roots.auth, + pathMatch: 'full', + }, + { + path: Roots.auth, + loadChildren: () => import('./app/pages/auth/auth.routes').then(m => m.authRoutes), + }, + { + path: Roots.page, + loadChildren: () => import('./app/pages/pages.routes').then((m: any) => m.pagesRoutes), + canActivate: [AuthGuard], + }, +]; + +if (environment.production) { + enableProdMode(); +} + + + +bootstrapApplication(AppComponent, { + providers: [ + provideRouter(routes), + importProvidersFrom(BrowserModule, IonicModule.forRoot(), FormsModule, ReactiveFormsModule), + Crop, + { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, + { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: AutoLogoutInterceptorService, multi: true }, + provideHttpClient(withInterceptorsFromDi()) + ] +}) + .catch(err => console.log(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..66d9263 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,64 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +import './zone-flags'; + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/proxy.conf.json b/src/proxy.conf.json new file mode 100644 index 0000000..12e73bc --- /dev/null +++ b/src/proxy.conf.json @@ -0,0 +1,6 @@ +{ + "/api/v1/": { + "target": "https://api-globaljain.focalat.com", + "secure": false + } +} diff --git a/src/styles/_intro.scss b/src/styles/_intro.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..06aa8e4 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,14 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); diff --git a/src/theme/variables.scss b/src/theme/variables.scss new file mode 100644 index 0000000..a584b72 --- /dev/null +++ b/src/theme/variables.scss @@ -0,0 +1,88 @@ +// Ionic Variables and Theming. For more info, please see: +// http://ionicframework.com/docs/theming/ + +/** Ionic CSS Variables **/ +:root { + /** primary **/ + --ion-color-primary: #3880ff; + --ion-color-primary-rgb: 56, 128, 255; + + /** success **/ + --ion-color-success: #2dd36f; + --ion-color-success-rgb: 45, 211, 111; + + /** warning **/ + --ion-notification-count: #ff6331; + + /** danger **/ + --ion-color-danger: #eb445a; + + /** dark **/ + --ion-color-dark-extra: #343434; + --ion-color-dark-medium: #585858; + + /** medium **/ + --ion-color-medium-shade: #808289; + + /** light **/ + --ion-color-light: #f4f5f8; + --ion-color-light-dark: #B4B4B433; +} + +:root { + --ion-font-family: 'Gilroy'; + --ion-text-align-center: center; + --ion-background-button: #E7F7FE; + --ion-background-content: #FAFAFA; + --ion-background-content-sant: #DFEAE2; + --ion-background-content-sangh: #F3E1FC; + --ion-color-white: #ffffff; + --ion-color-black: #000000; + --ion-color-black-rgb: 0, 0, 0; + --ion-background-card: #F3FAFF; + --ion-background-gray: #e1e1e1; + --ion-background-gray-light: #eeeeee; + --ion-background-gray-medium: #F5F5F5; + --ion-color: #2482A7; + --ion-color-light-text: #70B2CC; + --ion-color-sant: #4E9C81; + --ion-color-sangh: #a665cc; + --ion-color-sangh-light: #f6dfdf; + --ion-color-hospital: #449353; + --ion-content-color: #b4b4b4; + --ion-content-color-sant: #B4D6C1; + --ion-shadow: #ebebeb; + --ion-dark-shadow: #0000001A; + --ion-search-icon: #5BAA46; + --ion-red-border: #ed576b; + --ion-color-warning: #FFA500; + --ion-font-size-11: 0.688rem; + --ion-font-size-12: 0.75rem; + --ion-font-size-14: 0.875rem; + --ion-font-size-16: 1rem; + --ion-font-size-18: 1.125rem; + --ion-font-size-20: 1.25rem; + --ion-font-size-22: 1.375rem; + --ion-font-size-24: 1.5rem; + --ion-font-weight-bold: bold; + --ion-padding-0: 0; + --ion-padding-10: 0.625rem; + --ion-padding-15: 0.938rem; + --ion-padding-20: 1.25rem; + --ion-padding-25: 1.563rem; + --ion-padding-30: 1.875rem; + --ion-padding-35: 2.188rem; + --ion-padding-40: 2.5rem; + --ion-margin-0: 0; + --ion-margin-5: 0.312rem; + --ion-margin-10: 0.625rem; + --ion-margin-15: 0.938rem; + --ion-margin-20: 1.25rem; + --ion-margin-25: 1.563rem; + --ion-margin-30: 1.875rem; + --ion-margin-35: 2.188rem; + --ion-margin-40: 2.5rem; + --ion-border-radius-100: 100%; + --ion-border-radius-5: 5px; + --ion-border-radius-10: 10px; +} \ No newline at end of file diff --git a/src/zone-flags.ts b/src/zone-flags.ts new file mode 100644 index 0000000..c84245f --- /dev/null +++ b/src/zone-flags.ts @@ -0,0 +1,6 @@ +/** + * Prevents Angular change detection from + * running with certain Web Component callbacks + */ +// eslint-disable-next-line no-underscore-dangle +(window as any).__Zone_disable_customElements = true; diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..82d91dc --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ce732dd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,57 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "es2020", + "lib": [ + "es2022", + "dom" + ], + "esModuleInterop": true, + "useDefineForClassFields": false, + "paths": { + "@services/*": [ + "src/app/services/*" + ], + "@enums/*": [ + "src/app/enums/*" + ], + "@components/*": [ + "src/app/components/*" + ], + "@interfaces/*": [ + "src/app/interfaces/*" + ], + "@pipes/*": [ + "src/app/pipes/*" + ], + "@pages/*": [ + "src/app/pages/*" + ], + "@environments/*": [ + "src/environments/*" + ], + "@guards/*": [ + "src/app/guards/*" + ], + "@directives/*": [ + "src/app/directives/*" + ] + } + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..092345b --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..172a40e --- /dev/null +++ b/tslint.json @@ -0,0 +1,88 @@ +{ + "extends": "tslint:recommended", + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-output-on-prefix": true, + "no-inputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "one-variable-per-declaration": false, + "component-class-suffix": [true, "Page", "Component"], + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "page", + "kebab-case" + ] + } +} diff --git a/typings/cordova-typings.d.ts b/typings/cordova-typings.d.ts new file mode 100644 index 0000000..108537a --- /dev/null +++ b/typings/cordova-typings.d.ts @@ -0,0 +1,3 @@ + +/// +/// \ No newline at end of file