Project HydroZooner
|
@ -0,0 +1,2 @@
|
||||||
|
BUNDLE_PATH: "vendor/bundle"
|
||||||
|
BUNDLE_FORCE_RUBY_PLATFORM: 1
|
|
@ -0,0 +1,4 @@
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: '@react-native',
|
||||||
|
};
|
|
@ -0,0 +1,74 @@
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
**/.xcode.env.local
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
.cxx/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# fastlane
|
||||||
|
#
|
||||||
|
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
||||||
|
# screenshots whenever they are needed.
|
||||||
|
# For more information about the recommended setup visit:
|
||||||
|
# https://docs.fastlane.tools/best-practices/source-control/
|
||||||
|
|
||||||
|
**/fastlane/report.xml
|
||||||
|
**/fastlane/Preview.html
|
||||||
|
**/fastlane/screenshots
|
||||||
|
**/fastlane/test_output
|
||||||
|
|
||||||
|
# Bundle artifact
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# Ruby / CocoaPods
|
||||||
|
**/Pods/
|
||||||
|
/vendor/bundle/
|
||||||
|
|
||||||
|
# Temporary files created by Metro to check the health of the file watcher
|
||||||
|
.metro-health-check*
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# Yarn
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
|
@ -0,0 +1,7 @@
|
||||||
|
module.exports = {
|
||||||
|
arrowParens: 'avoid',
|
||||||
|
bracketSameLine: true,
|
||||||
|
bracketSpacing: false,
|
||||||
|
singleQuote: true,
|
||||||
|
trailingComma: 'all',
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
|
@ -0,0 +1,9 @@
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
|
||||||
|
ruby ">= 2.6.10"
|
||||||
|
|
||||||
|
# Exclude problematic versions of cocoapods and activesupport that causes build failures.
|
||||||
|
gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
|
||||||
|
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
|
||||||
|
gem 'xcodeproj', '< 1.26.0'
|
|
@ -0,0 +1,17 @@
|
||||||
|
/**
|
||||||
|
* @format
|
||||||
|
*/
|
||||||
|
|
||||||
|
import 'react-native';
|
||||||
|
import React from 'react';
|
||||||
|
import App from '../src/App';
|
||||||
|
|
||||||
|
// Note: import explicitly to use the types shipped with jest.
|
||||||
|
import {it} from '@jest/globals';
|
||||||
|
|
||||||
|
// Note: test renderer must be required after react-native.
|
||||||
|
import renderer from 'react-test-renderer';
|
||||||
|
|
||||||
|
it('renders correctly', () => {
|
||||||
|
renderer.create(<App />);
|
||||||
|
});
|
|
@ -0,0 +1,133 @@
|
||||||
|
apply plugin: "com.android.application"
|
||||||
|
apply plugin: "org.jetbrains.kotlin.android"
|
||||||
|
apply plugin: "com.facebook.react"
|
||||||
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the configuration block to customize your React Native Android app.
|
||||||
|
* By default you don't need to apply any configuration, just uncomment the lines you need.
|
||||||
|
*/
|
||||||
|
react {
|
||||||
|
/* Folders */
|
||||||
|
// The root of your project, i.e. where "package.json" lives. Default is '../..'
|
||||||
|
// root = file("../../")
|
||||||
|
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
|
||||||
|
// reactNativeDir = file("../../node_modules/react-native")
|
||||||
|
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
|
||||||
|
// codegenDir = file("../../node_modules/@react-native/codegen")
|
||||||
|
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
|
||||||
|
// cliFile = file("../../node_modules/react-native/cli.js")
|
||||||
|
|
||||||
|
/* Variants */
|
||||||
|
// The list of variants to that are debuggable. For those we're going to
|
||||||
|
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
|
||||||
|
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
|
||||||
|
// debuggableVariants = ["liteDebug", "prodDebug"]
|
||||||
|
|
||||||
|
/* Bundling */
|
||||||
|
// A list containing the node command and its flags. Default is just 'node'.
|
||||||
|
// nodeExecutableAndArgs = ["node"]
|
||||||
|
//
|
||||||
|
// The command to run when bundling. By default is 'bundle'
|
||||||
|
// bundleCommand = "ram-bundle"
|
||||||
|
//
|
||||||
|
// The path to the CLI configuration file. Default is empty.
|
||||||
|
// bundleConfig = file(../rn-cli.config.js)
|
||||||
|
//
|
||||||
|
// The name of the generated asset file containing your JS bundle
|
||||||
|
// bundleAssetName = "MyApplication.android.bundle"
|
||||||
|
//
|
||||||
|
// The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
|
||||||
|
// entryFile = file("../js/MyApplication.android.js")
|
||||||
|
//
|
||||||
|
// A list of extra flags to pass to the 'bundle' commands.
|
||||||
|
// See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
|
||||||
|
// extraPackagerArgs = []
|
||||||
|
|
||||||
|
/* Hermes Commands */
|
||||||
|
// The hermes compiler command to run. By default it is 'hermesc'
|
||||||
|
// hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
|
||||||
|
//
|
||||||
|
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
|
||||||
|
// hermesFlags = ["-O", "-output-source-map"]
|
||||||
|
|
||||||
|
/* Autolinking */
|
||||||
|
autolinkLibrariesWithApp()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
|
||||||
|
*/
|
||||||
|
def enableProguardInReleaseBuilds = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The preferred build flavor of JavaScriptCore (JSC)
|
||||||
|
*
|
||||||
|
* For example, to use the international variant, you can use:
|
||||||
|
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
||||||
|
*
|
||||||
|
* The international variant includes ICU i18n library and necessary data
|
||||||
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
||||||
|
* give correct results when using with locales other than en-US. Note that
|
||||||
|
* this variant is about 6MiB larger per architecture than default.
|
||||||
|
*/
|
||||||
|
def jscFlavor = 'org.webkit:android-jsc:+'
|
||||||
|
|
||||||
|
android {
|
||||||
|
ndkVersion rootProject.ext.ndkVersion
|
||||||
|
buildToolsVersion rootProject.ext.buildToolsVersion
|
||||||
|
compileSdk rootProject.ext.compileSdkVersion
|
||||||
|
|
||||||
|
namespace "com.hydrozoner"
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.hydrozoner"
|
||||||
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
}
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
|
||||||
|
storeFile file(MYAPP_UPLOAD_STORE_FILE)
|
||||||
|
storePassword MYAPP_UPLOAD_STORE_PASSWORD
|
||||||
|
keyAlias MYAPP_UPLOAD_KEY_ALIAS
|
||||||
|
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('debug.keystore')
|
||||||
|
storePassword 'android'
|
||||||
|
keyAlias 'androiddebugkey'
|
||||||
|
keyPassword 'android'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buildTypes {
|
||||||
|
debug {
|
||||||
|
signingConfig signingConfigs.debug
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
// Caution! In production, you need to generate your own keystore file.
|
||||||
|
// see https://reactnative.dev/docs/signed-apk-android.
|
||||||
|
signingConfig signingConfigs.debug
|
||||||
|
minifyEnabled enableProguardInReleaseBuilds
|
||||||
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// The version of react-native is set by the React Native Gradle Plugin
|
||||||
|
implementation("com.facebook.react:react-android")
|
||||||
|
|
||||||
|
if (hermesEnabled.toBoolean()) {
|
||||||
|
implementation("com.facebook.react:hermes-android")
|
||||||
|
} else {
|
||||||
|
implementation jscFlavor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "48184672298",
|
||||||
|
"project_id": "hydrozooner-79322",
|
||||||
|
"storage_bucket": "hydrozooner-79322.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:48184672298:android:4f78f8c69d2946d3e80353",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.hydrozoner"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBVsR_Cuadle5s76FrC0X7PXzZSAYPgZu8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the proguardFiles
|
||||||
|
# directive in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
|
tools:targetApi="28"
|
||||||
|
tools:ignore="GoogleAppIndexingWarning"/>
|
||||||
|
</manifest>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".MainApplication"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:allowBackup="false"
|
||||||
|
android:theme="@style/AppTheme"
|
||||||
|
android:supportsRtl="true">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
||||||
|
android:launchMode="singleTask"
|
||||||
|
android:windowSoftInputMode="adjustResize"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.hydrozoner
|
||||||
|
|
||||||
|
import com.facebook.react.ReactActivity
|
||||||
|
import com.facebook.react.ReactActivityDelegate
|
||||||
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
|
||||||
|
import com.facebook.react.defaults.DefaultReactActivityDelegate
|
||||||
|
|
||||||
|
class MainActivity : ReactActivity() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the main component registered from JavaScript. This is used to schedule
|
||||||
|
* rendering of the component.
|
||||||
|
*/
|
||||||
|
override fun getMainComponentName(): String = "HydroZoner"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
|
||||||
|
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
|
||||||
|
*/
|
||||||
|
override fun createReactActivityDelegate(): ReactActivityDelegate =
|
||||||
|
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.hydrozoner
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import com.facebook.react.PackageList
|
||||||
|
import com.facebook.react.ReactApplication
|
||||||
|
import com.facebook.react.ReactHost
|
||||||
|
import com.facebook.react.ReactNativeHost
|
||||||
|
import com.facebook.react.ReactPackage
|
||||||
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
|
||||||
|
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
|
||||||
|
import com.facebook.react.defaults.DefaultReactNativeHost
|
||||||
|
import com.facebook.react.soloader.OpenSourceMergedSoMapping
|
||||||
|
import com.facebook.soloader.SoLoader
|
||||||
|
|
||||||
|
class MainApplication : Application(), ReactApplication {
|
||||||
|
|
||||||
|
override val reactNativeHost: ReactNativeHost =
|
||||||
|
object : DefaultReactNativeHost(this) {
|
||||||
|
override fun getPackages(): List<ReactPackage> =
|
||||||
|
PackageList(this).packages.apply {
|
||||||
|
// Packages that cannot be autolinked yet can be added manually here, for example:
|
||||||
|
// add(MyReactNativePackage())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getJSMainModuleName(): String = "index"
|
||||||
|
|
||||||
|
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
|
||||||
|
|
||||||
|
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
|
||||||
|
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
|
||||||
|
}
|
||||||
|
|
||||||
|
override val reactHost: ReactHost
|
||||||
|
get() = getDefaultReactHost(applicationContext, reactNativeHost)
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
SoLoader.init(this, OpenSourceMergedSoMapping)
|
||||||
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
||||||
|
// If you opted-in for the New Architecture, we load the native entry point for this app.
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2014 The Android Open Source Project
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
http://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.
|
||||||
|
-->
|
||||||
|
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
|
||||||
|
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
|
||||||
|
android:insetTop="@dimen/abc_edit_text_inset_top_material"
|
||||||
|
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"
|
||||||
|
>
|
||||||
|
|
||||||
|
<selector>
|
||||||
|
<!--
|
||||||
|
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
|
||||||
|
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
|
||||||
|
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
|
||||||
|
|
||||||
|
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
|
||||||
|
|
||||||
|
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
|
||||||
|
-->
|
||||||
|
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
|
||||||
|
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
|
||||||
|
</selector>
|
||||||
|
|
||||||
|
</inset>
|
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 24 KiB |
|
@ -0,0 +1,3 @@
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">HydroZoner</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
|
@ -0,0 +1,22 @@
|
||||||
|
buildscript {
|
||||||
|
ext {
|
||||||
|
buildToolsVersion = "35.0.0"
|
||||||
|
minSdkVersion = 24
|
||||||
|
compileSdkVersion = 35
|
||||||
|
targetSdkVersion = 34
|
||||||
|
ndkVersion = "26.1.10909125"
|
||||||
|
kotlinVersion = "1.9.24"
|
||||||
|
}
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath("com.android.tools.build:gradle")
|
||||||
|
classpath("com.facebook.react:react-native-gradle-plugin")
|
||||||
|
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
|
||||||
|
classpath 'com.google.gms:google-services:4.4.2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: "com.facebook.react.rootproject"
|
|
@ -0,0 +1,44 @@
|
||||||
|
# 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.
|
||||||
|
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
|
||||||
|
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Use this property to specify which architecture you want to build.
|
||||||
|
# You can also override it from the CLI using
|
||||||
|
# ./gradlew <task> -PreactNativeArchitectures=x86_64
|
||||||
|
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
|
||||||
|
|
||||||
|
# Use this property to enable support to the new architecture.
|
||||||
|
# This will allow you to use TurboModules and the Fabric render in
|
||||||
|
# your application. You should enable this flag either if you want
|
||||||
|
# to write custom TurboModules/Fabric components OR use libraries that
|
||||||
|
# are providing them.
|
||||||
|
newArchEnabled=true
|
||||||
|
|
||||||
|
# Use this property to enable or disable the Hermes JS engine.
|
||||||
|
# If set to false, you will be using JSC instead.
|
||||||
|
hermesEnabled=true
|
||||||
|
|
||||||
|
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
|
||||||
|
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
|
||||||
|
MYAPP_UPLOAD_STORE_PASSWORD=101003
|
||||||
|
MYAPP_UPLOAD_KEY_PASSWORD=101003
|
|
@ -0,0 +1,7 @@
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
|
||||||
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
|
@ -0,0 +1,252 @@
|
||||||
|
#!/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.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# 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/HEAD/platforms/jvm/plugins-application/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
|
||||||
|
|
||||||
|
# This is normally unused
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||||
|
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||||
|
' "$PWD" ) || exit
|
||||||
|
|
||||||
|
# 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
|
||||||
|
if ! command -v java >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
|
case $MAX_FD in #(
|
||||||
|
max*)
|
||||||
|
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||||
|
# shellcheck disable=SC2039,SC3045
|
||||||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
|
warn "Could not query maximum file descriptor limit"
|
||||||
|
esac
|
||||||
|
case $MAX_FD in #(
|
||||||
|
'' | soft) :;; #(
|
||||||
|
*)
|
||||||
|
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||||
|
# shellcheck disable=SC2039,SC3045
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# 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"'
|
||||||
|
|
||||||
|
# Collect all arguments for the java command:
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
|
# and any embedded shellness will be escaped.
|
||||||
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
|
# treated as '${Hostname}' itself on the command line.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Stop when "xargs" is not available.
|
||||||
|
if ! command -v xargs >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "xargs is not available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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" "$@"
|
|
@ -0,0 +1,94 @@
|
||||||
|
@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
|
||||||
|
@rem SPDX-License-Identifier: Apache-2.0
|
||||||
|
@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=.
|
||||||
|
@rem This is normally unused
|
||||||
|
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% equ 0 goto execute
|
||||||
|
|
||||||
|
echo. 1>&2
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||||
|
echo. 1>&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo. 1>&2
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||||
|
echo. 1>&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
|
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% equ 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!
|
||||||
|
set EXIT_CODE=%ERRORLEVEL%
|
||||||
|
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||||
|
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||||
|
exit /b %EXIT_CODE%
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
|
@ -0,0 +1,6 @@
|
||||||
|
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
|
||||||
|
plugins { id("com.facebook.react.settings") }
|
||||||
|
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
|
||||||
|
rootProject.name = 'HydroZoner'
|
||||||
|
include ':app'
|
||||||
|
includeBuild('../node_modules/@react-native/gradle-plugin')
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"name": "HydroZoner",
|
||||||
|
"displayName": "HydroZoner"
|
||||||
|
}
|
|
@ -0,0 +1,360 @@
|
||||||
|
<svg width="213" height="208" viewBox="0 0 213 208" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M115.333 202.787L97.1525 203.163L97.2096 202.21L86.2598 203.422V207.791L97.2974 207.992L97.2156 207.46L115.333 207.078V202.787Z" fill="url(#paint0_linear_104_2761)"/>
|
||||||
|
<path d="M124.226 126.527V202.608L100.626 203.102V126.834L124.226 126.527Z" fill="url(#paint1_linear_104_2761)"/>
|
||||||
|
<path d="M135.513 207.183L97.2051 208V202.091L135.513 201.296V207.183Z" fill="url(#paint2_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.4" d="M124.229 149.847V165.191C121.493 166.295 118.178 166.97 114.5 167.033C108.743 167.13 103.707 165.696 100.629 163.428V152.379C103.707 149.994 108.743 148.406 114.5 148.318C118.175 148.26 121.49 148.828 124.229 149.847Z" fill="url(#paint3_linear_104_2761)"/>
|
||||||
|
<path d="M204.457 151.479L180.345 20.1831C179.743 16.9089 177.184 14.3113 174.698 14.1045L5.19033 0.0197589C1.96629 -0.249352 -0.358557 2.291 0.0456795 6.02117L16.4251 156.817C16.8846 161.053 20.0416 164.499 23.446 164.383L200.916 158.355C203.499 158.267 205.129 155.136 204.457 151.479Z" fill="url(#paint4_linear_104_2761)"/>
|
||||||
|
<path d="M182.932 14.0672L12.5504 0.0186532C9.30958 -0.249211 6.97289 2.28491 7.38009 6.00636L23.8453 156.422C24.3077 160.645 27.4805 164.084 30.9017 163.969L209.288 157.978C211.881 157.891 213.528 154.767 212.848 151.125L188.611 20.1322C188.003 16.8642 185.429 14.2728 182.932 14.0672Z" fill="url(#paint5_linear_104_2761)"/>
|
||||||
|
<path d="M34.5239 10.7145L36.9799 31.0672C37.1426 32.409 36.4041 33.4468 35.3275 33.382L18.6118 32.3853C17.5076 32.3193 16.4506 31.1606 16.2978 29.7989L13.9848 9.15961C13.8349 7.82278 14.6394 6.80988 15.7338 6.8946L32.2868 8.18159C33.3546 8.26382 34.3652 9.39882 34.5239 10.7145Z" fill="url(#paint6_linear_104_2761)"/>
|
||||||
|
<path d="M38.0088 39.5879L40.523 60.4427C40.6886 61.8132 39.9452 62.9008 38.8577 62.8585L21.9764 62.2032C20.8613 62.1595 19.7916 60.9909 19.6348 59.5943L17.2685 38.438C17.1157 37.0675 17.9262 36.011 19.0314 36.0708L35.748 37.0276C36.8237 37.0924 37.8461 38.2374 38.0088 39.5879Z" fill="url(#paint7_linear_104_2761)"/>
|
||||||
|
<path d="M41.5789 69.1713L44.1592 90.5456C44.3287 91.9559 43.5804 93.086 42.4831 93.0673L25.4332 92.7732C24.3062 92.7533 23.2237 91.5747 23.0669 90.1432L20.6306 68.4511C20.4739 67.0458 21.2902 65.9419 22.4053 65.983L39.2876 66.5935C40.3781 66.6334 41.4104 67.7858 41.5789 69.1713Z" fill="url(#paint8_linear_104_2761)"/>
|
||||||
|
<path d="M45.2382 99.4934L47.8835 121.41C48.058 122.855 47.3037 124.034 46.1946 124.04L28.9721 124.126C27.8334 124.132 26.738 122.943 26.5733 121.475L24.0799 99.2256C23.9182 97.7853 24.7414 96.6329 25.8694 96.6491L42.9262 96.8983C44.0206 96.912 45.0666 98.0744 45.2382 99.4934Z" fill="url(#paint9_linear_104_2761)"/>
|
||||||
|
<path d="M48.991 130.585L51.7033 153.062C51.8828 154.545 51.1226 155.775 50.0036 155.802L32.6047 156.288C31.455 156.321 30.3449 155.122 30.1763 153.615L27.6178 130.788C27.4521 129.31 28.2823 128.108 29.422 128.098L46.6464 127.962C47.7566 127.952 48.8155 129.129 48.991 130.585Z" fill="url(#paint10_linear_104_2761)"/>
|
||||||
|
<path d="M57.9144 12.5036L60.5271 32.5262C60.6987 33.8468 60.0421 34.8684 59.0019 34.8061L42.8472 33.8406C41.7814 33.777 40.7412 32.6383 40.5796 31.299L38.0979 10.9986C37.9372 9.68291 38.728 8.68496 39.7859 8.76719L55.7581 10.0131C56.7904 10.0916 57.7448 11.2129 57.9144 12.5036Z" fill="url(#paint11_linear_104_2761)"/>
|
||||||
|
<path d="M61.6221 40.9036L64.2979 61.4108C64.4744 62.7638 63.8138 63.829 62.7638 63.7892L46.4563 63.155C45.3797 63.1139 44.3277 61.9652 44.16 60.5922L41.6163 39.7935C41.4517 38.4467 42.2493 37.4051 43.3171 37.4662L59.4352 38.3906C60.4764 38.4504 61.4466 39.5742 61.6221 40.9036Z" fill="url(#paint12_linear_104_2761)"/>
|
||||||
|
<path d="M65.4147 69.9924L68.1566 91.0029C68.3371 92.3883 67.6725 93.4947 66.6127 93.4822L50.1474 93.1982C49.0629 93.1795 47.9951 92.0208 47.8236 90.6142L45.2187 69.2972C45.0501 67.9167 45.8536 66.8316 46.9313 66.8714L63.1993 67.4595C64.2563 67.4981 65.2373 68.6306 65.4147 69.9924Z" fill="url(#paint13_linear_104_2761)"/>
|
||||||
|
<path d="M69.3031 99.795L72.1131 121.328C72.2984 122.748 71.63 123.908 70.5602 123.913L53.9372 123.996C52.8389 123.996 51.7623 122.834 51.5858 121.392L48.9158 99.5371C48.7433 98.1218 49.5518 96.9906 50.6403 97.0068L67.068 97.2435C68.1289 97.2597 69.1217 98.4009 69.3031 99.795Z" fill="url(#paint14_linear_104_2761)"/>
|
||||||
|
<path d="M73.2895 130.34L76.1694 152.414C76.3587 153.87 75.6873 155.08 74.6067 155.111L57.822 155.579C56.7138 155.611 55.6234 154.433 55.443 152.953L52.704 130.541C52.5265 129.089 53.3419 127.911 54.4412 127.902L71.0268 127.769C72.0985 127.76 73.1022 128.911 73.2895 130.34Z" fill="url(#paint15_linear_104_2761)"/>
|
||||||
|
<path d="M80.599 14.2329C80.4205 12.9547 79.5145 11.857 78.5206 11.7798L63.0818 10.5775C62.0584 10.4978 61.3771 11.4833 61.5476 12.7777L64.185 32.7455C64.3595 34.0649 65.3534 35.1849 66.3857 35.2472L81.9113 36.1791C82.9189 36.2389 83.5401 35.2323 83.3577 33.9366L80.599 14.2329Z" fill="url(#paint16_linear_104_2761)"/>
|
||||||
|
<path d="M84.509 42.1756L87.3328 62.3476C87.5191 63.6783 86.9029 64.7273 85.8874 64.6874L70.1823 64.0769C69.1422 64.0371 68.1641 62.9083 67.9866 61.559L65.2861 41.1041C65.1116 39.7785 65.8225 38.7544 66.8548 38.8129L82.4021 39.7062C83.4107 39.7635 84.3266 40.8649 84.509 42.1756Z" fill="url(#paint17_linear_104_2761)"/>
|
||||||
|
<path d="M88.5139 70.7859L91.4047 91.4476C91.4204 91.5584 91.4865 91.6693 91.4895 91.7752C91.5368 92.9825 90.9206 93.9032 89.98 93.887L74.1172 93.6142C73.0671 93.5955 72.0644 92.4592 71.882 91.0763L69.1145 70.1181C68.9351 68.7613 69.6508 67.6923 70.692 67.7297L86.3813 68.2991C87.3988 68.3352 88.3266 69.4478 88.5139 70.7859Z" fill="url(#paint18_linear_104_2761)"/>
|
||||||
|
<path d="M92.6152 100.089L95.573 121.252C95.7702 122.647 95.1461 123.787 94.1128 123.793L78.1179 123.875C77.058 123.875 76.0582 122.736 75.8709 121.319L73.0403 99.8437C72.8569 98.4533 73.5766 97.3395 74.6276 97.3519L90.4599 97.5799C91.4853 97.5973 92.4229 98.7186 92.6152 100.089Z" fill="url(#paint19_linear_104_2761)"/>
|
||||||
|
<path d="M96.8203 130.107L99.855 151.793C100.052 153.223 99.4301 154.41 98.388 154.441L82.2441 154.897C81.1744 154.927 80.1628 153.775 79.9706 152.32L77.061 130.307C76.8727 128.881 77.5974 127.72 78.6593 127.712L94.6364 127.587C95.6717 127.578 96.6231 128.7 96.8203 130.107Z" fill="url(#paint20_linear_104_2761)"/>
|
||||||
|
<path d="M102.538 15.9036C102.351 14.6453 101.483 13.5663 100.516 13.4903L85.6609 12.3341C84.67 12.2569 84.11 13.2274 84.2904 14.502L87.0708 34.1533C87.2541 35.4502 88.1484 36.5516 89.1412 36.6114L104.104 37.5122C105.078 37.5707 105.61 36.5778 105.419 35.297L102.538 15.9036Z" fill="url(#paint21_linear_104_2761)"/>
|
||||||
|
<path d="M106.635 43.4077C106.437 42.1207 105.566 41.033 104.59 40.977L89.6113 40.1173C88.6126 40.06 88.0496 41.0717 88.231 42.3773L91.0814 62.4921C91.2687 63.8215 92.1728 64.929 93.1794 64.9689L108.271 65.557C109.257 65.5956 109.789 64.5603 109.592 63.2508L106.635 43.4077Z" fill="url(#paint22_linear_104_2761)"/>
|
||||||
|
<path d="M110.832 71.5571C110.635 70.2389 109.747 69.145 108.762 69.1089L93.653 68.5607C92.6453 68.5246 92.0804 69.5786 92.2726 70.9154L95.1881 91.5173C95.3803 92.8778 96.2943 93.9942 97.3098 94.0091L112.533 94.2695C113.524 94.2869 114.06 93.2092 113.86 91.8674L110.832 71.5571Z" fill="url(#paint23_linear_104_2761)"/>
|
||||||
|
<path d="M115.128 100.372L118.231 121.178C118.435 122.549 117.863 123.67 116.866 123.67L101.505 123.753C100.481 123.753 99.5928 122.632 99.3956 121.244L96.4092 100.141C96.212 98.771 96.8164 97.6771 97.8319 97.6908L113.076 97.9101C114.066 97.9263 114.927 99.0239 115.128 100.372Z" fill="url(#paint24_linear_104_2761)"/>
|
||||||
|
<path d="M119.528 129.882L122.706 151.186C122.915 152.592 122.341 153.76 121.335 153.788L105.838 154.24C104.805 154.269 103.907 153.14 103.705 151.712L100.648 130.084C100.451 128.683 101.055 127.54 102.079 127.531L117.46 127.406C118.452 127.395 119.322 128.501 119.528 129.882Z" fill="url(#paint25_linear_104_2761)"/>
|
||||||
|
<path d="M124.051 17.5232C123.854 16.2774 122.877 15.2209 121.94 15.1486L107.386 14.0273C106.427 13.9525 105.721 14.9081 105.907 16.164L108.818 35.5051C109.016 36.7821 110.001 37.866 110.968 37.9233L125.633 38.7954C126.575 38.8515 127.265 37.876 127.066 36.6151L124.051 17.5232Z" fill="url(#paint26_linear_104_2761)"/>
|
||||||
|
<path d="M128.332 44.6026C128.134 43.3355 127.143 42.2641 126.198 42.2093L111.523 41.372C110.557 41.3172 109.847 42.3114 110.039 43.5959L113.018 63.3893C113.215 64.6962 114.218 65.7888 115.187 65.8262L129.976 66.3993C130.927 66.4367 131.621 65.4225 131.417 64.1331L128.332 44.6026Z" fill="url(#paint27_linear_104_2761)"/>
|
||||||
|
<path d="M132.708 72.3071C132.511 71.0151 131.506 69.9299 130.554 69.8938L115.757 69.3593C114.783 69.3232 114.068 70.356 114.265 71.6717L117.315 91.9335C117.512 93.2715 118.53 94.3729 119.511 94.3903L134.422 94.6482C135.381 94.6644 136.078 93.6092 135.87 92.2898L132.708 72.3071Z" fill="url(#paint28_linear_104_2761)"/>
|
||||||
|
<path d="M137.192 100.656L140.426 121.118C140.639 122.468 139.966 123.564 139 123.569L123.966 123.641C122.98 123.641 121.92 122.536 121.714 121.168L118.591 100.418C118.388 99.0736 119.075 97.9972 120.057 98.0121L134.923 98.2277C135.792 98.2401 136.726 99.1322 137.034 100.291C137.068 100.407 137.172 100.533 137.192 100.656Z" fill="url(#paint29_linear_104_2761)"/>
|
||||||
|
<path d="M141.779 129.678L145.091 150.627C145.308 152.009 144.632 153.149 143.659 153.176L128.497 153.596C127.499 153.624 126.427 152.505 126.22 151.104L123.021 129.851C122.814 128.48 123.504 127.359 124.494 127.347L139.55 127.232C140.516 127.223 141.565 128.326 141.779 129.678Z" fill="url(#paint30_linear_104_2761)"/>
|
||||||
|
<path d="M144.362 19.088C144.159 17.8671 143.338 16.823 142.431 16.752L128.42 15.6618C127.492 15.5896 126.903 16.534 127.101 17.7686L130.135 36.8119C130.332 38.069 131.29 39.1343 132.224 39.1903L146.276 40.035C147.189 40.0898 147.699 39.1268 147.493 37.8859L144.362 19.088Z" fill="url(#paint31_linear_104_2761)"/>
|
||||||
|
<path d="M148.802 45.7513C148.594 44.5054 147.765 43.4514 146.851 43.3991L132.729 42.5893C131.793 42.5357 131.203 43.5162 131.405 44.7808L134.509 64.2626C134.714 65.5484 135.678 66.6223 136.62 66.6597L150.783 67.2104C151.703 67.2465 152.214 66.2448 152.003 64.9753L148.802 45.7513Z" fill="url(#paint32_linear_104_2761)"/>
|
||||||
|
<path d="M153.343 73.0198C153.13 71.7427 152.291 70.685 151.372 70.6526L137.138 70.1368C136.196 70.1032 135.602 71.1235 135.808 72.4168L138.985 92.3509C139.195 93.6665 140.168 94.7492 141.12 94.7654L155.395 95.0146C156.322 95.0308 156.835 93.988 156.619 92.6897L153.343 73.0198Z" fill="url(#paint33_linear_104_2761)"/>
|
||||||
|
<path d="M157.987 100.916L161.339 121.042C161.56 122.369 161.065 123.453 160.131 123.458L145.681 123.532C144.725 123.532 143.779 122.449 143.565 121.103L140.312 100.695C140.265 100.363 140.278 100.023 140.347 99.698C140.406 99.3023 140.575 98.9463 140.823 98.6948C141.072 98.4433 141.384 98.3129 141.702 98.3275L155.986 98.5331C156.915 98.5493 157.77 99.6083 157.987 100.916Z" fill="url(#paint34_linear_104_2761)"/>
|
||||||
|
<path d="M162.74 129.456L166.17 150.054C166.396 151.412 165.9 152.546 164.958 152.567L150.393 152.977C149.429 153.004 148.473 151.908 148.253 150.53L144.925 129.636C144.709 128.282 145.346 127.181 146.305 127.173L160.712 127.056C161.645 127.049 162.517 128.12 162.74 129.456Z" fill="url(#paint35_linear_104_2761)"/>
|
||||||
|
<path d="M164.568 20.6069C164.358 19.4046 163.425 18.3755 162.547 18.307L149.028 17.2517C148.129 17.182 147.631 18.1114 147.836 19.3286L150.991 38.0841C151.199 39.3225 152.01 40.3691 152.916 40.4239L166.589 41.2387C167.476 41.2923 168.021 40.3429 167.807 39.1207L164.568 20.6069Z" fill="url(#paint36_linear_104_2761)"/>
|
||||||
|
<path d="M169.162 46.8713C168.947 45.6429 168.005 44.6051 167.12 44.5552L153.501 43.7716C152.594 43.7192 152.095 44.6873 152.304 45.9319L155.525 65.111C155.738 66.3781 156.558 67.4321 157.47 67.467L171.252 68.0027C172.139 68.0376 172.691 67.0521 172.474 65.8025L169.162 46.8713Z" fill="url(#paint37_linear_104_2761)"/>
|
||||||
|
<path d="M173.858 73.7226C173.638 72.4668 172.687 71.4215 171.795 71.3891L158.072 70.8907C157.159 70.8571 156.659 71.8625 156.873 73.1333L160.168 92.7522C160.385 94.0479 161.214 95.1082 162.133 95.1194L176.019 95.3586C176.918 95.3735 177.468 94.3494 177.244 93.0724L173.858 73.7226Z" fill="url(#paint38_linear_104_2761)"/>
|
||||||
|
<path d="M178.661 101.178L182.125 120.988C182.353 122.293 181.754 123.355 180.85 123.355L166.929 123.428C166.004 123.428 165.142 122.366 164.919 121.041L161.547 100.964C161.328 99.6631 161.803 98.6166 162.722 98.6303L176.624 98.8308C177.523 98.8445 178.436 99.8948 178.661 101.178Z" fill="url(#paint39_linear_104_2761)"/>
|
||||||
|
<path d="M183.573 129.264L187.118 149.526C187.351 150.861 186.75 151.964 185.836 151.99L171.809 152.39C170.876 152.416 170.005 151.341 169.777 149.985L166.326 129.438C166.102 128.106 166.578 127.019 167.509 127.011L181.518 126.9C182.421 126.893 183.344 127.952 183.573 129.264Z" fill="url(#paint40_linear_104_2761)"/>
|
||||||
|
<path d="M183.879 22.0782C183.662 20.8946 182.764 19.8805 181.907 19.8145L168.818 18.7903C167.945 18.7231 167.49 19.64 167.701 20.8398L170.954 39.3138C171.169 40.5335 171.958 41.5651 172.835 41.6174L186.072 42.411C186.929 42.4621 187.429 41.5264 187.209 40.3229L183.879 22.0782Z" fill="url(#paint41_linear_104_2761)"/>
|
||||||
|
<path d="M188.611 47.9527C188.39 46.7429 187.482 45.7226 186.624 45.6727L173.438 44.914C172.559 44.8641 172.103 45.8172 172.319 47.0432L175.647 65.9295C175.866 67.1754 176.664 68.2132 177.547 68.2481L190.879 68.7726C191.743 68.8063 192.244 67.8345 192.019 66.6035L188.611 47.9527Z" fill="url(#paint42_linear_104_2761)"/>
|
||||||
|
<path d="M193.442 74.3965C193.215 73.1594 192.298 72.1315 191.433 72.1004L178.16 71.6182C177.272 71.5858 176.818 72.5775 177.039 73.8309L180.441 93.1421C180.666 94.4166 181.471 95.4606 182.362 95.4768L195.789 95.7073C196.66 95.7223 197.161 94.7106 196.931 93.4548L193.442 74.3965Z" fill="url(#paint43_linear_104_2761)"/>
|
||||||
|
<path d="M198.389 101.426L201.955 120.918C202.19 122.202 201.638 123.248 200.762 123.253L187.302 123.325C186.406 123.325 185.577 122.28 185.347 120.976L181.866 101.22C181.813 100.924 181.701 100.635 181.73 100.373C181.812 99.5173 182.236 98.9118 182.92 98.9218L196.388 99.1161C197.258 99.1286 198.158 100.169 198.389 101.426Z" fill="url(#paint44_linear_104_2761)"/>
|
||||||
|
<path d="M203.445 129.066L207.093 149C207.333 150.314 206.779 151.4 205.898 151.424L192.34 151.812C191.438 151.838 190.6 150.78 190.368 149.445L186.807 129.234C186.576 127.923 187.016 126.853 187.913 126.846L201.454 126.737C202.325 126.734 203.209 127.774 203.445 129.066Z" fill="url(#paint45_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M27.6993 7.82278C30.0152 9.44243 32.4633 11.2128 34.8178 13.1502L36.9799 31.0709C37.1426 32.4128 36.4041 33.4506 35.3275 33.3858L18.6118 32.3891C17.5076 32.323 16.4506 31.1644 16.2978 29.8026L13.9848 9.15961C13.8349 7.82278 14.6385 6.80988 15.7329 6.8946L27.6993 7.82278Z" fill="url(#paint46_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M38.0088 39.5879L40.523 60.4427C40.6886 61.8132 39.9452 62.9008 38.8577 62.8585L21.9764 62.2032C20.8613 62.1595 19.7916 60.9909 19.6348 59.5943L17.2685 38.438C17.1157 37.0675 17.9262 36.011 19.0314 36.0708L35.748 37.0276C36.8237 37.0924 37.8461 38.2374 38.0088 39.5879Z" fill="url(#paint47_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M41.5789 69.1713L44.1592 90.5456C44.3287 91.9559 43.5804 93.086 42.4831 93.0673L25.4332 92.7732C24.3062 92.7533 23.2237 91.5747 23.0669 90.1432L20.6306 68.4511C20.4739 67.0458 21.2902 65.9419 22.4053 65.983L39.2876 66.5935C40.3781 66.6334 41.4104 67.7858 41.5789 69.1713Z" fill="url(#paint48_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M45.2382 99.4934L47.8835 121.41C48.058 122.855 47.3037 124.034 46.1946 124.04L28.9721 124.126C27.8334 124.132 26.738 122.943 26.5733 121.475L24.0799 99.2256C23.9182 97.7853 24.7414 96.6329 25.8694 96.6491L42.9262 96.8983C44.0206 96.912 45.0666 98.0744 45.2382 99.4934Z" fill="url(#paint49_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M48.991 130.585L51.7033 153.062C51.8828 154.545 51.1226 155.775 50.0036 155.802L32.6047 156.288C31.455 156.321 30.3449 155.122 30.1763 153.615L27.6178 130.788C27.4521 129.31 28.2823 128.108 29.422 128.098L46.6464 127.962C47.7566 127.952 48.8155 129.129 48.991 130.585Z" fill="url(#paint50_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M40.5777 31.2989L38.7744 16.5339C44.7374 21.5598 50.6235 27.545 56.3962 34.6516L42.8365 33.8405C41.7727 33.7769 40.7414 32.6419 40.5777 31.2989Z" fill="url(#paint51_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M59.3539 38.3844C60.1634 39.4484 60.8486 40.5373 61.7202 41.6474L64.2984 61.4108C64.4749 62.7638 63.8143 63.829 62.7643 63.7892L46.4568 63.155C45.3802 63.1139 44.3282 61.9652 44.1606 60.5922L41.6158 39.7935C41.4512 38.4467 42.2261 37.4051 43.2919 37.4662L59.3539 38.3844Z" fill="url(#paint52_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M65.4147 69.9924L68.1566 91.0029C68.3371 92.3883 67.6725 93.4947 66.6127 93.4822L50.1474 93.1982C49.0629 93.1795 47.9951 92.0208 47.8236 90.6142L45.2187 69.2972C45.0501 67.9167 45.8536 66.8316 46.9313 66.8714L63.1993 67.4595C64.2563 67.4981 65.2373 68.6306 65.4147 69.9924Z" fill="url(#paint53_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M69.3031 99.795L72.1131 121.328C72.2984 122.748 71.63 123.908 70.5602 123.913L53.9372 123.996C52.8389 123.996 51.7623 122.834 51.5858 121.392L48.9158 99.5371C48.7433 98.1218 49.5518 96.9906 50.6403 97.0068L67.068 97.2435C68.1289 97.2597 69.1217 98.4009 69.3031 99.795Z" fill="url(#paint54_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M73.2895 130.34L76.1694 152.414C76.3587 153.87 75.6873 155.08 74.6067 155.111L57.822 155.579C56.7138 155.611 55.6234 154.433 55.443 152.953L52.704 130.541C52.5265 129.089 53.3419 127.911 54.4412 127.902L71.0268 127.769C72.0985 127.76 73.1022 128.911 73.2895 130.34Z" fill="url(#paint55_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M67.9865 61.559L66.2188 48.1682C69.5372 53.2797 72.5864 58.661 75.3466 64.2775L70.199 64.0769C69.1608 64.0383 68.164 62.9082 67.9865 61.559Z" fill="url(#paint56_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M71.882 91.0738L69.1145 70.1181C68.9351 68.7613 69.6508 67.6923 70.692 67.7297L77.1223 67.9627C77.8453 69.5109 78.5562 71.089 79.2549 72.697C82.8812 81.108 87.0162 87.2926 91.5407 91.769C91.5881 92.9775 90.9492 93.897 90.0046 93.887L74.131 93.6129C73.08 93.5942 72.0644 92.4567 71.882 91.0738Z" fill="url(#paint57_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M92.6152 100.089L95.573 121.252C95.7702 122.647 95.1461 123.787 94.1128 123.793L78.1179 123.875C77.058 123.875 76.0582 122.736 75.8709 121.319L73.0403 99.8437C72.8569 98.4533 73.5766 97.3395 74.6276 97.3519L90.4599 97.5799C91.4853 97.5973 92.4229 98.7186 92.6152 100.089Z" fill="url(#paint58_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M96.8203 130.107L99.855 151.793C100.052 153.223 99.4301 154.41 98.388 154.441L82.2441 154.897C81.1744 154.927 80.1628 153.775 79.9706 152.32L77.061 130.307C76.8727 128.881 77.5974 127.72 78.6593 127.712L94.6364 127.587C95.6717 127.578 96.6231 128.7 96.8203 130.107Z" fill="url(#paint59_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M99.3193 97.7108C104.426 100.548 109.98 101.822 115.39 102.149L118.228 121.178C118.432 122.549 117.86 123.67 116.862 123.67L101.501 123.753C100.478 123.753 99.5895 122.632 99.3923 121.244L96.4088 100.141C96.2117 98.771 96.7815 97.6759 97.797 97.6908L99.3193 97.7108Z" fill="url(#paint60_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M119.528 129.882L122.706 151.186C122.915 152.592 122.341 153.76 121.335 153.788L105.838 154.24C104.805 154.269 103.907 153.14 103.705 151.712L100.648 130.084C100.451 128.683 101.055 127.54 102.079 127.531L117.46 127.406C118.452 127.395 119.322 128.501 119.528 129.882Z" fill="url(#paint61_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M136.994 100.293C137.027 100.411 137.172 100.543 137.191 100.661L140.425 121.123C140.638 122.473 139.964 123.569 138.999 123.574L123.965 123.646C122.979 123.646 121.919 122.541 121.713 121.173L118.865 102.241C125.032 102.233 130.91 101.34 136.994 100.293Z" fill="url(#paint62_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M141.779 129.678L145.091 150.627C145.308 152.009 144.632 153.149 143.659 153.176L128.497 153.596C127.499 153.624 126.427 152.505 126.22 151.104L123.021 129.851C122.814 128.48 123.504 127.359 124.494 127.347L139.55 127.232C140.516 127.223 141.565 128.326 141.779 129.678Z" fill="url(#paint63_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M157.987 100.916L161.339 121.042C161.56 122.369 161.065 123.453 160.131 123.458L145.681 123.532C144.725 123.532 143.779 122.449 143.565 121.103L140.312 100.695C140.265 100.363 140.278 100.023 140.347 99.6979C142.79 99.2569 145.251 98.8258 147.695 98.4197L155.986 98.5443C156.915 98.5492 157.77 99.6082 157.987 100.916Z" fill="url(#paint64_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M162.74 129.456L166.17 150.054C166.396 151.412 165.9 152.546 164.958 152.567L150.393 152.977C149.429 153.004 148.473 151.908 148.253 150.53L144.925 129.636C144.709 128.282 145.346 127.181 146.305 127.173L160.712 127.056C161.645 127.049 162.517 128.12 162.74 129.456Z" fill="url(#paint65_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M178.661 101.178L182.125 120.988C182.353 122.293 181.754 123.355 180.85 123.355L166.929 123.428C166.004 123.428 165.142 122.366 164.919 121.041L161.547 100.964C161.328 99.6631 161.803 98.6166 162.722 98.6303L176.624 98.8308C177.523 98.8445 178.436 99.8948 178.661 101.178Z" fill="url(#paint66_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M183.573 129.264L187.118 149.526C187.351 150.861 186.75 151.964 185.836 151.99L171.809 152.39C170.876 152.416 170.005 151.341 169.777 149.985L166.326 129.438C166.102 128.106 166.578 127.019 167.509 127.011L181.518 126.9C182.421 126.893 183.344 127.952 183.573 129.264Z" fill="url(#paint67_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M201.368 117.713L201.96 120.918C202.195 122.202 201.643 123.247 200.767 123.252L187.307 123.325C186.411 123.325 185.582 122.279 185.352 120.976L181.87 101.22C181.818 100.924 181.706 100.635 181.735 100.373C187.761 103.073 193.592 107.59 199.178 114.825C199.928 115.806 200.38 116.754 201.368 117.713Z" fill="url(#paint68_linear_104_2761)"/>
|
||||||
|
<path style="mix-blend-mode:multiply" opacity="0.2" d="M203.445 129.066L207.093 149C207.333 150.314 206.779 151.4 205.898 151.424L192.34 151.812C191.438 151.838 190.6 150.78 190.368 149.445L186.807 129.234C186.576 127.923 187.016 126.853 187.913 126.846L201.454 126.737C202.325 126.734 203.209 127.774 203.445 129.066Z" fill="url(#paint69_linear_104_2761)"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_104_2761" x1="102.832" y1="214.842" x2="99.8725" y2="206.144" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_104_2761" x1="119.239" y1="114.564" x2="91.3606" y2="243.103" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_104_2761" x1="117.611" y1="195.414" x2="112.489" y2="219.035" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_104_2761" x1="116.051" y1="173.651" x2="111.296" y2="159.674" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_104_2761" x1="174.752" y1="9.83855" x2="-7.25453" y2="119.148" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint5_linear_104_2761" x1="7.33375" y1="81.9865" x2="213" y2="81.9865" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EBEFF2"/>
|
||||||
|
<stop offset="0.47" stop-color="#D2D9E1"/>
|
||||||
|
<stop offset="0.99" stop-color="#B7C0CE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_104_2761" x1="171.138" y1="-119.531" x2="-22.1472" y2="-3.44631" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_104_2761" x1="188.28" y1="-103.37" x2="-9.57713" y2="15.4606" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint8_linear_104_2761" x1="206.128" y1="-87.0711" x2="3.52677" y2="34.6085" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint9_linear_104_2761" x1="224.718" y1="-70.6392" x2="17.1967" y2="53.9953" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_104_2761" x1="244.093" y1="-54.0801" x2="31.4638" y2="73.6225" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_104_2761" x1="176.573" y1="-100.221" x2="-9.82799" y2="11.7283" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint12_linear_104_2761" x1="193.087" y1="-83.722" x2="2.35346" y2="30.8303" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint13_linear_104_2761" x1="210.263" y1="-67.0646" x2="15.0403" y2="50.1842" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint14_linear_104_2761" x1="228.139" y1="-50.2528" x2="28.2598" y2="69.7919" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint15_linear_104_2761" x1="246.751" y1="-33.2913" x2="42.0414" y2="89.6541" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint16_linear_104_2761" x1="182.217" y1="-81.8732" x2="2.79491" y2="25.8852" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint17_linear_104_2761" x1="198.153" y1="-65.0724" x2="14.5832" y2="45.1764" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint18_linear_104_2761" x1="214.677" y1="-48.0563" x2="26.8797" y2="64.733" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint19_linear_104_2761" x1="231.879" y1="-30.9191" x2="39.6496" y2="84.5313" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint20_linear_104_2761" x1="249.762" y1="-13.5864" x2="52.9639" y2="104.608" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint21_linear_104_2761" x1="188.064" y1="-64.4633" x2="15.7144" y2="39.048" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint22_linear_104_2761" x1="203.382" y1="-47.3449" x2="27.1437" y2="58.5014" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint23_linear_104_2761" x1="219.29" y1="-30.0359" x2="39.0247" y2="78.2285" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint24_linear_104_2761" x1="235.916" y1="-12.6346" x2="51.3371" y2="98.2207" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint25_linear_104_2761" x1="253.1" y1="5.04205" x2="64.1985" y2="118.494" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint26_linear_104_2761" x1="196.021" y1="-49.8653" x2="26.7548" y2="51.7944" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint27_linear_104_2761" x1="210.996" y1="-32.6794" x2="38.0153" y2="71.2104" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint28_linear_104_2761" x1="226.529" y1="-15.2946" x2="49.7066" y2="90.9022" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint29_linear_104_2761" x1="242.303" y1="2.61866" x2="62.0179" y2="110.896" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint30_linear_104_2761" x1="259.321" y1="20.1322" x2="74.4915" y2="131.138" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint31_linear_104_2761" x1="201.966" y1="-34.1485" x2="39.9125" y2="63.1788" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint32_linear_104_2761" x1="216.382" y1="-16.6936" x2="50.8095" y2="82.7463" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint33_linear_104_2761" x1="231.326" y1="0.972906" x2="62.1143" y2="102.599" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint34_linear_104_2761" x1="246.863" y1="18.844" x2="73.826" y2="122.767" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint35_linear_104_2761" x1="262.927" y1="36.9391" x2="86.0106" y2="143.193" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint36_linear_104_2761" x1="209.258" y1="-20.101" x2="52.3895" y2="74.1123" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint37_linear_104_2761" x1="223.25" y1="-2.49925" x2="63.0323" y2="93.7246" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint38_linear_104_2761" x1="237.74" y1="15.3244" x2="74.0618" y2="113.628" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint39_linear_104_2761" x1="252.768" y1="33.3311" x2="85.4755" y2="133.805" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint40_linear_104_2761" x1="268.333" y1="51.5993" x2="97.338" y2="154.296" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint41_linear_104_2761" x1="216.424" y1="-6.78637" x2="64.7926" y2="84.2812" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint42_linear_104_2761" x1="230" y1="10.9512" x2="75.182" y2="103.933" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint43_linear_104_2761" x1="244.049" y1="28.9193" x2="85.94" y2="123.877" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint44_linear_104_2761" x1="258.587" y1="47.0744" x2="97.0582" y2="144.086" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint45_linear_104_2761" x1="273.685" y1="65.501" x2="108.596" y2="164.651" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint46_linear_104_2761" x1="34.0753" y1="11.9143" x2="12.8699" y2="24.6497" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint47_linear_104_2761" x1="38.6595" y1="40.1186" x2="15.8313" y2="53.8292" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint48_linear_104_2761" x1="42.3904" y1="69.9562" x2="19.0153" y2="83.9947" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint49_linear_104_2761" x1="46.2182" y1="100.545" x2="22.2754" y2="114.925" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint50_linear_104_2761" x1="50.1485" y1="131.915" x2="25.6163" y2="146.65" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint51_linear_104_2761" x1="49.7253" y1="23.5408" x2="39.3418" y2="29.777" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint52_linear_104_2761" x1="61.9489" y1="42.0336" x2="40.4407" y2="54.9517" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint53_linear_104_2761" x1="66.3356" y1="70.9654" x2="43.8112" y2="84.4934" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint54_linear_104_2761" x1="70.3897" y1="101.031" x2="47.3284" y2="114.882" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint55_linear_104_2761" x1="74.5495" y1="131.852" x2="50.9311" y2="146.037" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint56_linear_104_2761" x1="71.0272" y1="55.9886" x2="66.0952" y2="58.9509" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint57_linear_104_2761" x1="83.2637" y1="77.9895" x2="68.8802" y2="86.6277" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint58_linear_104_2761" x1="93.8022" y1="101.499" x2="71.6238" y2="114.82" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint59_linear_104_2761" x1="98.174" y1="131.788" x2="75.4691" y2="145.425" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint60_linear_104_2761" x1="115.693" y1="102.648" x2="95.2397" y2="114.933" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint61_linear_104_2761" x1="120.993" y1="131.735" x2="99.1987" y2="144.824" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint62_linear_104_2761" x1="138.946" y1="103.539" x2="118.284" y2="115.949" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint63_linear_104_2761" x1="143.172" y1="131.522" x2="121.847" y2="144.328" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint64_linear_104_2761" x1="159.493" y1="102.902" x2="139.529" y2="114.893" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint65_linear_104_2761" x1="164.299" y1="131.525" x2="143.887" y2="143.784" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint66_linear_104_2761" x1="180.066" y1="103.054" x2="160.764" y2="114.647" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint67_linear_104_2761" x1="185.134" y1="131.388" x2="165.406" y2="143.237" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint68_linear_104_2761" x1="195.496" y1="107.936" x2="182.056" y2="116.008" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint69_linear_104_2761" x1="205.069" y1="131.303" x2="186.022" y2="142.744" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#AA80F9"/>
|
||||||
|
<stop offset="1" stop-color="#6165D7"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 170 KiB |
After Width: | Height: | Size: 60 KiB |
|
@ -0,0 +1,8 @@
|
||||||
|
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.03893 0C2.44846 0 1.1543 1.29416 1.1543 2.88463C1.1543 4.4751 2.4484 5.76926 4.03893 5.76926C5.62939 5.76926 6.92355 4.47516 6.92355 2.88463C6.92355 1.29416 5.62939 0 4.03893 0ZM4.03893 4.61537C3.08455 4.61537 2.30818 3.839 2.30818 2.88463C2.30818 1.93025 3.08455 1.15389 4.03893 1.15389C4.99336 1.15389 5.76973 1.93025 5.76973 2.88463C5.76973 3.839 4.99336 4.61537 4.03893 4.61537Z" fill="#181B56"/>
|
||||||
|
<path d="M24.2306 20.7693C21.6857 20.7693 19.6152 22.8398 19.6152 25.3847C19.6152 27.9296 21.6857 30 24.2306 30C26.7755 30 28.846 27.9296 28.846 25.3847C28.846 22.8398 26.7755 20.7693 24.2306 20.7693ZM24.2306 28.8462C22.3218 28.8462 20.7691 27.2935 20.7691 25.3847C20.7691 23.4758 22.3218 21.9231 24.2306 21.9231C26.1394 21.9231 27.6921 23.4758 27.6921 25.3847C27.6921 27.2935 26.1395 28.8462 24.2306 28.8462Z" fill="#181B56"/>
|
||||||
|
<path d="M16.7306 1.73071C11.3225 1.73071 6.92285 6.13034 6.92285 11.5384C6.92285 16.9465 11.3225 21.3461 16.7306 21.3461C22.1387 21.3461 26.5383 16.9466 26.5383 11.5384C26.5383 6.13028 22.1387 1.73071 16.7306 1.73071ZM16.7306 20.1923C11.9586 20.1923 8.07674 16.3104 8.07674 11.5384C8.07674 6.76644 11.9586 2.8846 16.7306 2.8846C21.5026 2.8846 25.3844 6.76644 25.3844 11.5384C25.3845 16.3105 21.5026 20.1923 16.7306 20.1923Z" fill="#181B56"/>
|
||||||
|
<path d="M16.7309 5.19238C13.2317 5.19238 10.3848 8.03928 10.3848 11.5386C10.3848 11.8574 10.6428 12.1155 10.9617 12.1155C11.2805 12.1155 11.5386 11.8574 11.5386 11.5386C11.5386 8.67537 13.8677 6.34627 16.7309 6.34627C17.0497 6.34627 17.3078 6.08822 17.3078 5.76936C17.3079 5.45043 17.0499 5.19238 16.7309 5.19238Z" fill="#181B56"/>
|
||||||
|
<path d="M13.9232 22.1558C13.6432 22.002 13.2928 22.1052 13.1401 22.3846C12.126 24.2348 10.1856 25.3847 8.07738 25.3847C4.89639 25.3847 2.30812 22.7964 2.30812 19.6155C2.30812 17.3111 3.67547 15.2305 5.79217 14.3161C6.08461 14.1899 6.21926 13.8502 6.09305 13.5578C5.96684 13.2648 5.626 13.1313 5.33473 13.2569C2.79492 14.3544 1.1543 16.8503 1.1543 19.6155C1.1543 23.4331 4.25976 26.5385 8.07738 26.5385C10.607 26.5385 12.935 25.1594 14.152 22.9389C14.3053 22.6595 14.2027 22.3091 13.9232 22.1558Z" fill="#181B56"/>
|
||||||
|
<path d="M8.07729 23.077C6.16848 23.077 4.61574 21.5243 4.61574 19.6155C4.61574 19.2966 4.3577 19.0386 4.03883 19.0386C3.71996 19.0386 3.46191 19.2966 3.46191 19.6155C3.46191 22.1604 5.53238 24.2309 8.07729 24.2309C8.39615 24.2309 8.6542 23.9728 8.6542 23.6539C8.6542 23.3351 8.39615 23.077 8.07729 23.077Z" fill="#181B56"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,5 @@
|
||||||
|
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M27.585 14.25L25.83 30.165C25.7892 30.5336 25.6133 30.874 25.3363 31.1205C25.0593 31.3671 24.7008 31.5022 24.33 31.5H11.67C11.2992 31.5022 10.9407 31.3671 10.6637 31.1205C10.3867 30.874 10.2108 30.5336 10.17 30.165L8.25 12.75C17.7 12.825 18.225 14.16 27.585 14.25Z" fill="white"/>
|
||||||
|
<path d="M8.25 12.75C17.7 12.825 18.225 14.16 27.585 14.25" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M27.0003 4.50003C27.212 4.49874 27.4215 4.54227 27.6152 4.62775C27.8088 4.71323 27.9822 4.83873 28.1239 4.996C28.2655 5.15326 28.3723 5.33873 28.4372 5.54022C28.5021 5.7417 28.5236 5.95464 28.5003 6.16503L25.8453 30.165C25.8045 30.5336 25.6287 30.874 25.3517 31.1206C25.0746 31.3671 24.7161 31.5023 24.3453 31.5H11.6703C11.2995 31.5023 10.941 31.3671 10.664 31.1206C10.387 30.874 10.2111 30.5336 10.1703 30.165L7.50032 6.16503C7.47703 5.95464 7.49853 5.7417 7.56342 5.54022C7.6283 5.33873 7.73509 5.15326 7.87677 4.996C8.01845 4.83873 8.19181 4.71323 8.38546 4.62775C8.5791 4.54227 8.78865 4.49874 9.00032 4.50003H27.0003Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M27.0003 4.50003C27.212 4.49874 27.4215 4.54227 27.6152 4.62775C27.8088 4.71323 27.9822 4.83873 28.1239 4.996C28.2655 5.15326 28.3723 5.33873 28.4372 5.54022C28.5021 5.7417 28.5236 5.95464 28.5003 6.16503L25.8453 30.165C25.8045 30.5336 25.6287 30.874 25.3517 31.1206C25.0746 31.3671 24.7161 31.5023 24.3453 31.5H11.6703C11.2995 31.5023 10.941 31.3671 10.664 31.1206C10.387 30.874 10.2111 30.5336 10.1703 30.165L7.50032 6.16503C7.47703 5.95464 7.49853 5.7417 7.56342 5.54022C7.6283 5.33873 7.73509 5.15326 7.87677 4.996C8.01845 4.83873 8.19181 4.71323 8.38546 4.62775C8.5791 4.54227 8.78865 4.49874 9.00032 4.50003H27.0003Z" stroke="#181B56" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 819 B |
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = {
|
||||||
|
presets: ['module:@react-native/babel-preset'],
|
||||||
|
};
|
|
@ -0,0 +1,9 @@
|
||||||
|
/**
|
||||||
|
* @format
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {AppRegistry} from 'react-native';
|
||||||
|
import App from './src/App';
|
||||||
|
import {name as appName} from './app.json';
|
||||||
|
|
||||||
|
AppRegistry.registerComponent(appName, () => App);
|
|
@ -0,0 +1,11 @@
|
||||||
|
# This `.xcode.env` file is versioned and is used to source the environment
|
||||||
|
# used when running script phases inside Xcode.
|
||||||
|
# To customize your local environment, you can create an `.xcode.env.local`
|
||||||
|
# file that is not versioned.
|
||||||
|
|
||||||
|
# NODE_BINARY variable contains the PATH to the node executable.
|
||||||
|
#
|
||||||
|
# Customize the NODE_BINARY variable here.
|
||||||
|
# For example, to use nvm with brew, add the following line
|
||||||
|
# . "$(brew --prefix nvm)/nvm.sh" --no-use
|
||||||
|
export NODE_BINARY=$(command -v node)
|
|
@ -0,0 +1,690 @@
|
||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 54;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
00E356F31AD99517003FC87E /* HydroZonerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* HydroZonerTests.m */; };
|
||||||
|
0C80B921A6F3F58F76C31292 /* libPods-HydroZoner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-HydroZoner.a */; };
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
||||||
|
7699B88040F8A987B510C191 /* libPods-HydroZoner-HydroZonerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-HydroZoner-HydroZonerTests.a */; };
|
||||||
|
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
|
||||||
|
remoteInfo = HydroZoner;
|
||||||
|
};
|
||||||
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
00E356EE1AD99517003FC87E /* HydroZonerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HydroZonerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
00E356F21AD99517003FC87E /* HydroZonerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HydroZonerTests.m; sourceTree = "<group>"; };
|
||||||
|
13B07F961A680F5B00A75B9A /* HydroZoner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HydroZoner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = HydroZoner/AppDelegate.h; sourceTree = "<group>"; };
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = HydroZoner/AppDelegate.mm; sourceTree = "<group>"; };
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HydroZoner/Images.xcassets; sourceTree = "<group>"; };
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HydroZoner/Info.plist; sourceTree = "<group>"; };
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = HydroZoner/main.m; sourceTree = "<group>"; };
|
||||||
|
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = HydroZoner/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||||
|
19F6CBCC0A4E27FBF8BF4A61 /* libPods-HydroZoner-HydroZonerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HydroZoner-HydroZonerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
3B4392A12AC88292D35C810B /* Pods-HydroZoner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HydroZoner.debug.xcconfig"; path = "Target Support Files/Pods-HydroZoner/Pods-HydroZoner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
5709B34CF0A7D63546082F79 /* Pods-HydroZoner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HydroZoner.release.xcconfig"; path = "Target Support Files/Pods-HydroZoner/Pods-HydroZoner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
5B7EB9410499542E8C5724F5 /* Pods-HydroZoner-HydroZonerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HydroZoner-HydroZonerTests.debug.xcconfig"; path = "Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
5DCACB8F33CDC322A6C60F78 /* libPods-HydroZoner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HydroZoner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = HydroZoner/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
|
89C6BE57DB24E9ADA2F236DE /* Pods-HydroZoner-HydroZonerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HydroZoner-HydroZonerTests.release.xcconfig"; path = "Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
00E356EB1AD99517003FC87E /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
7699B88040F8A987B510C191 /* libPods-HydroZoner-HydroZonerTests.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
0C80B921A6F3F58F76C31292 /* libPods-HydroZoner.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
00E356EF1AD99517003FC87E /* HydroZonerTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00E356F21AD99517003FC87E /* HydroZonerTests.m */,
|
||||||
|
00E356F01AD99517003FC87E /* Supporting Files */,
|
||||||
|
);
|
||||||
|
path = HydroZonerTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00E356F01AD99517003FC87E /* Supporting Files */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00E356F11AD99517003FC87E /* Info.plist */,
|
||||||
|
);
|
||||||
|
name = "Supporting Files";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
13B07FAE1A68108700A75B9A /* HydroZoner */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.mm */,
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */,
|
||||||
|
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */,
|
||||||
|
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
|
||||||
|
);
|
||||||
|
name = HydroZoner;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
||||||
|
5DCACB8F33CDC322A6C60F78 /* libPods-HydroZoner.a */,
|
||||||
|
19F6CBCC0A4E27FBF8BF4A61 /* libPods-HydroZoner-HydroZonerTests.a */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
);
|
||||||
|
name = Libraries;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
83CBB9F61A601CBA00E9B192 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07FAE1A68108700A75B9A /* HydroZoner */,
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||||
|
00E356EF1AD99517003FC87E /* HydroZonerTests */,
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */,
|
||||||
|
2D16E6871FA4F8E400B85C8A /* Frameworks */,
|
||||||
|
BBD78D7AC51CEA395F1C20DB /* Pods */,
|
||||||
|
);
|
||||||
|
indentWidth = 2;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
tabWidth = 2;
|
||||||
|
usesTabs = 0;
|
||||||
|
};
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07F961A680F5B00A75B9A /* HydroZoner.app */,
|
||||||
|
00E356EE1AD99517003FC87E /* HydroZonerTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
BBD78D7AC51CEA395F1C20DB /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3B4392A12AC88292D35C810B /* Pods-HydroZoner.debug.xcconfig */,
|
||||||
|
5709B34CF0A7D63546082F79 /* Pods-HydroZoner.release.xcconfig */,
|
||||||
|
5B7EB9410499542E8C5724F5 /* Pods-HydroZoner-HydroZonerTests.debug.xcconfig */,
|
||||||
|
89C6BE57DB24E9ADA2F236DE /* Pods-HydroZoner-HydroZonerTests.release.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
00E356ED1AD99517003FC87E /* HydroZonerTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HydroZonerTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
00E356EA1AD99517003FC87E /* Sources */,
|
||||||
|
00E356EB1AD99517003FC87E /* Frameworks */,
|
||||||
|
00E356EC1AD99517003FC87E /* Resources */,
|
||||||
|
C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */,
|
||||||
|
F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
00E356F51AD99517003FC87E /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = HydroZonerTests;
|
||||||
|
productName = HydroZonerTests;
|
||||||
|
productReference = 00E356EE1AD99517003FC87E /* HydroZonerTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
13B07F861A680F5B00A75B9A /* HydroZoner */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HydroZoner" */;
|
||||||
|
buildPhases = (
|
||||||
|
C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */,
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||||
|
00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */,
|
||||||
|
E235C05ADACE081382539298 /* [CP] Copy Pods Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = HydroZoner;
|
||||||
|
productName = HydroZoner;
|
||||||
|
productReference = 13B07F961A680F5B00A75B9A /* HydroZoner.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 1210;
|
||||||
|
TargetAttributes = {
|
||||||
|
00E356ED1AD99517003FC87E = {
|
||||||
|
CreatedOnToolsVersion = 6.2;
|
||||||
|
TestTargetID = 13B07F861A680F5B00A75B9A;
|
||||||
|
};
|
||||||
|
13B07F861A680F5B00A75B9A = {
|
||||||
|
LastSwiftMigration = 1120;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HydroZoner" */;
|
||||||
|
compatibilityVersion = "Xcode 12.0";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 83CBB9F61A601CBA00E9B192;
|
||||||
|
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
13B07F861A680F5B00A75B9A /* HydroZoner */,
|
||||||
|
00E356ED1AD99517003FC87E /* HydroZonerTests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
00E356EC1AD99517003FC87E /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"$(SRCROOT)/.xcode.env.local",
|
||||||
|
"$(SRCROOT)/.xcode.env",
|
||||||
|
);
|
||||||
|
name = "Bundle React Native code and images";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
|
||||||
|
};
|
||||||
|
00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-HydroZoner-HydroZonerTests-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;
|
||||||
|
};
|
||||||
|
C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-HydroZoner-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;
|
||||||
|
};
|
||||||
|
C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HydroZoner/Pods-HydroZoner-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HydroZoner-HydroZonerTests/Pods-HydroZoner-HydroZonerTests-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
00E356EA1AD99517003FC87E /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
00E356F31AD99517003FC87E /* HydroZonerTests.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 13B07F861A680F5B00A75B9A /* HydroZoner */;
|
||||||
|
targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
00E356F61AD99517003FC87E /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-HydroZoner-HydroZonerTests.debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = HydroZonerTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HydroZoner.app/HydroZoner";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
00E356F71AD99517003FC87E /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-HydroZoner-HydroZonerTests.release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
INFOPLIST_FILE = HydroZonerTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HydroZoner.app/HydroZoner";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-HydroZoner.debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = HydroZoner/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = HydroZoner;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-HydroZoner.release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
INFOPLIST_FILE = HydroZoner/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = HydroZoner;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||||
|
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_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
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_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||||
|
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 = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
/usr/lib/swift,
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||||
|
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||||
|
"\"$(inherited)\"",
|
||||||
|
);
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
OTHER_CPLUSPLUSFLAGS = (
|
||||||
|
"$(OTHER_CFLAGS)",
|
||||||
|
"-DFOLLY_NO_CONFIG",
|
||||||
|
"-DFOLLY_MOBILE=1",
|
||||||
|
"-DFOLLY_USE_LIBCPP=1",
|
||||||
|
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||||
|
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
|
||||||
|
);
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||||
|
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_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
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_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = YES;
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
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 = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
/usr/lib/swift,
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||||
|
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||||
|
"\"$(inherited)\"",
|
||||||
|
);
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
OTHER_CPLUSPLUSFLAGS = (
|
||||||
|
"$(OTHER_CFLAGS)",
|
||||||
|
"-DFOLLY_NO_CONFIG",
|
||||||
|
"-DFOLLY_MOBILE=1",
|
||||||
|
"-DFOLLY_USE_LIBCPP=1",
|
||||||
|
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||||
|
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
|
||||||
|
);
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HydroZonerTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
00E356F61AD99517003FC87E /* Debug */,
|
||||||
|
00E356F71AD99517003FC87E /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HydroZoner" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */,
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HydroZoner" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */,
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1210"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "HydroZoner.app"
|
||||||
|
BlueprintName = "HydroZoner"
|
||||||
|
ReferencedContainer = "container:HydroZoner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
|
||||||
|
BuildableName = "HydroZonerTests.xctest"
|
||||||
|
BlueprintName = "HydroZonerTests"
|
||||||
|
ReferencedContainer = "container:HydroZoner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "HydroZoner.app"
|
||||||
|
BlueprintName = "HydroZoner"
|
||||||
|
ReferencedContainer = "container:HydroZoner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "HydroZoner.app"
|
||||||
|
BlueprintName = "HydroZoner"
|
||||||
|
ReferencedContainer = "container:HydroZoner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
|
@ -0,0 +1,6 @@
|
||||||
|
#import <RCTAppDelegate.h>
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@interface AppDelegate : RCTAppDelegate
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,31 @@
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
#import <React/RCTBundleURLProvider.h>
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
|
||||||
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||||
|
{
|
||||||
|
self.moduleName = @"HydroZoner";
|
||||||
|
// You can add your custom initial props in the dictionary below.
|
||||||
|
// They will be passed down to the ViewController used by React Native.
|
||||||
|
self.initialProps = @{};
|
||||||
|
|
||||||
|
return [super application:application didFinishLaunchingWithOptions:launchOptions];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
||||||
|
{
|
||||||
|
return [self bundleURL];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *)bundleURL
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
|
||||||
|
#else
|
||||||
|
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ios-marketing",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>HydroZoner</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>$(MARKETING_VERSION)</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<!-- Do not change NSAllowsArbitraryLoads to true, or you will risk app rejection! -->
|
||||||
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSAllowsLocalNetworking</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
|
<string></string>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--View Controller-->
|
||||||
|
<scene sceneID="EHf-IW-A2E">
|
||||||
|
<objects>
|
||||||
|
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||||
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="HydroZoner" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
|
||||||
|
<rect key="frame" x="0.0" y="202" width="375" height="43"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="MN2-I3-ftu">
|
||||||
|
<rect key="frame" x="0.0" y="626" width="375" height="21"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="Bcu-3y-fUS" firstAttribute="bottom" secondItem="MN2-I3-ftu" secondAttribute="bottom" constant="20" id="OZV-Vh-mqD"/>
|
||||||
|
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/>
|
||||||
|
<constraint firstItem="MN2-I3-ftu" firstAttribute="centerX" secondItem="Bcu-3y-fUS" secondAttribute="centerX" id="akx-eg-2ui"/>
|
||||||
|
<constraint firstItem="MN2-I3-ftu" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" id="i1E-0Y-4RG"/>
|
||||||
|
<constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/>
|
||||||
|
<constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" symbolic="YES" id="x7j-FC-K8j"/>
|
||||||
|
</constraints>
|
||||||
|
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="52.173913043478265" y="375"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
</document>
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>35F9.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -0,0 +1,10 @@
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
@autoreleasepool {
|
||||||
|
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
|
|
||||||
|
#import <React/RCTLog.h>
|
||||||
|
#import <React/RCTRootView.h>
|
||||||
|
|
||||||
|
#define TIMEOUT_SECONDS 600
|
||||||
|
#define TEXT_TO_LOOK_FOR @"Welcome to React"
|
||||||
|
|
||||||
|
@interface HydroZonerTests : XCTestCase
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation HydroZonerTests
|
||||||
|
|
||||||
|
- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test
|
||||||
|
{
|
||||||
|
if (test(view)) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
for (UIView *subview in [view subviews]) {
|
||||||
|
if ([self findSubviewInView:subview matching:test]) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testRendersWelcomeScreen
|
||||||
|
{
|
||||||
|
UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
|
||||||
|
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
|
||||||
|
BOOL foundElement = NO;
|
||||||
|
|
||||||
|
__block NSString *redboxError = nil;
|
||||||
|
#ifdef DEBUG
|
||||||
|
RCTSetLogFunction(
|
||||||
|
^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
|
||||||
|
if (level >= RCTLogLevelError) {
|
||||||
|
redboxError = message;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
|
||||||
|
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
|
||||||
|
[[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
|
||||||
|
|
||||||
|
foundElement = [self findSubviewInView:vc.view
|
||||||
|
matching:^BOOL(UIView *view) {
|
||||||
|
if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
RCTSetLogFunction(RCTDefaultLogFunction);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
|
||||||
|
XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>BNDL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Resolve react_native_pods.rb with node to allow for hoisting
|
||||||
|
require Pod::Executable.execute_command('node', ['-p',
|
||||||
|
'require.resolve(
|
||||||
|
"react-native/scripts/react_native_pods.rb",
|
||||||
|
{paths: [process.argv[1]]},
|
||||||
|
)', __dir__]).strip
|
||||||
|
|
||||||
|
platform :ios, min_ios_version_supported
|
||||||
|
prepare_react_native_project!
|
||||||
|
|
||||||
|
linkage = ENV['USE_FRAMEWORKS']
|
||||||
|
if linkage != nil
|
||||||
|
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
|
||||||
|
use_frameworks! :linkage => linkage.to_sym
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'HydroZoner' do
|
||||||
|
config = use_native_modules!
|
||||||
|
|
||||||
|
use_react_native!(
|
||||||
|
:path => config[:reactNativePath],
|
||||||
|
# An absolute path to your application root.
|
||||||
|
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
||||||
|
)
|
||||||
|
|
||||||
|
target 'HydroZonerTests' do
|
||||||
|
inherit! :complete
|
||||||
|
# Pods for testing
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
|
||||||
|
react_native_post_install(
|
||||||
|
installer,
|
||||||
|
config[:reactNativePath],
|
||||||
|
:mac_catalyst_enabled => false,
|
||||||
|
# :ccache_enabled => true
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = {
|
||||||
|
preset: 'react-native',
|
||||||
|
};
|
|
@ -0,0 +1,22 @@
|
||||||
|
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
|
||||||
|
const defaultConfig = getDefaultConfig(__dirname);
|
||||||
|
const { assetExts, sourceExts } = defaultConfig.resolver;
|
||||||
|
/**
|
||||||
|
* Metro configuration
|
||||||
|
* https://reactnative.dev/docs/metro
|
||||||
|
*
|
||||||
|
* @type {import('metro-config').MetroConfig}
|
||||||
|
*/
|
||||||
|
const config = {
|
||||||
|
transformer: {
|
||||||
|
babelTransformerPath: require.resolve(
|
||||||
|
"react-native-svg-transformer/react-native"
|
||||||
|
)
|
||||||
|
},
|
||||||
|
resolver: {
|
||||||
|
assetExts: assetExts.filter((ext) => ext !== "svg"),
|
||||||
|
sourceExts: [...sourceExts, "svg"]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
|
|
@ -0,0 +1,63 @@
|
||||||
|
{
|
||||||
|
"name": "HydroZoner",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"android": "react-native run-android",
|
||||||
|
"ios": "react-native run-ios",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"start": "react-native start",
|
||||||
|
"test": "jest"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@react-native-firebase/app": "^22.2.0",
|
||||||
|
"@react-native-firebase/firestore": "^22.2.0",
|
||||||
|
"@react-native-picker/picker": "^2.11.0",
|
||||||
|
"@react-navigation/bottom-tabs": "^7.2.0",
|
||||||
|
"@react-navigation/native": "^7.0.14",
|
||||||
|
"@react-navigation/native-stack": "^7.2.0",
|
||||||
|
"@react-navigation/stack": "^7.1.1",
|
||||||
|
"dayjs": "^1.11.13",
|
||||||
|
"lottie-ios": "^3.1.8",
|
||||||
|
"lottie-react-native": "^7.2.2",
|
||||||
|
"mqtt": "^5.11.0",
|
||||||
|
"paho-mqtt": "^1.1.0",
|
||||||
|
"react": "18.3.1",
|
||||||
|
"react-native": "0.76.6",
|
||||||
|
"react-native-gesture-handler": "^2.25.0",
|
||||||
|
"react-native-paho-mqtt": "^0.1.1",
|
||||||
|
"react-native-picker-select": "^9.3.1",
|
||||||
|
"react-native-reanimated": "^3.17.5",
|
||||||
|
"react-native-safe-area-context": "^5.1.0",
|
||||||
|
"react-native-screens": "^4.5.0",
|
||||||
|
"react-native-svg": "^15.11.1",
|
||||||
|
"react-native-toast-message": "^2.2.1",
|
||||||
|
"react-native-url-polyfill": "^2.0.0",
|
||||||
|
"react-native-vector-icons": "^10.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.25.2",
|
||||||
|
"@babel/preset-env": "^7.25.3",
|
||||||
|
"@babel/runtime": "^7.25.0",
|
||||||
|
"@react-native-community/cli": "^15.1.3",
|
||||||
|
"@react-native-community/cli-platform-android": "15.0.1",
|
||||||
|
"@react-native-community/cli-platform-ios": "15.0.1",
|
||||||
|
"@react-native/babel-preset": "0.76.6",
|
||||||
|
"@react-native/eslint-config": "0.76.6",
|
||||||
|
"@react-native/metro-config": "0.76.6",
|
||||||
|
"@react-native/typescript-config": "0.76.6",
|
||||||
|
"@types/react": "^18.2.6",
|
||||||
|
"@types/react-native-vector-icons": "^6.4.18",
|
||||||
|
"@types/react-test-renderer": "^18.0.0",
|
||||||
|
"babel-jest": "^29.6.3",
|
||||||
|
"eslint": "^8.19.0",
|
||||||
|
"jest": "^29.6.3",
|
||||||
|
"prettier": "2.8.8",
|
||||||
|
"react-native-svg-transformer": "^1.5.0",
|
||||||
|
"react-test-renderer": "18.3.1",
|
||||||
|
"typescript": "5.0.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
// src/App.tsx
|
||||||
|
import React from 'react';
|
||||||
|
import AppNavigator from './navigations/AppNavigator';
|
||||||
|
import Toast from 'react-native-toast-message';
|
||||||
|
|
||||||
|
const App: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<AppNavigator />
|
||||||
|
<Toast />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
|
@ -0,0 +1,60 @@
|
||||||
|
import React, { createContext, useState, useContext, ReactNode } from 'react';
|
||||||
|
|
||||||
|
// Define a type for the sterilisasi data
|
||||||
|
interface SterilisasiContextType {
|
||||||
|
otomasiSterilisasi: string;
|
||||||
|
setOtomasiSterilisasi: (value: string) => void;
|
||||||
|
otomasiRefill: string;
|
||||||
|
setOtomasiRefill: (value: string) => void;
|
||||||
|
durasiSterilisasi: string;
|
||||||
|
setDurasiSterilisasi: (value: string) => void;
|
||||||
|
durasiUV: string;
|
||||||
|
setDurasiUV: (value: string) => void;
|
||||||
|
durasiPostUV: string;
|
||||||
|
setDurasiPostUV: (value: string) => void;
|
||||||
|
sterilisasiAktif: boolean;
|
||||||
|
setSterilisasiAktif: (value: boolean) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the context
|
||||||
|
const SterilisasiContext = createContext<SterilisasiContextType | undefined>(undefined);
|
||||||
|
|
||||||
|
// Create the provider
|
||||||
|
export const SterilisasiProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
|
||||||
|
const [otomasiSterilisasi, setOtomasiSterilisasi] = useState('Tidak');
|
||||||
|
const [otomasiRefill, setOtomasiRefill] = useState('Tidak');
|
||||||
|
const [durasiSterilisasi, setDurasiSterilisasi] = useState('10');
|
||||||
|
const [durasiUV, setDurasiUV] = useState('10');
|
||||||
|
const [durasiPostUV, setDurasiPostUV] = useState('10');
|
||||||
|
const [sterilisasiAktif, setSterilisasiAktif] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SterilisasiContext.Provider
|
||||||
|
value={{
|
||||||
|
otomasiSterilisasi,
|
||||||
|
setOtomasiSterilisasi,
|
||||||
|
otomasiRefill,
|
||||||
|
setOtomasiRefill,
|
||||||
|
durasiSterilisasi,
|
||||||
|
setDurasiSterilisasi,
|
||||||
|
durasiUV,
|
||||||
|
setDurasiUV,
|
||||||
|
durasiPostUV,
|
||||||
|
setDurasiPostUV,
|
||||||
|
sterilisasiAktif,
|
||||||
|
setSterilisasiAktif,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</SterilisasiContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Custom hook to use the context
|
||||||
|
export const useSterilisasiContext = () => {
|
||||||
|
const context = useContext(SterilisasiContext);
|
||||||
|
if (!context) {
|
||||||
|
throw new Error('useSterilisasiContext must be used within a SterilisasiProvider');
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
|
@ -0,0 +1,102 @@
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import { View, Text, TouchableOpacity, Image, StyleSheet } from 'react-native';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
import { useNavigation } from '@react-navigation/native';
|
||||||
|
import { StackNavigationProp } from '@react-navigation/stack';
|
||||||
|
import firestore from '@react-native-firebase/firestore';
|
||||||
|
|
||||||
|
type RootStackParamList = {
|
||||||
|
MainTabs: undefined;
|
||||||
|
Notifikasi: undefined;
|
||||||
|
};
|
||||||
|
type NavigationProps = StackNavigationProp<RootStackParamList, 'MainTabs'>;
|
||||||
|
|
||||||
|
const Header: React.FC = () => {
|
||||||
|
const navigation = useNavigation<NavigationProps>();
|
||||||
|
const [notificationCount, setNotificationCount] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const unsubscribe = firestore()
|
||||||
|
.collection('notifications')
|
||||||
|
.onSnapshot(snapshot => {
|
||||||
|
setNotificationCount(snapshot.size); // total notifikasi
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => unsubscribe();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<View style={styles.logoContainer}>
|
||||||
|
<Image source={require('../../assets/Logo.png')} style={styles.logo} />
|
||||||
|
<View>
|
||||||
|
<Text style={styles.title}>HYDROZONER</Text>
|
||||||
|
<Text style={styles.title}>PKM-KC 2024</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<TouchableOpacity
|
||||||
|
style={styles.menuButton}
|
||||||
|
onPress={() => navigation.navigate('Notifikasi')}
|
||||||
|
>
|
||||||
|
<Icon name="bell" size={24} color="#0F172A" />
|
||||||
|
{notificationCount > 0 && (
|
||||||
|
<View style={styles.badge}>
|
||||||
|
<Text style={styles.badgeText}>
|
||||||
|
{notificationCount > 99 ? '99+' : notificationCount}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
alignItems: 'center',
|
||||||
|
paddingHorizontal: 20,
|
||||||
|
paddingVertical: 15,
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
},
|
||||||
|
logoContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
logo: {
|
||||||
|
width: 45,
|
||||||
|
height: 45,
|
||||||
|
resizeMode: 'contain',
|
||||||
|
marginRight: 10,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#0F172A',
|
||||||
|
},
|
||||||
|
menuButton: {
|
||||||
|
padding: 10,
|
||||||
|
position: 'relative',
|
||||||
|
},
|
||||||
|
badge: {
|
||||||
|
position: 'absolute',
|
||||||
|
right: 4,
|
||||||
|
top: 4,
|
||||||
|
backgroundColor: 'red',
|
||||||
|
borderRadius: 8,
|
||||||
|
minWidth: 16,
|
||||||
|
height: 16,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
paddingHorizontal: 3,
|
||||||
|
},
|
||||||
|
badgeText: {
|
||||||
|
color: 'white',
|
||||||
|
fontSize: 10,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default Header;
|
|
@ -0,0 +1,80 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||||
|
import { createStackNavigator } from '@react-navigation/stack';
|
||||||
|
import { NavigationContainer } from '@react-navigation/native';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
import Header from '../components/Header'; // Import Custom Header
|
||||||
|
|
||||||
|
// Import screens
|
||||||
|
import MonitoringScreen from '../screens/MonitoringScreen';
|
||||||
|
import KontrolScreen from '../screens/ControlScreen';
|
||||||
|
import SettingsScreen from '../screens/SettingsScreen';
|
||||||
|
import NotificationScreen from '../screens/NotificationScreen'; // Import halaman notifikasi
|
||||||
|
|
||||||
|
const Tab = createBottomTabNavigator();
|
||||||
|
const Stack = createStackNavigator();
|
||||||
|
|
||||||
|
// **Bottom Tab Navigator**
|
||||||
|
const MainTabs = () => (
|
||||||
|
<Tab.Navigator
|
||||||
|
initialRouteName="Monitoring"
|
||||||
|
screenOptions={{
|
||||||
|
header: () => <Header />, // Menggunakan custom header di semua screen
|
||||||
|
tabBarStyle: {
|
||||||
|
height: 65,
|
||||||
|
paddingBottom: 10,
|
||||||
|
paddingTop: 8,
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
borderTopLeftRadius: 20,
|
||||||
|
borderTopRightRadius: 20,
|
||||||
|
borderTopColor: '#E5E7EB',
|
||||||
|
},
|
||||||
|
tabBarActiveTintColor: '#181B56',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Sterilisasi"
|
||||||
|
component={KontrolScreen}
|
||||||
|
options={{
|
||||||
|
tabBarLabel: 'Sterilisasi',
|
||||||
|
tabBarIcon: ({ color, size }) => (
|
||||||
|
<Icon name="tachograph-digital" size={size} color={color} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Monitoring"
|
||||||
|
component={MonitoringScreen}
|
||||||
|
options={{
|
||||||
|
tabBarLabel: 'Monitoring',
|
||||||
|
tabBarIcon: ({ color, size }) => (
|
||||||
|
<Icon name="gauge" size={size} color={color} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Settings"
|
||||||
|
component={SettingsScreen}
|
||||||
|
options={{
|
||||||
|
tabBarLabel: 'Settings',
|
||||||
|
tabBarIcon: ({ color, size }) => (
|
||||||
|
<Icon name="sliders" size={size} color={color} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Tab.Navigator>
|
||||||
|
);
|
||||||
|
|
||||||
|
// **Stack Navigator (untuk menangani navigasi ke Notifikasi)**
|
||||||
|
const AppNavigator: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<NavigationContainer>
|
||||||
|
<Stack.Navigator screenOptions={{ headerShown: false }}>
|
||||||
|
<Stack.Screen name="MainTabs" component={MainTabs} />
|
||||||
|
<Stack.Screen name="Notifikasi" component={NotificationScreen} />
|
||||||
|
</Stack.Navigator>
|
||||||
|
</NavigationContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AppNavigator;
|
|
@ -0,0 +1,280 @@
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { View, Text, StyleSheet, TouchableOpacity, Switch, ScrollView, RefreshControl } from 'react-native';
|
||||||
|
import { Picker } from '@react-native-picker/picker';
|
||||||
|
import mqttClient from '../services/MqttClient';
|
||||||
|
import Toast from 'react-native-toast-message';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
|
||||||
|
const ControlScreen = () => {
|
||||||
|
const [otomasiSterilisasi, setOtomasiSterilisasi] = useState(false);
|
||||||
|
const [otomasiRefill, setOtomasiRefill] = useState(false);
|
||||||
|
const [durasiSterilisasi, setDurasiSterilisasi] = useState(10);
|
||||||
|
const [durasiPostUV, setDurasiPostUV] = useState(10);
|
||||||
|
const [isSterilisasiRunning, setIsSterilisasiRunning] = useState(false);
|
||||||
|
const [isRefillRunning, setIsRefillRunning] = useState(false);
|
||||||
|
const [isRefreshing, setIsRefreshing] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
mqttClient.connect();
|
||||||
|
return () => {
|
||||||
|
mqttClient.disconnect();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// Refresh handler
|
||||||
|
const onRefresh = () => {
|
||||||
|
setIsRefreshing(true);
|
||||||
|
// Here you can add your MQTT or state refresh logic
|
||||||
|
setTimeout(() => {
|
||||||
|
setIsRefreshing(false);
|
||||||
|
}, 1000); // Simulate network request and stop refreshing after 1 second
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetToDefault = () => {
|
||||||
|
setOtomasiSterilisasi(false);
|
||||||
|
setOtomasiRefill(false);
|
||||||
|
setDurasiSterilisasi(10); // Durasi default
|
||||||
|
setDurasiPostUV(10); // Durasi default
|
||||||
|
setIsSterilisasiRunning(false);
|
||||||
|
setIsRefillRunning(false);
|
||||||
|
|
||||||
|
// Kirim pengaturan default ke MQTT
|
||||||
|
mqttClient.publish('kontrol/otomasiSterilisasi', 'false');
|
||||||
|
mqttClient.publish('kontrol/otomasiRefill', 'false');
|
||||||
|
mqttClient.publish('kontrol/durasiSterilisasi', '10');
|
||||||
|
mqttClient.publish('kontrol/durasiPostUV', '10');
|
||||||
|
mqttClient.publish('kontrol/startSterilisasi', 'false');
|
||||||
|
mqttClient.publish('kontrol/startRefill', 'false');
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetRefill =()=>{
|
||||||
|
setIsRefillRunning(false);
|
||||||
|
setOtomasiRefill(false);
|
||||||
|
mqttClient.publish('kontrol/startRefill', 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggleSterilisasi = () => {
|
||||||
|
if (isSterilisasiRunning) {
|
||||||
|
// Menghentikan sterilisasi
|
||||||
|
mqttClient.publish('kontrol/startSterilisasi', 'false');
|
||||||
|
setIsSterilisasiRunning(false); // pastikan state diupdate setelah publish
|
||||||
|
resetToDefault(); // Reset pengaturan ke default
|
||||||
|
showToast('success', 'Sterilisasi Dihentikan', 'Proses sterilisasi telah dihentikan.');
|
||||||
|
} else {
|
||||||
|
if (otomasiSterilisasi) {
|
||||||
|
mqttClient.publish('kontrol/otomasiRefill', otomasiRefill ? 'true' : 'false');
|
||||||
|
mqttClient.publish('kontrol/otomasiSterilisasi', 'true');
|
||||||
|
mqttClient.publish('kontrol/durasiSterilisasi', String(durasiSterilisasi));
|
||||||
|
mqttClient.publish('kontrol/durasiPostUV', String(durasiPostUV));
|
||||||
|
mqttClient.publish('kontrol/startSterilisasi', 'true');
|
||||||
|
setIsSterilisasiRunning(true); // pastikan state diupdate setelah publish
|
||||||
|
showToast('success', 'Sterilisasi Dimulai', 'Proses sterilisasi otomatis dimulai.');
|
||||||
|
} else {
|
||||||
|
showToast('error', 'Peringatan', 'Harap aktifkan sterilisasi otomatis!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleRefill = () => {
|
||||||
|
if (isRefillRunning) {
|
||||||
|
mqttClient.publish('kontrol/startRefill', 'false');
|
||||||
|
setIsRefillRunning(false);
|
||||||
|
showToast('success', 'Refill Dihentikan', 'Proses refill telah dihentikan.');
|
||||||
|
|
||||||
|
// Reset to default after refill is stopped
|
||||||
|
resetRefill();
|
||||||
|
} else {
|
||||||
|
if (otomasiRefill) {
|
||||||
|
mqttClient.publish('kontrol/startRefill', 'true');
|
||||||
|
setIsRefillRunning(true);
|
||||||
|
showToast('success', 'Refill Dimulai', 'Proses refill otomatis dimulai.');
|
||||||
|
} else {
|
||||||
|
showToast('error', 'Peringatan', 'Harap aktifkan refill otomatis!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
type ToastType = 'success' | 'error' | 'info';
|
||||||
|
|
||||||
|
const showToast = (type: ToastType, title: string, message: string): void => {
|
||||||
|
Toast.show({
|
||||||
|
type,
|
||||||
|
text1: title,
|
||||||
|
text2: message,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView
|
||||||
|
style={styles.mainContainer}
|
||||||
|
refreshControl={<RefreshControl refreshing={isRefreshing} onRefresh={onRefresh} />}
|
||||||
|
>
|
||||||
|
<TouchableOpacity style={styles.settingItem}>
|
||||||
|
<Icon name="viruses" size={20} color="#181B56" />
|
||||||
|
<View style={styles.settingTextContainer}>
|
||||||
|
<Text style={styles.settingLabel}>Otomasi Sterilisasi</Text>
|
||||||
|
<Text style={styles.settingValue}>{otomasiSterilisasi ? 'Aktif' : 'Nonaktif'}</Text>
|
||||||
|
</View>
|
||||||
|
<Switch
|
||||||
|
value={otomasiSterilisasi}
|
||||||
|
onValueChange={setOtomasiSterilisasi}
|
||||||
|
trackColor={{ false: '#767577', true: '#181B56' }}
|
||||||
|
thumbColor={otomasiSterilisasi ? '#FFFFFF' : '#f4f3f4'}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
<TouchableOpacity style={styles.settingItem}>
|
||||||
|
<Icon name="faucet-drip" size={20} color="#181B56" />
|
||||||
|
<View style={styles.settingTextContainer}>
|
||||||
|
<Text style={styles.settingLabel}>Otomasi Refill</Text>
|
||||||
|
<Text style={styles.settingValue}>{otomasiRefill ? 'Aktif' : 'Nonaktif'}</Text>
|
||||||
|
</View>
|
||||||
|
<Switch
|
||||||
|
value={otomasiRefill}
|
||||||
|
onValueChange={setOtomasiRefill}
|
||||||
|
trackColor={{ false: '#767577', true: '#181B56' }}
|
||||||
|
thumbColor={otomasiRefill ? '#FFFFFF' : '#f4f3f4'}
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{/* Durasi Sterilisasi */}
|
||||||
|
<View style={styles.customPickerContainer}>
|
||||||
|
<Picker
|
||||||
|
selectedValue={durasiSterilisasi}
|
||||||
|
style={styles.customPicker}
|
||||||
|
onValueChange={value => setDurasiSterilisasi(value)}>
|
||||||
|
<Picker.Item label="10 Menit" value={10} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="15 Menit" value={15} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="20 Menit" value={20} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="30 Menit" value={30} style={styles.pickerItem} />
|
||||||
|
</Picker>
|
||||||
|
</View>
|
||||||
|
<View style={styles.controlContainer}>
|
||||||
|
<Icon name="stopwatch" size={20} color="#181B56" style={styles.iconLeft} />
|
||||||
|
<Text style={styles.controlLabel}>Durasi Sterilisasi (Menit)</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* Durasi Post UV */}
|
||||||
|
<View style={styles.customPickerContainer}>
|
||||||
|
<Picker
|
||||||
|
selectedValue={durasiPostUV}
|
||||||
|
style={styles.customPicker}
|
||||||
|
onValueChange={value => setDurasiPostUV(value)}>
|
||||||
|
<Picker.Item label="10 Menit" value={10} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="15 Menit" value={15} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="20 Menit" value={20} style={styles.pickerItem} />
|
||||||
|
<Picker.Item label="30 Menit" value={30} style={styles.pickerItem} />
|
||||||
|
</Picker>
|
||||||
|
</View>
|
||||||
|
<View style={styles.controlContainer}>
|
||||||
|
<Icon name="stopwatch" size={20} color="#181B56" style={styles.iconLeft} />
|
||||||
|
<Text style={styles.controlLabel}>Durasi Post UV (Menit)</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<TouchableOpacity
|
||||||
|
style={[styles.controlButton, isSterilisasiRunning ? styles.stopButton : styles.startButton]}
|
||||||
|
onPress={toggleSterilisasi}>
|
||||||
|
<Icon name={isSterilisasiRunning ? 'pause-circle' : 'play-circle'} size={24} color="#FFFFFF" style={styles.icon} />
|
||||||
|
<Text style={styles.controlButtonText}>
|
||||||
|
{isSterilisasiRunning ? 'Stop Sterilisasi' : 'Mulai Sterilisasi'}
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
<TouchableOpacity
|
||||||
|
style={[styles.controlButton, isRefillRunning ? styles.stopButton : styles.startButton]}
|
||||||
|
onPress={toggleRefill}>
|
||||||
|
<Icon name={isRefillRunning ? 'pause-circle' : 'play-circle'} size={24} color="#FFFFFF" style={styles.icon} />
|
||||||
|
<Text style={styles.controlButtonText}>
|
||||||
|
{isRefillRunning ? 'Stop Refill' : 'Mulai Refill'}
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
flex: 1,
|
||||||
|
paddingTop: 50,
|
||||||
|
padding: 20,
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
},
|
||||||
|
controlContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
controlLabel: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
},
|
||||||
|
customPickerContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
borderWidth: 0.5,
|
||||||
|
borderColor: '#181B56',
|
||||||
|
borderRadius: 20,
|
||||||
|
padding: 6,
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
customPicker: {
|
||||||
|
flex: 1,
|
||||||
|
color: '#181B56',
|
||||||
|
},
|
||||||
|
pickerItem: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
},
|
||||||
|
controlButton: {
|
||||||
|
padding: 15,
|
||||||
|
borderRadius: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
marginTop: 10,
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
startButton: {
|
||||||
|
backgroundColor: '#181B56',
|
||||||
|
},
|
||||||
|
stopButton: {
|
||||||
|
backgroundColor: '#c52d25',
|
||||||
|
},
|
||||||
|
controlButtonText: {
|
||||||
|
color: '#FFFFFF',
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
marginRight: 10,
|
||||||
|
},
|
||||||
|
iconLeft: {
|
||||||
|
marginRight: 10,
|
||||||
|
},
|
||||||
|
settingItem: {
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
padding: 15,
|
||||||
|
marginBottom: 15,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderWidth: 0.5,
|
||||||
|
},
|
||||||
|
settingTextContainer: {
|
||||||
|
flex: 1,
|
||||||
|
marginLeft: 10,
|
||||||
|
},
|
||||||
|
settingLabel: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
},
|
||||||
|
settingValue: {
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: '300',
|
||||||
|
color: '#181B56',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ControlScreen;
|
|
@ -0,0 +1,530 @@
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { View, Text, StyleSheet, TouchableOpacity, ScrollView, RefreshControl, Dimensions} from 'react-native';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
import MqttClient from '../services/MqttClient';
|
||||||
|
|
||||||
|
const { width, height } = Dimensions.get('window');
|
||||||
|
|
||||||
|
const MonitoringScreen: React.FC = () => {
|
||||||
|
const [relayStatus, setRelayStatus] = useState({
|
||||||
|
tank1: false,
|
||||||
|
tank2: false,
|
||||||
|
ozone: false,
|
||||||
|
tank3: false,
|
||||||
|
});
|
||||||
|
const [statusProses, setStatusProses] = useState('Menunggu Proses');
|
||||||
|
const [otomasiSterilisasi, setOtomasiSterilisasi] = useState(false);
|
||||||
|
const [otomasiRefill, setOtomasiRefill] = useState(false);
|
||||||
|
const [durasiSterilisasi, setDurasiSterilisasi] = useState(10);
|
||||||
|
const [durasiPostUV, setDurasiPostUV] = useState(10);
|
||||||
|
const [sensorData, setSensorData] = useState({
|
||||||
|
pH: 0,
|
||||||
|
kekeruhan: 0,
|
||||||
|
suhu: 0,
|
||||||
|
});
|
||||||
|
const [progress, setProgress] = useState(0);
|
||||||
|
const [isConnected, setIsConnected] = useState(false);
|
||||||
|
const [refreshing, setRefreshing] = useState(false);
|
||||||
|
|
||||||
|
let progressInterval: NodeJS.Timeout | null = null;
|
||||||
|
|
||||||
|
const startProgress = () => {
|
||||||
|
let elapsedTime = 0;
|
||||||
|
const totalTimeInSeconds = (durasiSterilisasi + durasiPostUV) * 60;
|
||||||
|
|
||||||
|
if (progressInterval) clearInterval(progressInterval);
|
||||||
|
|
||||||
|
progressInterval = setInterval(() => {
|
||||||
|
elapsedTime += 1;
|
||||||
|
const newProgress = Math.min(Math.round((elapsedTime / totalTimeInSeconds) * 100), 100);
|
||||||
|
setProgress(newProgress);
|
||||||
|
|
||||||
|
if (elapsedTime >= totalTimeInSeconds) {
|
||||||
|
clearInterval(progressInterval!);
|
||||||
|
setProgress(100);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
const stopProgress = () => {
|
||||||
|
if (progressInterval) {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
progressInterval = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onRefresh = () => {
|
||||||
|
setRefreshing(true);
|
||||||
|
stopProgress();
|
||||||
|
|
||||||
|
setRelayStatus({
|
||||||
|
tank1: false,
|
||||||
|
tank2: false,
|
||||||
|
ozone: false,
|
||||||
|
tank3: false,
|
||||||
|
});
|
||||||
|
setStatusProses('Menunggu Proses');
|
||||||
|
setOtomasiSterilisasi(false);
|
||||||
|
setOtomasiRefill(false);
|
||||||
|
setDurasiSterilisasi(10);
|
||||||
|
setDurasiPostUV(10);
|
||||||
|
setSensorData({
|
||||||
|
pH: 0,
|
||||||
|
kekeruhan: 0,
|
||||||
|
suhu: 0,
|
||||||
|
});
|
||||||
|
setProgress(0);
|
||||||
|
|
||||||
|
MqttClient.connect()
|
||||||
|
.then(() => {
|
||||||
|
setIsConnected(true);
|
||||||
|
subscribeTopics();
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
setIsConnected(false);
|
||||||
|
console.error('MQTT Connection Error: ', error);
|
||||||
|
});
|
||||||
|
|
||||||
|
setRefreshing(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const subscribeTopics = () => {
|
||||||
|
MqttClient.client.subscribe('status/relay');
|
||||||
|
MqttClient.client.subscribe('status/prosesSterilisasi');
|
||||||
|
MqttClient.client.subscribe('status/otomasiSterilisasi');
|
||||||
|
MqttClient.client.subscribe('status/otomasiRefill');
|
||||||
|
MqttClient.client.subscribe('status/durasiSterilisasi');
|
||||||
|
MqttClient.client.subscribe('status/durasiPostUV');
|
||||||
|
MqttClient.client.subscribe('sensor/pH');
|
||||||
|
MqttClient.client.subscribe('sensor/kekeruhan');
|
||||||
|
MqttClient.client.subscribe('sensor/suhu');
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
MqttClient.connect()
|
||||||
|
.then(() => {
|
||||||
|
setIsConnected(true);
|
||||||
|
subscribeTopics();
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
setIsConnected(false);
|
||||||
|
console.error('MQTT Connection Error: ', error);
|
||||||
|
});
|
||||||
|
|
||||||
|
MqttClient.setOnMessageReceived((topic: string, message: string) => {
|
||||||
|
switch (topic) {
|
||||||
|
case 'status/relay':
|
||||||
|
const relayState = JSON.parse(message);
|
||||||
|
setRelayStatus({
|
||||||
|
tank1: relayState.RELAY1,
|
||||||
|
tank2: relayState.RELAY2 || relayState.RELAY4,
|
||||||
|
ozone: relayState.RELAY3 || relayState.RELAY4,
|
||||||
|
tank3: relayState.RELAY5 || relayState.RELAY6,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'status/prosesSterilisasi':
|
||||||
|
if (message === 'mulai') {
|
||||||
|
setStatusProses('Proses Sterilisasi');
|
||||||
|
setProgress(0);
|
||||||
|
startProgress();
|
||||||
|
} else if (message === 'selesai') {
|
||||||
|
setStatusProses('Air Siap Pakai');
|
||||||
|
setProgress(100);
|
||||||
|
stopProgress();
|
||||||
|
} else {
|
||||||
|
setStatusProses('Menunggu Proses');
|
||||||
|
stopProgress();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'status/otomasiSterilisasi':
|
||||||
|
setOtomasiSterilisasi(message === 'true');
|
||||||
|
break;
|
||||||
|
case 'status/otomasiRefill':
|
||||||
|
setOtomasiRefill(message === 'true');
|
||||||
|
break;
|
||||||
|
case 'status/durasiSterilisasi':
|
||||||
|
setDurasiSterilisasi(parseInt(message, 10));
|
||||||
|
break;
|
||||||
|
case 'status/durasiPostUV':
|
||||||
|
setDurasiPostUV(parseInt(message, 10));
|
||||||
|
break;
|
||||||
|
case 'sensor/pH':
|
||||||
|
setSensorData(prev => ({ ...prev, pH: parseFloat(message) }));
|
||||||
|
break;
|
||||||
|
case 'sensor/kekeruhan':
|
||||||
|
setSensorData(prev => ({ ...prev, kekeruhan: parseFloat(message) }));
|
||||||
|
break;
|
||||||
|
case 'sensor/suhu':
|
||||||
|
setSensorData(prev => ({ ...prev, suhu: parseFloat(message) }));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
stopProgress();
|
||||||
|
MqttClient.disconnect();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView
|
||||||
|
style={styles.mainContainer}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
|
||||||
|
}>
|
||||||
|
{/* <View style={styles.mainContainer}> */}
|
||||||
|
<View style={styles.container}>
|
||||||
|
{/* Alamat IP */}
|
||||||
|
{/* <View style={styles.containerStatus}> */}
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.statusContainerr,
|
||||||
|
{backgroundColor: isConnected ? '#4CAF50' : '#F44336'},
|
||||||
|
]}>
|
||||||
|
<Text style={styles.statusText}>
|
||||||
|
{isConnected ? 'Online' : 'Offline'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
{/* </View> */}
|
||||||
|
<View style={styles.ipContainer}>
|
||||||
|
<Text style={styles.ipText}>Alamat IP Alat</Text>
|
||||||
|
<Text style={styles.ipAddress}>192.168.1.6</Text>
|
||||||
|
</View>
|
||||||
|
<Text style={styles.percentage}>{progress}%</Text>
|
||||||
|
|
||||||
|
{/* Tombol Relay */}
|
||||||
|
<View style={styles.buttonContainer}>
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.button,
|
||||||
|
relayStatus.tank1 ? styles.activeButton : {},
|
||||||
|
]}>
|
||||||
|
<Icon
|
||||||
|
name="glass-water-droplet"
|
||||||
|
size={24}
|
||||||
|
color={relayStatus.tank1 ? '#FFFFFF' : '#181B56'}
|
||||||
|
/>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
styles.buttonLabel,
|
||||||
|
{color: relayStatus.tank1 ? '#FFFFFF' : '#181B56'},
|
||||||
|
]}>
|
||||||
|
Tank 1
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.button,
|
||||||
|
relayStatus.tank2 ? styles.activeButton : {},
|
||||||
|
]}>
|
||||||
|
<Icon
|
||||||
|
name="glass-water-droplet"
|
||||||
|
size={24}
|
||||||
|
color={relayStatus.tank2 ? '#FFFFFF' : '#181B56'}
|
||||||
|
/>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
styles.buttonLabel,
|
||||||
|
{color: relayStatus.tank2 ? '#FFFFFF' : '#181B56'},
|
||||||
|
]}>
|
||||||
|
Tank 2
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.button,
|
||||||
|
relayStatus.ozone ? styles.activeButton : {},
|
||||||
|
]}>
|
||||||
|
<Icon
|
||||||
|
name="soap"
|
||||||
|
size={24}
|
||||||
|
color={relayStatus.ozone ? '#FFFFFF' : '#181B56'}
|
||||||
|
/>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
styles.buttonLabel,
|
||||||
|
{color: relayStatus.ozone ? '#FFFFFF' : '#181B56'},
|
||||||
|
]}>
|
||||||
|
Ozone
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.button,
|
||||||
|
relayStatus.tank3 ? styles.activeButton : {},
|
||||||
|
]}>
|
||||||
|
<Icon
|
||||||
|
name="glass-water-droplet"
|
||||||
|
size={24}
|
||||||
|
color={relayStatus.tank3 ? '#FFFFFF' : '#181B56'}
|
||||||
|
/>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
styles.buttonLabel,
|
||||||
|
{color: relayStatus.tank3 ? '#FFFFFF' : '#181B56'},
|
||||||
|
]}>
|
||||||
|
Tank 3
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
|
||||||
|
<View style={styles.statusContainer}>
|
||||||
|
<Text style={styles.status}>{statusProses}</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* Sensor */}
|
||||||
|
<View style={styles.sensorContainer}>
|
||||||
|
<View style={styles.sensorBox}>
|
||||||
|
<Text style={styles.sensorTitle}>pH Air</Text>
|
||||||
|
<Icon
|
||||||
|
name="water"
|
||||||
|
size={24}
|
||||||
|
color="#181B56"
|
||||||
|
style={styles.sensorIcon}
|
||||||
|
/>
|
||||||
|
<Text style={styles.sensorValue}>{sensorData.pH} pH</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.sensorBox}>
|
||||||
|
<Text style={styles.sensorTitle}>Keruh Air</Text>
|
||||||
|
<Icon
|
||||||
|
name="droplet"
|
||||||
|
size={24}
|
||||||
|
color="#181B56"
|
||||||
|
style={styles.sensorIcon}
|
||||||
|
/>
|
||||||
|
<Text style={styles.sensorValue}>{sensorData.kekeruhan} NTU</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.sensorBox}>
|
||||||
|
<Text style={styles.sensorTitle}>Suhu Air</Text>
|
||||||
|
<Icon
|
||||||
|
name="temperature-high"
|
||||||
|
size={24}
|
||||||
|
color="#181B56"
|
||||||
|
style={styles.sensorIcon}
|
||||||
|
/>
|
||||||
|
<Text style={styles.sensorValue}>{sensorData.suhu} °C</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* Otomasi */}
|
||||||
|
<View style={styles.automationContainer}>
|
||||||
|
<View style={styles.automationBox}>
|
||||||
|
<Text style={styles.automationTitle}>Otomasi Sterilisasi</Text>
|
||||||
|
<Text style={styles.automationValue}>
|
||||||
|
{otomasiSterilisasi ? 'Aktif' : 'Nonaktif'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.automationBox}>
|
||||||
|
<Text style={styles.automationTitle}>Otomasi Refill</Text>
|
||||||
|
<Text style={styles.automationValue}>
|
||||||
|
{otomasiRefill ? 'Aktif' : 'Nonaktif'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* Durasi */}
|
||||||
|
<View style={styles.durationContainer}>
|
||||||
|
<View style={styles.durationBox}>
|
||||||
|
<Text style={styles.durationTitle}>Sterilisasi UV</Text>
|
||||||
|
<Text style={styles.durationValue}>{durasiSterilisasi} Menit</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.durationBox}>
|
||||||
|
<Text style={styles.durationTitle}>Post UV</Text>
|
||||||
|
<Text style={styles.durationValue}>{durasiPostUV} Menit</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
{/* </View> */}
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
mainContainer: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
padding: 18,
|
||||||
|
},
|
||||||
|
container: {
|
||||||
|
backgroundColor: '#F9FAFC',
|
||||||
|
borderRadius: 20,
|
||||||
|
padding: 18,
|
||||||
|
width: '98%',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
statusContainerr: {
|
||||||
|
paddingVertical: 8,
|
||||||
|
borderRadius: 20,
|
||||||
|
width: '18%',
|
||||||
|
alignItems: 'center',
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Status text styling
|
||||||
|
statusText: {
|
||||||
|
fontSize: 10,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#FFFFFF',
|
||||||
|
},
|
||||||
|
|
||||||
|
// IP address styling
|
||||||
|
ipContainer: {
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
padding: 10,
|
||||||
|
borderRadius: 20,
|
||||||
|
marginBottom: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
ipText: {
|
||||||
|
fontSize: 14,
|
||||||
|
color: '#555',
|
||||||
|
fontWeight: '500',
|
||||||
|
},
|
||||||
|
ipAddress: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#000',
|
||||||
|
},
|
||||||
|
percentage: {
|
||||||
|
fontSize: 40,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
textAlign: 'center',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
buttonContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
paddingVertical: 20,
|
||||||
|
paddingHorizontal: 20,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderWidth: 0.5,
|
||||||
|
alignItems: 'center',
|
||||||
|
flex: 1,
|
||||||
|
marginHorizontal: 5,
|
||||||
|
},
|
||||||
|
activeButton: {
|
||||||
|
backgroundColor: '#181B56',
|
||||||
|
},
|
||||||
|
buttonText: {
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#FFFFFF',
|
||||||
|
},
|
||||||
|
buttonLabel: {
|
||||||
|
marginTop: 5, // Memberi jarak dengan ikon
|
||||||
|
fontSize: 10,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#181B56',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
|
||||||
|
status: {
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
statusContainer: {
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
padding: 20,
|
||||||
|
borderRadius: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
sensorContainer: {
|
||||||
|
width: '98%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
sensorBox: {
|
||||||
|
backgroundColor: '#F9FAFC',
|
||||||
|
padding: 10,
|
||||||
|
borderRadius: 20,
|
||||||
|
alignItems: 'center', // Untuk meratakan isi ke tengah
|
||||||
|
flex: 1,
|
||||||
|
marginHorizontal: 5,
|
||||||
|
},
|
||||||
|
sensorTitle: {
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
marginBottom: 5, // Jarak dengan icon
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
sensorIcon: {
|
||||||
|
marginBottom: 10, // Jarak dengan nilai sensor
|
||||||
|
},
|
||||||
|
sensorValue: {
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
|
||||||
|
automationContainer: {
|
||||||
|
width: '98%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
automationBox: {
|
||||||
|
borderWidth: 0.5,
|
||||||
|
padding: 10,
|
||||||
|
borderRadius: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
flex: 1,
|
||||||
|
marginHorizontal: 5,
|
||||||
|
},
|
||||||
|
automationTitle: {
|
||||||
|
fontSize: 11,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
marginBottom: 10,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
automationValue: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
},
|
||||||
|
durationContainer: {
|
||||||
|
borderRadius: 12,
|
||||||
|
width: '98%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
},
|
||||||
|
durationBox: {
|
||||||
|
backgroundColor: '#F9FAFC',
|
||||||
|
padding: 10,
|
||||||
|
borderRadius: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
flex: 1,
|
||||||
|
marginHorizontal: 5,
|
||||||
|
},
|
||||||
|
durationTitle: {
|
||||||
|
fontSize: 11,
|
||||||
|
fontWeight: '500',
|
||||||
|
color: '#555',
|
||||||
|
// marginBottom: 10,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
durationValue: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
export default MonitoringScreen;
|
|
@ -0,0 +1,177 @@
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import {
|
||||||
|
View,
|
||||||
|
Text,
|
||||||
|
StyleSheet,
|
||||||
|
FlatList,
|
||||||
|
TouchableOpacity,
|
||||||
|
Animated,
|
||||||
|
} from 'react-native';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
import { useNavigation } from '@react-navigation/native';
|
||||||
|
import firestore from '@react-native-firebase/firestore';
|
||||||
|
import { Swipeable } from 'react-native-gesture-handler';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||||
|
|
||||||
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
|
// Tipe data
|
||||||
|
type NotificationType = {
|
||||||
|
id: string;
|
||||||
|
type: string;
|
||||||
|
title: string;
|
||||||
|
message: string;
|
||||||
|
time: string;
|
||||||
|
icon: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const NotificationsScreen = () => {
|
||||||
|
const [notifications, setNotifications] = useState<NotificationType[]>([]);
|
||||||
|
const navigation = useNavigation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const unsubscribe = firestore()
|
||||||
|
.collection('notifications')
|
||||||
|
.orderBy('timestamp', 'desc')
|
||||||
|
.onSnapshot(snapshot => {
|
||||||
|
const data = snapshot.docs.map(doc => {
|
||||||
|
const notif = doc.data();
|
||||||
|
return {
|
||||||
|
id: doc.id,
|
||||||
|
type: notif.type,
|
||||||
|
title: notif.title,
|
||||||
|
message: notif.message,
|
||||||
|
time: dayjs(notif.timestamp?.toDate()).fromNow(),
|
||||||
|
icon: notif.icon,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
setNotifications(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => unsubscribe();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// Fungsi hapus notifikasi
|
||||||
|
const handleDelete = async (id: string) => {
|
||||||
|
try {
|
||||||
|
await firestore().collection('notifications').doc(id).delete();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Gagal menghapus notifikasi:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Komponen swipeable render kanan
|
||||||
|
const renderRightActions = (
|
||||||
|
progress: Animated.AnimatedInterpolation<string | number>,
|
||||||
|
dragX: Animated.AnimatedInterpolation<string | number>,
|
||||||
|
id: string,
|
||||||
|
) => {
|
||||||
|
return (
|
||||||
|
<TouchableOpacity
|
||||||
|
style={styles.deleteButton}
|
||||||
|
onPress={() => handleDelete(id)}
|
||||||
|
>
|
||||||
|
<Text style={styles.deleteText}>Hapus</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
{/* Tombol kembali */}
|
||||||
|
<TouchableOpacity style={styles.backButton} onPress={() => navigation.goBack()}>
|
||||||
|
<Icon name="arrow-left" size={24} color="#0F172A" />
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{/* Judul */}
|
||||||
|
<Text style={styles.title}>Notifikasi</Text>
|
||||||
|
|
||||||
|
{/* Daftar notifikasi */}
|
||||||
|
<FlatList
|
||||||
|
data={notifications}
|
||||||
|
keyExtractor={(item) => item.id}
|
||||||
|
renderItem={({ item }) => (
|
||||||
|
<Swipeable
|
||||||
|
renderRightActions={(progress, dragX) =>
|
||||||
|
renderRightActions(progress, dragX, item.id)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<View style={styles.notificationCard}>
|
||||||
|
<Icon name={item.icon} size={24} color="#0F172A" style={styles.icon} />
|
||||||
|
<View style={styles.textContainer}>
|
||||||
|
<Text style={styles.notificationTitle}>{item.title}</Text>
|
||||||
|
<Text style={styles.notificationMessage}>{item.message}</Text>
|
||||||
|
<Text style={styles.notificationTime}>{item.time}</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Swipeable>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
paddingTop: 50,
|
||||||
|
paddingHorizontal: 20,
|
||||||
|
},
|
||||||
|
backButton: {
|
||||||
|
position: 'absolute',
|
||||||
|
top: 15,
|
||||||
|
left: 15,
|
||||||
|
padding: 10,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 24,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
textAlign: 'center',
|
||||||
|
color: '#0F172A',
|
||||||
|
marginBottom: 20,
|
||||||
|
},
|
||||||
|
notificationCard: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: '#F1F5F9',
|
||||||
|
padding: 15,
|
||||||
|
borderRadius: 10,
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
marginRight: 15,
|
||||||
|
},
|
||||||
|
textContainer: {
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
notificationTitle: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#0F172A',
|
||||||
|
},
|
||||||
|
notificationMessage: {
|
||||||
|
fontSize: 14,
|
||||||
|
color: '#475569',
|
||||||
|
},
|
||||||
|
notificationTime: {
|
||||||
|
fontSize: 12,
|
||||||
|
color: '#94A3B8',
|
||||||
|
marginTop: 5,
|
||||||
|
},
|
||||||
|
deleteButton: {
|
||||||
|
backgroundColor: '#EF4444',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
width: 80,
|
||||||
|
borderRadius: 10,
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
deleteText: {
|
||||||
|
color: 'white',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default NotificationsScreen;
|
|
@ -0,0 +1,244 @@
|
||||||
|
import React, { useState } from 'react';
|
||||||
|
import {
|
||||||
|
View,
|
||||||
|
Text,
|
||||||
|
StyleSheet,
|
||||||
|
TouchableOpacity,
|
||||||
|
Modal,
|
||||||
|
TextInput,
|
||||||
|
ScrollView,
|
||||||
|
Pressable,
|
||||||
|
Alert,
|
||||||
|
} from 'react-native';
|
||||||
|
import Icon from 'react-native-vector-icons/FontAwesome6';
|
||||||
|
|
||||||
|
const SettingsScreen: React.FC = () => {
|
||||||
|
const [modalVisible, setModalVisible] = useState(false);
|
||||||
|
|
||||||
|
const [phMin, setPhMin] = useState('');
|
||||||
|
const [phMax, setPhMax] = useState('');
|
||||||
|
const [turbidityMin, setTurbidityMin] = useState('');
|
||||||
|
const [turbidityMax, setTurbidityMax] = useState('');
|
||||||
|
const [tempMin, setTempMin] = useState('');
|
||||||
|
const [tempMax, setTempMax] = useState('');
|
||||||
|
|
||||||
|
const saveThreshold = () => {
|
||||||
|
const thresholdData = {
|
||||||
|
ph: { min: phMin, max: phMax },
|
||||||
|
turbidity: { min: turbidityMin, max: turbidityMax },
|
||||||
|
temperature: { min: tempMin, max: tempMax },
|
||||||
|
};
|
||||||
|
console.log('Saved:', thresholdData);
|
||||||
|
setModalVisible(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleCalibrationPress = () => {
|
||||||
|
Alert.alert('Info', 'Fitur ini masih dalam pengembangan');
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text style={styles.header}>Settings</Text>
|
||||||
|
|
||||||
|
{/* Threshold Sensor */}
|
||||||
|
<TouchableOpacity style={styles.settingItem} onPress={() => setModalVisible(true)}>
|
||||||
|
<View style={styles.iconContainer}>
|
||||||
|
<Icon name="wind" size={20} color="#181B56" />
|
||||||
|
</View>
|
||||||
|
<View style={styles.settingTextContainer}>
|
||||||
|
<Text style={styles.settingLabel}>Threshold Sensor</Text>
|
||||||
|
</View>
|
||||||
|
<Icon name="chevron-right" size={20} color="#181B56" />
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{/* Kalibrasi Sensor */}
|
||||||
|
<TouchableOpacity style={styles.settingItem} onPress={handleCalibrationPress}>
|
||||||
|
<View style={styles.iconContainer}>
|
||||||
|
<Icon name="screwdriver-wrench" size={20} color="#181B56" />
|
||||||
|
</View>
|
||||||
|
<View style={styles.settingTextContainer}>
|
||||||
|
<Text style={styles.settingLabel}>Kalibrasi Sensor</Text>
|
||||||
|
</View>
|
||||||
|
<Icon name="chevron-right" size={20} color="#181B56" />
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{/* Modal Threshold */}
|
||||||
|
<Modal visible={modalVisible} animationType="slide" transparent>
|
||||||
|
<View style={styles.modalOverlay}>
|
||||||
|
<View style={styles.modalContainer}>
|
||||||
|
<ScrollView>
|
||||||
|
<Text style={styles.modalTitle}>Set Threshold</Text>
|
||||||
|
|
||||||
|
<Text style={styles.sectionTitle}>Sensor pH</Text>
|
||||||
|
<View style={styles.inputRow}>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Min"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={phMin}
|
||||||
|
onChangeText={setPhMin}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Max"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={phMax}
|
||||||
|
onChangeText={setPhMax}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<Text style={styles.sectionTitle}>Kekeruhan (NTU)</Text>
|
||||||
|
<View style={styles.inputRow}>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Min"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={turbidityMin}
|
||||||
|
onChangeText={setTurbidityMin}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Max"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={turbidityMax}
|
||||||
|
onChangeText={setTurbidityMax}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<Text style={styles.sectionTitle}>Suhu Air (°C)</Text>
|
||||||
|
<View style={styles.inputRow}>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Min"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={tempMin}
|
||||||
|
onChangeText={setTempMin}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Max"
|
||||||
|
keyboardType="numeric"
|
||||||
|
value={tempMax}
|
||||||
|
onChangeText={setTempMax}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.buttonRow}>
|
||||||
|
<Pressable style={styles.cancelButton} onPress={() => setModalVisible(false)}>
|
||||||
|
<Text style={styles.buttonText}>Batal</Text>
|
||||||
|
</Pressable>
|
||||||
|
<Pressable style={styles.saveButton} onPress={saveThreshold}>
|
||||||
|
<Text style={styles.buttonText}>Simpan</Text>
|
||||||
|
</Pressable>
|
||||||
|
</View>
|
||||||
|
</ScrollView>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Modal>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
padding: 20,
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
fontSize: 24,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
textAlign: 'center',
|
||||||
|
marginBottom: 30,
|
||||||
|
},
|
||||||
|
settingItem: {
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
padding: 12,
|
||||||
|
marginBottom: 15,
|
||||||
|
borderRadius: 20,
|
||||||
|
elevation: 2,
|
||||||
|
},
|
||||||
|
iconContainer: {
|
||||||
|
backgroundColor: '#F0F0F0',
|
||||||
|
padding: 12,
|
||||||
|
borderRadius: 12,
|
||||||
|
},
|
||||||
|
settingTextContainer: {
|
||||||
|
flex: 1,
|
||||||
|
marginLeft: 10,
|
||||||
|
},
|
||||||
|
settingLabel: {
|
||||||
|
fontSize: 16,
|
||||||
|
color: '#555',
|
||||||
|
fontWeight: '500',
|
||||||
|
},
|
||||||
|
modalOverlay: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#00000088',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
modalContainer: {
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
borderRadius: 20,
|
||||||
|
padding: 20,
|
||||||
|
width: '90%',
|
||||||
|
maxHeight: '90%',
|
||||||
|
},
|
||||||
|
modalTitle: {
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#181B56',
|
||||||
|
marginBottom: 20,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
sectionTitle: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: '600',
|
||||||
|
marginBottom: 8,
|
||||||
|
color: '#181B56',
|
||||||
|
marginTop: 10,
|
||||||
|
},
|
||||||
|
inputRow: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
gap: 10,
|
||||||
|
marginBottom: 12,
|
||||||
|
},
|
||||||
|
input: {
|
||||||
|
flex: 1,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '#ccc',
|
||||||
|
borderRadius: 10,
|
||||||
|
paddingHorizontal: 12,
|
||||||
|
paddingVertical: 8,
|
||||||
|
backgroundColor: '#f9f9f9',
|
||||||
|
},
|
||||||
|
buttonRow: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'flex-end',
|
||||||
|
marginTop: 20,
|
||||||
|
gap: 10,
|
||||||
|
},
|
||||||
|
cancelButton: {
|
||||||
|
backgroundColor: '#aaa',
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingVertical: 10,
|
||||||
|
borderRadius: 10,
|
||||||
|
},
|
||||||
|
saveButton: {
|
||||||
|
backgroundColor: '#181B56',
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingVertical: 10,
|
||||||
|
borderRadius: 10,
|
||||||
|
},
|
||||||
|
buttonText: {
|
||||||
|
color: '#fff',
|
||||||
|
fontWeight: '600',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default SettingsScreen;
|
|
@ -0,0 +1,89 @@
|
||||||
|
import { Client, Message } from 'paho-mqtt';
|
||||||
|
|
||||||
|
// Ganti dengan broker EMQX WebSocket URL
|
||||||
|
const broker = 'wss://broker.emqx.io:8084/mqtt'; // pakai WSS + port SSL
|
||||||
|
|
||||||
|
|
||||||
|
class MqttClient {
|
||||||
|
constructor() {
|
||||||
|
this.client = new Client(broker, 'clientId-' + Math.random().toString(16).substr(2, 8));
|
||||||
|
this.client.onMessageArrived = this.onMessageArrived.bind(this);
|
||||||
|
this.client.onConnectionLost = this.onConnectionLost.bind(this);
|
||||||
|
this.isConnected = false; // Track connection state
|
||||||
|
this.onMessageReceived = null; // Initialize onMessageReceived
|
||||||
|
}
|
||||||
|
|
||||||
|
setOnMessageReceived(handler) {
|
||||||
|
this.onMessageReceived = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the connect method return a Promise
|
||||||
|
connect() {
|
||||||
|
if (this.isConnected) {
|
||||||
|
return Promise.resolve(); // Resolve immediately if already connected
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const options = {
|
||||||
|
onSuccess: () => {
|
||||||
|
this.onConnect();
|
||||||
|
resolve(); // Resolve the Promise on successful connection
|
||||||
|
},
|
||||||
|
onFailure: (error) => {
|
||||||
|
this.onFailure(error);
|
||||||
|
reject(error); // Reject the Promise on failure
|
||||||
|
},
|
||||||
|
userName: '',
|
||||||
|
password: '',
|
||||||
|
useSSL: true, // WebSocket tidak perlu SSL di broker ini
|
||||||
|
};
|
||||||
|
this.client.connect(options);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onConnect() {
|
||||||
|
console.log('Connected to MQTT broker');
|
||||||
|
this.isConnected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
onFailure(error) {
|
||||||
|
console.error('Failed to connect:', error.errorMessage);
|
||||||
|
this.isConnected = false; // Reset connection state on failure
|
||||||
|
}
|
||||||
|
|
||||||
|
onConnectionLost(responseObject) {
|
||||||
|
if (responseObject.errorCode !== 0) {
|
||||||
|
console.error('Connection lost:', responseObject.errorMessage);
|
||||||
|
}
|
||||||
|
this.isConnected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMessageArrived(message) {
|
||||||
|
console.log('Message arrived:', message.payloadString);
|
||||||
|
if (this.onMessageReceived) {
|
||||||
|
this.onMessageReceived(message.destinationName, message.payloadString); // Notify the component
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publish(topic, message) {
|
||||||
|
if (this.isConnected) {
|
||||||
|
const mqttMessage = new Message(message);
|
||||||
|
mqttMessage.destinationName = topic;
|
||||||
|
this.client.send(mqttMessage);
|
||||||
|
} else {
|
||||||
|
console.error('Cannot publish, MQTT client is not connected');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
if (this.isConnected) {
|
||||||
|
this.client.disconnect();
|
||||||
|
console.log('Disconnected from MQTT broker');
|
||||||
|
this.isConnected = false;
|
||||||
|
} else {
|
||||||
|
console.warn('Cannot disconnect, MQTT client is not connected');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new MqttClient();
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"extends": "@react-native/typescript-config/tsconfig.json"
|
||||||
|
}
|