diff --git a/.DS_Store b/.DS_Store
index 50b6c093..1ea62397 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.gitea/workflows/test-flight-cd.yaml b/.gitea/workflows/test-flight-cd.yaml
new file mode 100644
index 00000000..abcad11b
--- /dev/null
+++ b/.gitea/workflows/test-flight-cd.yaml
@@ -0,0 +1,46 @@
+name: "Build Test Flight"
+on:
+ pull_request:
+ branches:
+ - test-flight
+
+jobs:
+ build:
+ runs-on: [macos-arm64]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Delete existing keychain if present
+ run: |
+ if security list-keychains | grep -q "signing_temp.keychain"; then
+ security delete-keychain signing_temp.keychain
+ fi
+
+ - name: Import code sign
+ uses: mso7nueh/import-codesign-certs@v1
+ env:
+ KEYCHAIN_PATH: ${{ runner.temp }}/signing_temp.keychain
+ with:
+ keychain-path: ${{ env.KEYCHAIN_PATH }}
+ p12-file-base64: ${{ secrets.CERTIFICATES_FILE_BASE64 }}
+ p12-password: ${{ secrets.CERTIFICATES_PASSWORD }}
+
+ - name: Download provisioning
+ uses: mso7nueh/apple-provisioning-profiles-downloader@v1.0.8
+ with:
+ profile-type: IOS_APP_STORE
+ bundle-id: com.eatvioapp.app
+ issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
+ api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
+ api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}
+
+ - run: ./Build-tf
+
+ - name: Upload to TestFlight
+ uses: mso7nueh/upload-testflight-build@master
+ with:
+ app-path: .build/Artifacts/EatvioApp.ipa/EatvioApp.ipa
+ issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
+ api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
+ api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}
\ No newline at end of file
diff --git a/Build-tf b/Build-tf
new file mode 100755
index 00000000..3f738689
--- /dev/null
+++ b/Build-tf
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+
+set -xeu
+set -o pipefail
+
+export LANG=en_US.UTF-8
+LANG=en_US.UTF-8
+
+function finish() {
+ if [[ -d "${RESULT_BUNDLE_PATH}" ]]; then
+ ditto -c -k --sequesterRsrc --keepParent "${RESULT_BUNDLE_PATH}" "${RESULT_BUNDLE_PATH}.zip"
+ rm -rf "${RESULT_BUNDLE_PATH}"
+ fi
+}
+
+trap finish EXIT
+
+SDK="${SDK:-iphoneos}"
+WORKSPACE="${WORKSPACE:-ios/Runner.xcworkspace}"
+SCHEME="${SCHEME:-Runner}"
+CONFIGURATION="${CONFIGURATION:-Release}"
+
+BUILD_DIR="${BUILD_DIR:-build}"
+ARTIFACT_PATH="${RESULT_PATH:-${BUILD_DIR}/Artifacts}"
+RESULT_BUNDLE_PATH="${ARTIFACT_PATH}/${SCHEME}.xcresult"
+ARCHIVE_PATH="${ARCHIVE_PATH:-${BUILD_DIR}/Archives/${SCHEME}.xcarchive}"
+DERIVED_DATA_PATH="${DERIVED_DATA_PATH:-${BUILD_DIR}/DerivedData}"
+CURRENT_PROJECT_VERSION="${BUILD_NUMBER:-0}"
+EXPORT_OPTIONS_FILE="Support/ExportOptions.plist"
+
+# Clean and prepare the build
+flutter clean
+flutter pub get
+
+cd ios
+rm -rf Pods Podfile.lock
+pod install --repo-update
+pod update || { echo "Pod update failed"; exit 1; }
+cd ..
+
+rm -rf "${RESULT_BUNDLE_PATH}" "${DERIVED_DATA_PATH}"
+mkdir -p "${ARTIFACT_PATH}"
+
+# Archive the build
+xcrun xcodebuild \
+ -workspace "${WORKSPACE}" \
+ -scheme "${SCHEME}" \
+ -configuration "${CONFIGURATION}" \
+ -sdk "${SDK}" \
+ -parallelizeTargets \
+ -showBuildTimingSummary \
+ -derivedDataPath "${DERIVED_DATA_PATH}" \
+ -archivePath "${ARCHIVE_PATH}" \
+ -resultBundlePath "${RESULT_BUNDLE_PATH}" \
+ -allowProvisioningUpdates \
+ CURRENT_PROJECT_VERSION="${CURRENT_PROJECT_VERSION}" \
+ archive || { echo "Xcode archive failed"; exit 1; }
+
+# Export the build to .ipa
+xcrun xcodebuild \
+ -exportArchive \
+ -exportOptionsPlist "${EXPORT_OPTIONS_FILE}" \
+ -archivePath "${ARCHIVE_PATH}" \
+ -exportPath "${ARTIFACT_PATH}/${SCHEME}.ipa" || { echo "Export to IPA failed"; exit 1; }
+
+# Zip the archive
+if [[ -d "${ARCHIVE_PATH}" ]]; then
+ ditto -c -k --sequesterRsrc --keepParent "${ARCHIVE_PATH}" "${ARTIFACT_PATH}/${SCHEME}.xcarchive.zip"
+else
+ echo "Archive directory not found, skipping zip."
+fi
\ No newline at end of file
diff --git a/Support/ExportOptions.plist b/Support/ExportOptions.plist
new file mode 100644
index 00000000..596a774a
--- /dev/null
+++ b/Support/ExportOptions.plist
@@ -0,0 +1,19 @@
+
+
+
+
+ provisioningProfiles
+
+ com.eatvioapp.app
+ CI CD Example Disctribution
+
+ signingCertificate
+ Apple Distribution: Team ITVIO, OOO
+ method
+ app-store
+ signingStyle
+ automatic
+ teamID
+ VL68C36HYS
+
+
\ No newline at end of file
diff --git a/android/.DS_Store b/android/.DS_Store
new file mode 100644
index 00000000..8db9f5e0
Binary files /dev/null and b/android/.DS_Store differ
diff --git a/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
index 37cd8131..04e382a4 100644
--- a/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Loga
_
]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ðú’ýØ2 �ë„ÖØ2^
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ¤¤þñÚ2 �ë„ÖØ2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build.json Ðú’ýØ2§ ‡ë„ÖØ2c
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build.json ¤¤þñÚ2§ ‡ë„ÖØ2c
a
-_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build_mini.json Ðú’ýØ2² ‰ë„ÖØ2P
+_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build_mini.json ¤¤þñÚ2² ‰ë„ÖØ2P
N
-L/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja Ðú’ýØ2œÃ çê„ÖØ2T
+L/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja ¤¤þñÚ2œÃ çê„ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja.txt Ðú’ýØ2Y
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja.txt ¤¤þñÚ2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build_file_index.txt Ðú’ýØ2
P ‰ë„ÖØ2Z
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build_file_index.txt ¤¤þñÚ2
P ‰ë„ÖØ2Z
X
-V/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json Ðú’ýØ2^
+V/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json ¤¤þñÚ2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json.bin Ðú’ýØ2 d
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json.bin ¤¤þñÚ2 d
b
-`/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/metadata_generation_command.txt Ðú’ýØ2
+`/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/metadata_generation_command.txt ¤¤þñÚ2
‚ ‰ë„ÖØ2W
U
-S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/prefab_config.json Ðú’ýØ2
( ‰ë„ÖØ2\
+S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/prefab_config.json ¤¤þñÚ2
( ‰ë„ÖØ2\
Z
-X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/symbol_folder_index.txt Ðú’ýØ2
O ‰ë„ÖØ2T
+X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/symbol_folder_index.txt ¤¤þñÚ2
O ‰ë„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt Ðú’ýØ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ¤¤þñÚ2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
index 88bd307b..997c9dcb 100644
--- a/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Logc
a
_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint б“ýØ2 ’ò„ÖØ2`
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ѤþñÚ2 ’ò„ÖØ2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build.json б“ýØ2« ”ò„ÖØ2e
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build.json ѤþñÚ2« ”ò„ÖØ2e
c
-a/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build_mini.json б“ýØ2¶ –ò„ÖØ2R
+a/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build_mini.json ѤþñÚ2¶ –ò„ÖØ2R
P
-N/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja б“ýØ2¨Ã þñ„ÖØ2V
+N/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja ѤþñÚ2¨Ã þñ„ÖØ2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja.txt б“ýØ2[
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja.txt ѤþñÚ2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build_file_index.txt б“ýØ2
P –ò„ÖØ2\
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build_file_index.txt ѤþñÚ2
P –ò„ÖØ2\
Z
-X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json б“ýØ2`
+X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json ѤþñÚ2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json.bin б“ýØ2 f
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json.bin ѤþñÚ2 f
d
-b/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/metadata_generation_command.txt б“ýØ2
+b/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/metadata_generation_command.txt ѤþñÚ2
Œ –ò„ÖØ2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/prefab_config.json б“ýØ2
( –ò„ÖØ2^
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/prefab_config.json ѤþñÚ2
( –ò„ÖØ2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/symbol_folder_index.txt б“ýØ2
Q –ò„ÖØ2T
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/symbol_folder_index.txt ѤþñÚ2
Q –ò„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt б“ýØ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ѤþñÚ2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
index 8d9c1f45..328a1cc5 100644
--- a/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log[
Y
W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ¢±“ýØ2 Üû„ÖØ2X
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ߤþñÚ2 Üû„ÖØ2X
V
-T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build.json ¢±“ýØ2› Ýû„ÖØ2]
+T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build.json ߤþñÚ2› Ýû„ÖØ2]
[
-Y/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build_mini.json ¢±“ýØ2¦ Þû„ÖØ2J
+Y/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build_mini.json ߤþñÚ2¦ Þû„ÖØ2J
H
-F/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja ¢±“ýØ2øÂ Ïû„ÖØ2N
+F/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja ߤþñÚ2øÂ Ïû„ÖØ2N
L
-J/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja.txt ¢±“ýØ2S
+J/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja.txt ߤþñÚ2S
Q
-O/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build_file_index.txt ¢±“ýØ2
P ßû„ÖØ2T
+O/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build_file_index.txt ߤþñÚ2
P ßû„ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json ¢±“ýØ2X
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json ߤþñÚ2X
V
-T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json.bin ¢±“ýØ2 ^
+T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json.bin ߤþñÚ2 ^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/metadata_generation_command.txt ¢±“ýØ2
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/metadata_generation_command.txt ߤþñÚ2
ä Þû„ÖØ2Q
O
-M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/prefab_config.json ¢±“ýØ2
( Þû„ÖØ2V
+M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/prefab_config.json ߤþñÚ2
( Þû„ÖØ2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/symbol_folder_index.txt ¢±“ýØ2
I ßû„ÖØ2T
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/symbol_folder_index.txt ߤþñÚ2
I ßû„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ¢±“ýØ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ߤþñÚ2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
index 7ac01c6f..d02753d8 100644
--- a/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log^
\
Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ó±“ýØ2 Î�…ÖØ2[
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint é¤þñÚ2 Î�…ÖØ2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build.json Ó±“ýØ2¡ Ð�…ÖØ2`
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build.json é¤þñÚ2¡ Ð�…ÖØ2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build_mini.json Ó±“ýØ2¬ Ò�…ÖØ2M
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build_mini.json é¤þñÚ2¬ Ò�…ÖØ2M
K
-I/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja Ó±“ýØ2ŠÃ »�…ÖØ2Q
+I/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja é¤þñÚ2ŠÃ »�…ÖØ2Q
O
-M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja.txt Ó±“ýØ2V
+M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja.txt é¤þñÚ2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build_file_index.txt Ó±“ýØ2
P Ô�…ÖØ2W
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build_file_index.txt é¤þñÚ2
P Ô�…ÖØ2W
U
-S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json Ó±“ýØ2[
+S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json é¤þñÚ2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json.bin Ó±“ýØ2 a
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json.bin é¤þñÚ2 a
_
-]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/metadata_generation_command.txt Ó±“ýØ2
+]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/metadata_generation_command.txt ê¤þñÚ2
ó Ó�…ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/prefab_config.json Ó±“ýØ2
( Ó�…ÖØ2Y
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/prefab_config.json ê¤þñÚ2
( Ó�…ÖØ2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/symbol_folder_index.txt Ó±“ýØ2
L Ó�…ÖØ2T
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/symbol_folder_index.txt ê¤þñÚ2
L Ó�…ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt Ó±“ýØ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ê¤þñÚ2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 7fbba8a2..8e714119 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -365,7 +365,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 49;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -383,7 +383,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.0.49;
+ MARKETING_VERSION = 1.0.48;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -514,7 +514,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 49;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -532,7 +532,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.0.49;
+ MARKETING_VERSION = 1.0.48;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -551,7 +551,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 49;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -569,7 +569,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.0.49;
+ MARKETING_VERSION = 1.0.48;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart
index 527e58d7..79228258 100644
--- a/lib/core/app_router.dart
+++ b/lib/core/app_router.dart
@@ -68,16 +68,8 @@ class AppRouter {
name: 'authScreen',
builder: (context, state) => const AuthScreen(),
routes: [
- GoRoute(
- path: 'webView-registration-screen',
- name: 'webViewRegistrationScreen',
- builder: (context, state) => const WebViewRegistrationScreen(),
- ),
- GoRoute(
- path: 'registration-screen',
- name: 'registrationScreen',
- builder: (context, state) => const RegistrationScreen(),
- ),
+ GoRoute(path: 'webView-registration-screen', name: 'webViewRegistrationScreen', builder: (context, state) => const WebViewRegistrationScreen()),
+ GoRoute(path: 'registration-screen', name: 'registrationScreen', builder: (context, state) => const RegistrationScreen()),
],
),
ShellRoute(
@@ -85,10 +77,7 @@ class AppRouter {
return BlocBuilder(
builder: (BuildContext context, ProfileAvatarState state) {
if (state is ProfileAvatarStateLoaded) {
- return BottomNavigationBarWidget(
- child: child,
- profileModel: state.profile,
- );
+ return BottomNavigationBarWidget(child: child, profileModel: state.profile);
}
return SizedBox.shrink();
},
@@ -106,44 +95,25 @@ class AppRouter {
return NoTransitionPage(child: ProfileScreen());
},
),
- GoRoute(
- path: '/feed-screen',
- name: 'feedScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: FeedScreen()),
- ),
- GoRoute(
- path: '/diary-screen',
- name: 'diaryScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: DiaryScreen()),
- ),
- GoRoute(
- path: '/consultations-screen',
- name: 'consultationsScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: ConsultationsScreen()),
- ),
- GoRoute(
- path: '/chat-select-screen',
- name: 'chatSelectScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: ChatsScreen()),
- ),
- GoRoute(
- path: '/notifications-screen',
- name: 'notificationsScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: NotificationsScreen()),
- ),
+ GoRoute(path: '/feed-screen', name: 'feedScreen', pageBuilder: (context, state) => NoTransitionPage(child: FeedScreen())),
+ GoRoute(path: '/diary-screen', name: 'diaryScreen', pageBuilder: (context, state) => NoTransitionPage(child: DiaryScreen())),
+ GoRoute(path: '/consultations-screen', name: 'consultationsScreen', pageBuilder: (context, state) => NoTransitionPage(child: ConsultationsScreen())),
+ GoRoute(path: '/chat-select-screen', name: 'chatSelectScreen', pageBuilder: (context, state) => NoTransitionPage(child: ChatsScreen())),
+ GoRoute(path: '/notifications-screen', name: 'notificationsScreen', pageBuilder: (context, state) => NoTransitionPage(child: NotificationsScreen())),
GoRoute(
path: '/menu-screen',
name: 'menuScreen',
- pageBuilder: (context, state) => NoTransitionPage(
- child: BlocBuilder(
- builder: (BuildContext context, ProfileAvatarState state) {
- if (state is ProfileAvatarStateLoaded) {
- return MenuScreen(profileModel: state.profile);
- }
- return SizedBox.shrink();
- },
- ),
- ),
+ pageBuilder:
+ (context, state) => NoTransitionPage(
+ child: BlocBuilder(
+ builder: (BuildContext context, ProfileAvatarState state) {
+ if (state is ProfileAvatarStateLoaded) {
+ return MenuScreen(profileModel: state.profile);
+ }
+ return SizedBox.shrink();
+ },
+ ),
+ ),
),
],
),
@@ -167,85 +137,46 @@ class AppRouter {
name: 'aboutPlanScreen',
builder: (context, state) {
final data = state.extra as Map;
- return AboutPlanScreen(
- plan: data['plan'] as PlanModel,
- index: data['index'] as int?,
- navigateToComments: data['navigateToComments'] as bool,
- );
+ return AboutPlanScreen(plan: data['plan'] as PlanModel, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
},
),
- GoRoute(
- path: '/glossary-screen',
- name: 'glossaryScreen',
- builder: (context, state) => GlossaryScreen(),
- ),
+ GoRoute(path: '/glossary-screen', name: 'glossaryScreen', builder: (context, state) => GlossaryScreen()),
GoRoute(
path: '/about-recipes-screen',
name: 'aboutRecipesScreen',
builder: (context, state) {
final data = state.extra as Map;
- return AboutRecipeScreen(
- recipe: data['recipe'] as Recipe,
- index: data['index'] as int?,
- navigateToComments: data['navigateToComments'] as bool,
- );
+ return AboutRecipeScreen(recipe: data['recipe'] as Recipe, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
},
),
- GoRoute(
- path: RecipeCreateScreen.path,
- name: RecipeCreateScreen.name,
- builder: (context, state) => RecipeCreateScreen(),
- ),
- GoRoute(
- path: '/profile-screen',
- name: 'profileScreen',
- builder: (context, state) => ProfileScreen(
- author: state.extra as Author,
- ),
- ),
+ GoRoute(path: RecipeCreateScreen.path, name: RecipeCreateScreen.name, builder: (context, state) => RecipeCreateScreen()),
+ GoRoute(path: '/profile-screen', name: 'profileScreen', builder: (context, state) => ProfileScreen(author: state.extra as Author)),
GoRoute(
path: '/subs-screen/:slug',
name: 'subsScreen',
- builder: (context, state) => SubsScreen(
- slug: state.pathParameters['slug']!,
- subType: state.extra as SubType,
- ),
+ builder: (context, state) => SubsScreen(slug: state.pathParameters['slug']!, subType: state.extra as SubType),
),
GoRoute(
path: '/about-diet-screen',
name: 'aboutDietScreen',
builder: (context, state) {
final data = state.extra as Map;
- return AboutDietScreen(
- diet: data['diet'] as Diet,
- index: data['index'] as int?,
- navigateToComments: data['navigateToComments'] as bool,
- );
+ return AboutDietScreen(diet: data['diet'] as Diet, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
},
),
GoRoute(
path: '/blog-post-create-screen',
name: 'blogPostCreateScreen',
- builder: (context, state) => BlogPostCreateScreen(
- feedBlogPostModel: state.extra != null ? state.extra as FeedBlogPostModel : null,
- ),
- ),
- GoRoute(
- path: '/blog-post-screen',
- name: 'blogPostScreen',
- builder: (context, state) => BlogPostScreen(
- blogPost: state.extra as FeedBlogPostModel,
- ),
+ builder: (context, state) => BlogPostCreateScreen(feedBlogPostModel: state.extra != null ? state.extra as FeedBlogPostModel : null),
),
+ GoRoute(path: '/blog-post-screen', name: 'blogPostScreen', builder: (context, state) => BlogPostScreen(blogPost: state.extra as FeedBlogPostModel)),
GoRoute(
path: '/chat-screen',
name: 'chatScreen',
builder: (context, state) {
- final data = state.extra as Map;
+ final data = state.extra as Map;
final chatId = data['chatId'] as String;
- return ChatScreen(
- chatId: chatId,
- );
+ return ChatScreen(chatId: chatId);
},
),
GoRoute(
@@ -256,81 +187,44 @@ class AppRouter {
GoRoute(
path: 'general-info-screen',
name: 'generalInfoScreen',
- builder: (context, state) => GeneralInfoScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => GeneralInfoScreen(settingsEntity: state.extra as SettingsEntity),
),
GoRoute(
path: 'other-info-screen',
name: 'otherInfoScreen',
- builder: (context, state) => OtherInfoScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => OtherInfoScreen(settingsEntity: state.extra as SettingsEntity),
),
GoRoute(
path: 'physical-activity-screen',
name: 'physicalActivityScreen',
- builder: (context, state) => PhysicalActivityScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => PhysicalActivityScreen(settingsEntity: state.extra as SettingsEntity),
),
GoRoute(
path: 'physical-form-screen',
name: 'physicalFormScreen',
- builder: (context, state) => PhysicalFormScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
- ),
- GoRoute(
- path: 'pressure-screen',
- name: 'pressureScreen',
- builder: (context, state) => PressureScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => PhysicalFormScreen(settingsEntity: state.extra as SettingsEntity),
),
+ GoRoute(path: 'pressure-screen', name: 'pressureScreen', builder: (context, state) => PressureScreen(settingsEntity: state.extra as SettingsEntity)),
GoRoute(
path: 'change-password-screen',
name: 'changePasswordScreen',
- builder: (context, state) => ChangePasswordScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => ChangePasswordScreen(settingsEntity: state.extra as SettingsEntity),
),
GoRoute(
path: 'change-email-screen',
name: 'changeEmailScreen',
- builder: (context, state) => ChangeEmailScreen(
- settingsEntity: state.extra as SettingsEntity,
- ),
+ builder: (context, state) => ChangeEmailScreen(settingsEntity: state.extra as SettingsEntity),
),
],
),
- GoRoute(
- path: '/become-consultant-screen',
- name: 'becomeConsultantScreen',
- builder: (context, state) => BecomeConsultantScreen(),
- ),
- GoRoute(
- path: '/stepper-become-consultant-screen',
- name: 'stepperBecomeConsultantScreen',
- builder: (context, state) => StepperBecomeConsultantScreen(),
- ),
- GoRoute(
- path: '/calendar-screen',
- name: 'calendarScreen',
- builder: (context, state) => CalendarScreen(),
- ),
- GoRoute(
- path: '/support-screen',
- name: 'supportScreen',
- builder: (context, state) => SupportScreen(),
- ),
+ GoRoute(path: '/become-consultant-screen', name: 'becomeConsultantScreen', builder: (context, state) => BecomeConsultantScreen()),
+ GoRoute(path: '/stepper-become-consultant-screen', name: 'stepperBecomeConsultantScreen', builder: (context, state) => StepperBecomeConsultantScreen()),
+ GoRoute(path: '/calendar-screen', name: 'calendarScreen', builder: (context, state) => CalendarScreen()),
+ GoRoute(path: '/support-screen', name: 'supportScreen', builder: (context, state) => SupportScreen()),
GoRoute(
path: '/photo-view-screen/:index',
name: 'photoViewScreen',
- builder: (context, state) => PhotoViewScreen(
- imageUrls: state.extra as List,
- index: int.parse(state.pathParameters['index']!),
- ),
+ builder: (context, state) => PhotoViewScreen(imageUrls: state.extra as List, index: int.parse(state.pathParameters['index']!)),
),
GoRoute(
path: CreateDietScreen.path,
@@ -345,48 +239,16 @@ class AppRouter {
name: DietPreviewScreen.name,
builder: (context, state) {
final data = state.extra as Diet;
- return DietPreviewScreen(
- diet: data,
- );
+ return DietPreviewScreen(diet: data);
},
),
- GoRoute(
- path: CreatePlanScreen.path,
- name: CreatePlanScreen.name,
- builder: (context, state) => CreatePlanScreen(),
- ),
- GoRoute(
- path: MyDietsScreen.path,
- name: MyDietsScreen.name,
- builder: (context, state) => MyDietsScreen(),
- ),
- GoRoute(
- path: MyPlansScreen.path,
- name: MyPlansScreen.name,
- builder: (context, state) => MyPlansScreen(),
- ),
- GoRoute(
- path: UserDetailsScreen.path,
- name: UserDetailsScreen.name,
- builder: (context, state) => UserDetailsScreen(
- slug: state.extra as String,
- ),
- ),
- GoRoute(
- path: DevToolsScreen.path,
- name: DevToolsScreen.name,
- builder: (context, state) => DevToolsScreen(),
- ),
- GoRoute(
- path: ConsultantRatingScreen.path,
- name: ConsultantRatingScreen.name,
- builder: (context, state) => ConsultantRatingScreen(),
- ),
- GoRoute(
- path: InfoByOrderScreen.path,
- name: InfoByOrderScreen.name,
- builder: (context, state) => InfoByOrderScreen(),
- ),
+ GoRoute(path: CreatePlanScreen.path, name: CreatePlanScreen.name, builder: (context, state) => CreatePlanScreen()),
+ GoRoute(path: MyDietsScreen.path, name: MyDietsScreen.name, builder: (context, state) => MyDietsScreen()),
+ GoRoute(path: MyPlansScreen.path, name: MyPlansScreen.name, builder: (context, state) => MyPlansScreen()),
+ GoRoute(path: UserDetailsScreen.path, name: UserDetailsScreen.name, builder: (context, state) => UserDetailsScreen(slug: state.extra as String)),
+ GoRoute(path: DevToolsScreen.path, name: DevToolsScreen.name, builder: (context, state) => DevToolsScreen()),
+ GoRoute(path: ConsultantRatingScreen.path, name: ConsultantRatingScreen.name, builder: (context, state) => ConsultantRatingScreen()),
+ GoRoute(path: InfoByOrderScreen.path, name: InfoByOrderScreen.name, builder: (context, state) => InfoByOrderScreen()),
],
);
}
diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
index 637a2a56..09d0d9f5 100644
--- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart
+++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
@@ -24,10 +24,7 @@ import 'package:share_plus/share_plus.dart';
class BlogPostScreen extends StatefulWidget {
final FeedBlogPostModel blogPost;
- BlogPostScreen({
- super.key,
- required this.blogPost,
- });
+ BlogPostScreen({super.key, required this.blogPost});
@override
State createState() => _BlogPostScreenState();
@@ -50,12 +47,7 @@ class _BlogPostScreenState extends State {
@override
Widget build(BuildContext context) {
return BlocProvider(
- create: (BuildContext context) => commentsCubit
- ..getComments(
- widget.blogPost.id.toString(),
- CommentSourceType.blogPost,
- true,
- ),
+ create: (BuildContext context) => commentsCubit..getComments(widget.blogPost.id.toString(), CommentSourceType.blogPost, true),
child: BlocConsumer(
listener: (BuildContext context, CommentsState state) {
if (state is CommentsStateLoaded) {
@@ -69,14 +61,7 @@ class _BlogPostScreenState extends State {
resizeToAvoidBottomInset: true,
bottomSheet: Container(
padding: EdgeInsets.symmetric(vertical: 12) + (Platform.isIOS ? const EdgeInsets.only(bottom: 16) : EdgeInsets.zero),
- decoration: BoxDecoration(
- color: Colors.white,
- border: Border(
- top: BorderSide(
- color: Colors.black.withValues(alpha: 0.1),
- ),
- ),
- ),
+ decoration: BoxDecoration(color: Colors.white, border: Border(top: BorderSide(color: Colors.black.withValues(alpha: 0.1)))),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@@ -91,17 +76,10 @@ class _BlogPostScreenState extends State {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Container(
- decoration: BoxDecoration(
- color: appTheme.blueA400,
- shape: BoxShape.circle,
- ),
+ decoration: BoxDecoration(color: appTheme.blueA400, shape: BoxShape.circle),
height: 32,
width: 32,
- child: Icon(
- Icons.close_rounded,
- size: 18,
- color: Colors.white,
- ),
+ child: Icon(Icons.close_rounded, size: 18, color: Colors.white),
),
),
if (replyId != null) SizedBox(width: 8),
@@ -115,44 +93,16 @@ class _BlogPostScreenState extends State {
maxLines: 5,
minLines: 1,
keyboardType: TextInputType.multiline,
- style: TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w400,
- color: Colors.black,
- height: 1,
- ),
+ style: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
decoration: InputDecoration(
isDense: true,
contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
hintText: 'Комментарий',
- hintStyle: TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w400,
- height: 1,
- color: Color(0xFFAEAEB2),
- ),
+ hintStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
filled: true,
- border: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
- enabledBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
- focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
+ border: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
+ enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
+ focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
),
),
),
@@ -175,17 +125,10 @@ class _BlogPostScreenState extends State {
}
},
child: Container(
- decoration: BoxDecoration(
- color: textEditingController.text.length > 2 ? appTheme.blueA400 : Colors.grey,
- shape: BoxShape.circle,
- ),
+ decoration: BoxDecoration(color: textEditingController.text.length > 2 ? appTheme.blueA400 : Colors.grey, shape: BoxShape.circle),
height: 32,
width: 32,
- child: Icon(
- Icons.send_rounded,
- size: 18,
- color: Colors.white,
- ),
+ child: Icon(Icons.send_rounded, size: 18, color: Colors.white),
),
),
],
@@ -206,39 +149,26 @@ class _BlogPostScreenState extends State {
Navigator.of(context).pop();
}
if (value == 'edit') {
- GoRouter.of(context).replaceNamed(
- 'blogPostCreateScreen',
- extra: widget.blogPost,
- );
+ GoRouter.of(context).replaceNamed('blogPostCreateScreen', extra: widget.blogPost);
}
},
- itemBuilder: (context) => [
- if (widget.blogPost.author.authorIsMe)
- PopupMenuItem(
- value: 'edit',
- child: Text('Редактировать'),
- ),
- if (widget.blogPost.author.authorIsMe)
- PopupMenuItem(
- value: 'delete',
- child: Text('Удалить'),
- ),
- if (!widget.blogPost.author.authorIsMe)
- PopupMenuItem(
- value: 'report',
- child: Text('Пожаловать��'),
- onTap: () {
- showModalBottomSheet(
- context: context,
- isScrollControlled: true,
- builder: (context) => ComplainingBottomSheet(
- complainedContentType: ComplainedContent.posts,
- id: widget.blogPost.id,
- ),
- );
- },
- ),
- ],
+ itemBuilder:
+ (context) => [
+ if (widget.blogPost.author.authorIsMe) PopupMenuItem(value: 'edit', child: Text('Редактировать')),
+ if (widget.blogPost.author.authorIsMe) PopupMenuItem(value: 'delete', child: Text('Удалить')),
+ if (!widget.blogPost.author.authorIsMe)
+ PopupMenuItem(
+ value: 'report',
+ child: Text('Пожаловать��'),
+ onTap: () {
+ showModalBottomSheet(
+ context: context,
+ isScrollControlled: true,
+ builder: (context) => ComplainingBottomSheet(complainedContentType: ComplainedContent.posts, id: widget.blogPost.id),
+ );
+ },
+ ),
+ ],
),
],
),
@@ -255,32 +185,19 @@ class _BlogPostScreenState extends State {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
- CircleAvatar(
- radius: 16,
- backgroundImage: NetworkImage(widget.blogPost.author.authorProfileIcon),
- ),
+ CircleAvatar(radius: 16, backgroundImage: NetworkImage(widget.blogPost.author.authorProfileIcon)),
SizedBox(width: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.blogPost.author.authorName,
- style: TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w400,
- height: 1,
- ),
+ style: TextStyle(color: Colors.black, fontSize: 14, fontWeight: FontWeight.w400, height: 1),
),
SizedBox(height: 2),
Text(
widget.blogPost.createdAt.format('dd MMMM', 'ru'),
- style: TextStyle(
- color: Colors.grey.shade600,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1,
- ),
+ style: TextStyle(color: Colors.grey.shade600, fontSize: 12, fontWeight: FontWeight.w400, height: 1),
),
],
),
@@ -291,19 +208,10 @@ class _BlogPostScreenState extends State {
if (widget.blogPost.description.isNotEmpty)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
- child: Html(
- data: widget.blogPost.description,
- style: {
- "*": Style(
- color: Colors.black87,
- ),
- },
- ),
+ child: Html(data: widget.blogPost.description, style: {"*": Style(color: Colors.black87)}),
),
SizedBox(height: 8),
- CachedNetworkImage(
- imageUrl: baseUrl + '/storage/' + (widget.blogPost.image),
- ),
+ CachedNetworkImage(imageUrl: baseUrl + '/storage/' + (widget.blogPost.image)),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
@@ -331,38 +239,22 @@ class _BlogPostScreenState extends State {
onTap: () {
final box = context.findRenderObject() as RenderBox?;
Share.shareUri(
- Uri.parse(
- baseUrl + '/ru/blog_post/' + widget.blogPost.id.toString(),
- ),
+ Uri.parse(baseUrl + '/ru/blog_post/' + widget.blogPost.id.toString()),
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
},
),
Spacer(),
- Icon(
- Icons.visibility_rounded,
- size: 16,
- color: appTheme.gray500,
- ),
+ Icon(Icons.visibility_rounded, size: 16, color: appTheme.gray500),
SizedBox(width: 4),
- Text(
- widget.blogPost.totalViews.toString(),
- style: TextStyle(
- fontSize: 12,
- color: appTheme.gray500,
- fontWeight: FontWeight.w400,
- ),
- ),
+ Text(widget.blogPost.totalViews.toString(), style: TextStyle(fontSize: 12, color: appTheme.gray500, fontWeight: FontWeight.w400)),
],
),
),
Container(
width: MediaQuery.of(context).size.width - 32,
height: 0.4,
- decoration: BoxDecoration(
- color: Colors.black.withValues(alpha: 0.2),
- borderRadius: BorderRadius.circular(16),
- ),
+ decoration: BoxDecoration(color: Colors.black.withValues(alpha: 0.2), borderRadius: BorderRadius.circular(16)),
),
SizedBox(height: 8),
Container(
@@ -370,22 +262,13 @@ class _BlogPostScreenState extends State {
alignment: Alignment.centerLeft,
child: Text(
widget.blogPost.totalComments.toString() + ' КОММЕ�Т�РИЕВ',
- style: TextStyle(
- fontSize: 12,
- color: appTheme.gray500,
- fontWeight: FontWeight.w400,
- ),
+ style: TextStyle(fontSize: 12, color: appTheme.gray500, fontWeight: FontWeight.w400),
),
),
SizedBox(height: 16),
if (state is CommentsStateLoading) const Loader(),
if (state is CommentsStateLoaded)
- CommentsWidget(
- id: widget.blogPost.id.toString(),
- commentSourceType: CommentSourceType.blogPost,
- comment: state.comment,
- replyId: replyId,
- ),
+ CommentsWidget(id: widget.blogPost.id.toString(), commentSourceType: CommentSourceType.blogPost, comment: state.comment, replyId: replyId),
],
),
),
@@ -401,28 +284,14 @@ class _BlogPostScreenState extends State {
borderRadius: BorderRadius.circular(16),
child: Ink(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 4),
- decoration: BoxDecoration(
- color: backgroundColor ?? appTheme.gray100,
- borderRadius: BorderRadius.circular(16),
- ),
+ decoration: BoxDecoration(color: backgroundColor ?? appTheme.gray100, borderRadius: BorderRadius.circular(16)),
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
- Icon(
- icon,
- size: 20,
- color: iconColor ?? appTheme.gray600,
- ),
+ Icon(icon, size: 20, color: iconColor ?? appTheme.gray600),
if (text != null) SizedBox(width: 8),
- if (text != null)
- Text(
- text,
- style: TextStyle(
- color: textColor ?? appTheme.gray600,
- fontWeight: FontWeight.w500,
- ),
- ),
+ if (text != null) Text(text, style: TextStyle(color: textColor ?? appTheme.gray600, fontWeight: FontWeight.w500)),
],
),
),
diff --git a/lib/features/consultations/presentation/pages/info_by_order_screen.dart b/lib/features/consultations/presentation/pages/info_by_order_screen.dart
index ad4e48ca..a64879c8 100644
--- a/lib/features/consultations/presentation/pages/info_by_order_screen.dart
+++ b/lib/features/consultations/presentation/pages/info_by_order_screen.dart
@@ -1,26 +1,155 @@
-import 'package:eatvio_app/core/app_colors.dart';
-import 'package:eatvio_app/features/diets/presentation/widgets/author_card.dart';
-import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
-import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
-class InfoByOrderScreen extends StatelessWidget {
+class InfoByOrderScreen extends StatefulWidget {
static const name = 'infoByOrderScreen';
static const path = '/info-by-order-screen';
const InfoByOrderScreen({super.key});
@override
- Widget build(BuildContext context) {
- final s = S.of(context);
+ State createState() => _InfoByOrderScreenState();
+}
+class _InfoByOrderScreenState extends State {
+ bool _isHelpExpanded = false;
+
+ @override
+ Widget build(BuildContext context) {
return Scaffold(
- backgroundColor: AppColors.scaffoldBackgroundColor,
- appBar: AppBar(
- title: Text(s.infoAboutOrder),
- shape: RoundedRectangleBorder(borderRadius: BorderRadius.vertical(bottom: Radius.circular(12))),
+ appBar: AppBar(title: Text("Информаци� о заказе"), leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: () {})),
+ body: ListView(
+ padding: EdgeInsets.all(16.0),
+ children: [
+ _buildProfileSection(),
+ SizedBox(height: 10),
+ _buildOrderStatus(),
+ SizedBox(height: 20),
+ _buildPlanDetails(),
+ SizedBox(height: 20),
+ _buildOptionDetails(),
+ SizedBox(height: 20),
+ _buildOrderProgress(),
+ SizedBox(height: 20),
+ _buildHelpSection(),
+ SizedBox(height: 20),
+ _buildCancelButton(),
+ ],
),
- body: AuthorCard(author: Author(authorSlug: 'authorSlug', authorName: 'authorName', authorProfileIcon: '', authorIsMe: false), title: 'asdasd'),
+ );
+ }
+
+ Widget _buildProfileSection() {
+ return Row(
+ children: [
+ CircleAvatar(
+ radius: 30,
+ backgroundImage: AssetImage('assets/profile.jpg'), // Замените на реальный путь
+ ),
+ SizedBox(width: 10),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text("Дмитрий Коваль", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
+ Text("Кон�ультант 128-й в рейтинге", style: TextStyle(color: Colors.grey)),
+ ],
+ ),
+ ],
+ );
+ }
+
+ Widget _buildOrderStatus() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text("Стату� заказа", style: TextStyle(fontWeight: FontWeight.bold)),
+ Chip(label: Text("Заказ оплачен", style: TextStyle(color: Colors.white)), backgroundColor: Colors.green),
+ ],
+ ),
+ Text("Сумма заказа: 2500₽"),
+ Text("Врем� выполнени� плана: 7 дней"),
+ ],
+ );
+ }
+
+ Widget _buildPlanDetails() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text("�азвание плана", style: TextStyle(fontWeight: FontWeight.bold)),
+ Text("В мире, где технологии �танов�т�� в�е более..."),
+ SizedBox(height: 10),
+ Image.asset('assets/plan_image.jpg', height: 150, fit: BoxFit.cover),
+ ],
+ );
+ }
+
+ Widget _buildOptionDetails() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text("�азвание опции", style: TextStyle(fontWeight: FontWeight.bold)),
+ Text("Поддержка 24/7"),
+ Text("Со�тавление индивидуальной диеты"),
+ Text("Длинное название опции..."),
+ ],
+ );
+ }
+
+ Widget _buildOrderProgress() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text("Ðтапы заказа", style: TextStyle(fontWeight: FontWeight.bold)),
+ ListTile(leading: Icon(Icons.check_circle, color: Colors.green), title: Text("Заказ �оздан")),
+ ListTile(leading: Icon(Icons.check_circle, color: Colors.green), title: Text("Выбрана дата �тарта")),
+ ListTile(leading: Icon(Icons.check_circle, color: Colors.green), title: Text("Заказ оплачен")),
+ ListTile(leading: Icon(Icons.radio_button_unchecked, color: Colors.grey), title: Text("В проце��е")),
+ ListTile(leading: Icon(Icons.radio_button_unchecked, color: Colors.grey), title: Text("Завершен")),
+ ],
+ );
+ }
+
+ Widget _buildHelpSection() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ ListTile(
+ leading: Icon(Icons.help_outline),
+ title: Text("Помощь", style: TextStyle(fontWeight: FontWeight.bold)),
+ trailing: Icon(_isHelpExpanded ? Icons.expand_less : Icons.expand_more),
+ onTap: () {
+ setState(() {
+ _isHelpExpanded = !_isHelpExpanded;
+ });
+ },
+ ),
+ if (_isHelpExpanded) ...[
+ Padding(
+ padding: EdgeInsets.symmetric(horizontal: 16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text("Продавец не отвечает на мои �ообщени�", style: TextStyle(fontWeight: FontWeight.bold)),
+ Text("Ответ некоторых продавцов может зан�ть больше времени, чем вы ожидали..."),
+ SizedBox(height: 10),
+ Text("Работа, которую �дал продавец, отличала�ь от опи�ани�", style: TextStyle(fontWeight: FontWeight.bold)),
+ Text("У ва� е�ть три дн�, чтобы проверить �данную на проверку работу..."),
+ ],
+ ),
+ ),
+ ],
+ ],
+ );
+ }
+
+ Widget _buildCancelButton() {
+ return ElevatedButton(
+ style: ElevatedButton.styleFrom(backgroundColor: Colors.red, padding: EdgeInsets.symmetric(vertical: 15)),
+ onPressed: () {},
+ child: Text("Отменить заказ", style: TextStyle(color: Colors.white)),
);
}
}
diff --git a/lib/features/dev_tools/test_cases.dart b/lib/features/dev_tools/test_cases.dart
index 2623c9b7..1db0bb30 100644
--- a/lib/features/dev_tools/test_cases.dart
+++ b/lib/features/dev_tools/test_cases.dart
@@ -32,6 +32,8 @@ class CreateRecipeTask implements TestCases {
RecipeModel(
title: 'Title',
state: 'active',
+ activeCookTime: 10,
+ image: null,
description: 'desc',
type: 'first_meals',
servings: 10,
diff --git a/pubspec.yaml b/pubspec.yaml
index 422f0bb1..a6ab85d4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,6 @@
name: eatvio_app
description: A new Flutter project.
-version: 1.0.49+50
+version: 1.0.48+48
publish_to: 'none'
environment: