From 4b306f3ceef54b88bb73fa4130a0e501641e6ca8 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 22 May 2026 18:18:55 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B5=D0=B4=D0=B8=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 9 + android/app/src/main/AndroidManifest.xml | 17 +- .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 5875 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 3056 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 9697 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 18393 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 29513 bytes android/app/src/main/res/xml/file_paths.xml | 6 + android/build.gradle.kts | 12 +- android/gradle.properties | 6 + assets/images/icon.png | Bin 0 -> 43450 bytes ios/Runner.xcodeproj/project.pbxproj | 4 +- .../AppIcon.appiconset/Contents.json | 123 +- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 263639 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 917 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 2300 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 4299 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 1473 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 4096 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 8087 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 2300 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 7066 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 13814 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 3197 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 10185 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 3966 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 12715 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 13814 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 26750 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 5875 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 18393 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 6461 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 20513 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 23758 bytes lib/data/datasources/local_db_service.dart | 84 +- lib/data/datasources/ws_client.dart | 51 +- lib/data/models/contact_model.dart | 26 +- lib/data/models/lib — ярлык.lnk | Bin 0 -> 1048 bytes lib/data/models/message_model.dart | 68 +- lib/data/repositories/contact_repository.dart | 198 +- lib/domain/services/api_service.dart | 389 ++- lib/domain/services/crypto_service.dart | 224 +- lib/logic/auth_provider.dart | 2 +- lib/logic/contact_provider.dart | 188 +- lib/presentation/screens/camera_screen.dart | 412 +++ lib/presentation/screens/chat_screen.dart | 2900 +++++++++++++---- lib/presentation/screens/contacts_screen.dart | 130 +- .../forward_contact_picker_screen.dart | 300 ++ .../screens/media_preview_screen.dart | 235 ++ .../screens/media_viewer_screen.dart | 330 ++ .../screens/privacy_settings_screen.dart | 14 - .../screens/user_profile_screen.dart | 18 +- lib/presentation/widgets/contact_tile.dart | 125 +- lib/presentation/widgets/message_bubble.dart | 2183 ++++++++++++- linux/flutter/generated_plugin_registrant.cc | 8 + linux/flutter/generated_plugins.cmake | 2 + macos/Flutter/GeneratedPluginRegistrant.swift | 14 + pubspec.lock | 480 ++- pubspec.yaml | 28 +- srv/8971f17fd63b416b964620c9bd89701a.png | Bin 0 -> 142683 bytes srv/app/api/endpoints/media.py | 206 +- srv/app/api/endpoints/messages.py | 15 + srv/app/api/endpoints/users.py | 83 +- srv/app/api/schemas.py | 9 + srv/app/websocket/connection_manager.py | 28 +- srv/ca5c897d07a84334933ad99beab4e63c.png | Bin 0 -> 69999 bytes .../flutter/generated_plugin_registrant.cc | 9 + windows/flutter/generated_plugins.cmake | 3 + 68 files changed, 7693 insertions(+), 1246 deletions(-) create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/xml/file_paths.xml create mode 100644 assets/images/icon.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 lib/data/models/lib — ярлык.lnk create mode 100644 lib/presentation/screens/camera_screen.dart create mode 100644 lib/presentation/screens/forward_contact_picker_screen.dart create mode 100644 lib/presentation/screens/media_preview_screen.dart create mode 100644 lib/presentation/screens/media_viewer_screen.dart create mode 100644 srv/8971f17fd63b416b964620c9bd89701a.png create mode 100644 srv/ca5c897d07a84334933ad99beab4e63c.png diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 4df7405..f73cb16 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -49,4 +49,13 @@ dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") implementation(platform("com.google.firebase:firebase-bom:34.12.0")) implementation("com.google.firebase:firebase-messaging") +} + +configurations.all { + resolutionStrategy.eachDependency { + if (requested.group == "com.arthenica" && requested.name.startsWith("ffmpeg-kit")) { + useVersion("6.0.3") + because("Фикс падения сборки на версии 6.0.3+2-LTS") + } + } } \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b3e97d2..7bb8dc9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,14 +4,16 @@ - - + + + + + + + UY-OS5 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�`gk<&TVt{N8*eQ-Fa<4?c;-1P3J{itJk{ciH%gG!n_9vtS8f>M~-*9iJDWud26^mv3P8x z8FMK&u3GWWzWLSv{kuQh-;p0}e`}hlX^2v!L^eY`%C=ag!Y>*d1?X+Apd#HMm4OP4 z<(QAS6?wk?+jq=VGXHbdO%qF1RQmbB(K@x6m2&l6n|)pxvLc3V0DlI!f3;VHtVZ&K zr0Bs`O8bIwn#p~Kk6pZGg^=mD9(dr5_jZGT^=sFxU9~hO04UBX@yq95c<#-e$C1x4 zKBxPn%(>zOwn`iaNw$zK7w7Ars+9r*F1F3ZR0JR7>?JkUG?$%pLQ6P z3`$U>7LI6pxY${RfefeL&acM?B@+e{g+-Iwee01hVf-t6#RfVw0hEHN*=+{vv+U_K z)UzzJ%Bra;?O#$_;UJh*LNE+dpIi!nDaIdp<+TeptXscyWa-4vUDsW%EhHt$M2 zaO}rVKD+Dq(OCvljCHu|5rT)AY=<6sKup?$?i)ykm{xtjVB2yT4K9Fag0d#OPl~Oi z#J}_}9)13yFJ0E_C7&JG-|O|d-R|k>scxqeGx*Yl=iPk$)l0{Q0Oab`%T}*mdF|G# z_wPUa%yTd7`S`%D{YT|9zx&hs??EOzsYM}n(WMbupdBiw9#$^t=fJqyA&PE5TV)Y! ztMPdb-)lDwzpdmEW!i|!eRRui!}<(E6Q(fm8tLS#u$B;&k2Jx5u8nAAdQ&C39~MI% zD>cp7!6f~^9{$C*@4R!%c^iPzlmQ$6e{EOuYROT>tE%6dgcwCIWMfQRDF`YeqGTgv z=fZ^>7ybqQJ1+byTnM5O1ELblLK(#{k{EFqPzWlSNhZn6n|E*5k*f1ir>ag>_q{U~ z$-H~}c2`$dRiBUF`TE2^|9kfrzxmx?Zr{G=;C_4xCFLu~nRRkm?gaLLrz{*XJ_;d| zm$Z$lp)1v9jc7bi$vRf=u0ksHwLpC6F5ddj-P^Cdek0f1NE8X;lEk0nkNv@$w{O04 z=jCsF_2sX9<k~)_pMU;SKluK4fAX`}|M0h4e|-BNaQXVxdc1k(&O@I-sfRvb z^kBLX+V67(yNKn#0kKt1DmhR4rgSd-7ciy@H3Z-B2jLlOWU)&!6oLvUqLV6sSks8k zV?>EJQGmorYvG^1qxMwwDuiUJBo|J!3>}$Dxtt^CilPDHqX$<%`uVG$efpV~o_}r$ z;otAS|F64uKgvAf<5V6cVrcLqs;cZTJ5$a`N3n6_?=d0piZx@%qf0`4!i}z6yqnx3 zQx46iVO=N}>>>NU!NK3Se;t4N#-D!m#?2R>|I8O(dg04o`ofFPeR7HMm2ZFZ_wU^L z&@Hdsdg}o2exg0u4;nZFt3!Wp?+QI6YOxLW=xMF+zeYMX9=Sx+)MO8kAd=#2bFQ7( zW@QU&jw<|d(VKLm$AGA4DNvOwqGvHEr|<M1QNPKF3_7|Wm0Wr^z`#Cl{StYlR>v+B71V#2>%<+gHBz^*_J;_j>>zrkscCF~uxjB9ncTb9by+ zY(EBMGjS~*L3ud4d=AxGl+&@KM`US}Edl8mgQfxP+(&YM!mHd`xgB~Y3LTJGVvk+z z!R$FoExi$RaBpbyc#|1k9NZ$qo#`Qum_3@JX&_5XOQ0#94sbty}m=OSLG^E7k zy_HZU@Tz)DJ=BSwh`7Z{@dcQ;fJ|dK*BAu0;b&gv(Qp3(ohl(d^#0z1>pQ=GBl_?N zF7y75%v%G8g8`-B$ctf=Zac4aS{O}xBep{CWGJOI>kCI;M;e*R`02A9=c4Cabml2e zaoXnMihwBj6*8$v?tv@14ji)`c1?+ySIjvN#Mz<6h8nU+{q(?SN|?9}a3pdnI8EEE<}HcX$h#=gm!IuTolKJfraQJbPQ=jFX=-<83NXL0VIkUPE7h#4i!i#7B5M5SObws7Wy7# z7eD}i^eCYR{19@sMnp|~7YDd2hEv#+)W+vu@d(D~Wiiah9>D9}Hb^p& z05Ms8R%L_ecZqJNojPM-rmO3mJ5=ZQ!9?tid!*7kq{4=55J69M$>g@ul(@WmD0>Uq zu_AC1aD}1oZxU{fuFb$DJ209bYdUe2R`gv={!A-}Q7oieV^s%_)xj~WVWoA(`T>rM zWP6h;>~A7}o4?f)Jk%bF*s78oo@4?u0c0c1Z{OERo*vb&`co!ASj_}0fyJzcle?CdVu+ z+0U^jM}6f~Ke~SOtj!}^<3qu1MYSR4R=|mrgj~rH2S{RdYi*Q?l9`9|CPmIbjplW9 zs6*#IBr5gbxpW8=PfO{WPw|;Wf)^*>bXM|;Skm5d7*3H8M`ea27Zw8Z(NdOJAW|TN z@m7@713!w+;9O5s4#w& zI?ZV+PD{$8exu~2@nl^Rk4+lL)6KQ-6e0Fx>qvu(U5OUnL!e*2?xvyi)V*XAmeKT+ zbgbNBBuXIVR5_WN_l5oe4>04U*dfL}W{WLgX4onk%bv{9LGV{jWT!G8q~vm7RiX4m zqN<&RHCWqQ8{z6Zg|l2ZA%nwJ*&dx>%D}dDGRFxTR3DV**5wt~ob?hR81m~PP)PX= zXG0*qz`zxT)qT-R3{gqi0bJg+5O%2|$3yVV@cIF(pFIByl$J1J(Tw1im06fzfHX9S z!Y;!_(L>Ggs3kPUgXXQN!Y>TDFk&i+QQ}QKkq3boTbV}pX8?(P3mG(v3iAWh@K4N< zXgtp@)r^bGlsziE0^Nm&My#ot!24>CWct`p-jV%hbRj)w00^_zu2VBM`f4(fsvC8P z{lTE*EJM@>zygGHIfSX1e57_YC+N`Tt*4ja4=~22pDMi!IGtC3ifk}p&TncOYs8GG zZVy~mEgik+vKX=>J8v5^kFmkjx(}Q!E?X}vp8Rr$c3=ws4T{p2 zlky)iSsq8K(>7B(CDmBkKzcTtne8WfS6rNO4UnNQjg=He8H7n}fs2cknZhD;uFO=B z4v%EZFVV0I-H!wU*`T6a6n21-zq-B4JQ zt6BzS1*wi5<>qR}){OEmz=@s>4S%K&HOZXuSri3WJ93rPiYh9jVHW0InVXp=3LSqI z&ecm)V&_|o-smy=#1@tQmsI6(-w(2A;J*^CQVe#iWc8 zr=vDfO)G5G#y2a@5kT&q&!8W#Aa;HH!o*#7X^4O&8`(fpG)l~v(CX`)jE0s zR9;h|#y#Po=&N!(Ic*f`U5!MXtYf$2&{C z&xYhyxKa6uRD3ON4R6}dX%R{%*Pr%;m6}BSi`KiMI{iyjB0Hus6(Y_V1g85wJLHiEfsYFw;~a;9t;_fi-#X5PJ_nixw=S%Gybr2 zKcTBgI-oSZN}loAy#>D=*j#g=sB)w{`i@Jn^jaHtrpITl)kymmXyb0w#eLCHj{ZjBr5n5sK2EZoSw4jkA z*m?#DQ$!P5zij=tZo@65!QqivLoFL?QK1-4jO-leQJ2xRyV#sTKY@9lvU}jOu;c^# zB$bxmF;nl-@~OgSe!#*sXauY?b{+&yxY)k&(Fd`^bn2WwE;xl@%HVrf{Y(kLWZ#t2 zkU_bbjxsc+?hJ6=Y=$JShiEZ1-&z4zp0I^nT$uBYpbj-b%2B4+#X12yO8T(M9hgyr zd|6p$p0uLF2`Lgus2YqORX<$x@Yc#pOMVchf;Ja;*V=4_dQPSnj#^bOtZ!}A<{gcs zB^~st(|nphwz7z6{COZ@NZ#PuG~*dA%A4z&2?}ooS~D-iNgUL2j9I2V#ra$bL&83A z&+$3MI!lk@L9DzK3an?0!R5$zFSEfufjOCHW>YJBKVrHz^7ZCa0+EF|{Jd5IN@W}F zH&d16vYOQM#FB2`H2P2lB<}BbBG~r^HM8fPM%juYH}~hh$^p=*qxg^DSMzp*7%THs z@hjTK086)Zheg8&s3a(*;mfNi|DCNRJ&AL=u!yGZs@Bu*=((+A6OWoVQU3dCMM`Am z52a}RU|qXS+{IY62YtQg`iVBoKKAp~8&o9sc%&bT{17WkmKU>(G0jg(wAk62J)}kN zjpPcQ1GZ-Yu~Mx1EWr&=tbG#5v307=@u_7AkvF-VQaFz~N}syKRTeNsz7ahLoj?*W zDK*Y$ixicu-xCF*lm{f~xY{laLGtpMJWsrj!mPMn$VEBVNu(3n)>lu7-qvQ*YxTBY zAU*T?s)>9ufuyTx;OEwEtXj&P?SnS| zb6i?mr`r1Xo}rv+L8I4Hi|~p(P}8|4e1+-3!O?O`@^O)68KTG7#gwm{yvLI?T~KDl zOaUk)yH%g_uy~h8sT=OZPhW2rP@9H}7|WY~Vx)sUvU5V`y%je!sweMVhw8P))PdKd zWrbkGwjV)rL@8W?eQl4vTvZdfIs=k4f@OVD&^#B>L4Jk#!Gfbo72sJjhvmX)Lue8| zRy545(KCw3bwP!MftfgWegY5O?UXAbkPRgI;x23Auc=49 z0RZtmrLGtV=Su?PRbu_Jo-oov5C-Tx#|avHM(;R;YJ{HpY#Z~2|7zeoB+1POQQ0BHUI9jd^jkz^c7UDdRd7y@`#f>t}m zIiiLZ*S4-Z^)p&s_|M4friAtj%YU6K=6)#C>>)TXWV zneB@tV!6KmrmAJ|sZMe=`)LzQIkGUam+wH0Z={g^_~giL{jfdrMC5drHrM`?!-Uxt z-LvNJt5-gdfUFZ4a8DG2s)`HyE*x{E2-O00&YpVS&LAGUb?4!)`>{&gSVoS-^N8MF z{mc304d}aS-kVA1`$@E?%vabV1)@2}ijO2F;!zq=c@17H5@}KHDNT*qkaHPeKP0Fi zgcij;NkVvRJ7x>bs14Ndc;Pr|&;-KwjL*EK^uzrUN$j&NsbSH5E%IAGPr+;|r$_yG z^33^LgT!$7y2{`o`m;*Tzw!(Wl|ebAUXYfzc8@t@(*`#IXog|>&x|@O!${M6nKQ{& zv)ZKTXeXbGmny?Fy#S^VZEk`B@Pk?^12gDJNd3~BMBz@Qs3)~a_?w0?O_I5jp+9CD zy*%^VO=4_%rs~OwsoL~=fXAT>q_X>RhU4-Yi9LKftGW4Ln?!q0zKD@_(7dwyx0LCB z_&6J)L1-R-ZxzjP3LEw=4=q*%uIXn!+ne617wAimDGB*Dt#MGj29g`1TO0PtC&$2w z2v@;Gb_h5HhQ9LPP+@*r1xwgdK-k3upavE zikU+L)#atP=FU_l&fpy;=Cp^$PyGF|4U52v{=&YQG^4$54Zv6}FxYP=Z!`@KJxtsX zczqS6cuGfB&se#5#dYTxkJ(IAjIC6@Ic)3)2|3qH^{(F#3PG7UAs7ET{JI0aoDYsk z^ma3Zj8efEv^F&F#Egw<2j*Fxh~uGQ^6K$(wWqhQ4UI^iqTdSYGmw1mTREnj!`zMD zQ;n5c6I^Kz-UFqGD<-gFbY?Z#aH^l{f;xt$btl)ms90?C + + + + + \ No newline at end of file diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 0b44e0f..79ace48 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,7 +1,17 @@ allprojects { repositories { - google() mavenCentral() + google() + maven { url = uri("https://jitpack.io") } + maven { url = uri("https://storage.googleapis.com/download.flutter.io") } + } +} + +buildscript { + repositories { + mavenCentral() + google() + maven { url = uri("https://plugins.gradle.org/m2/") } } } diff --git a/android/gradle.properties b/android/gradle.properties index fbee1d8..22f5ec8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,8 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false +kotlin.incremental=false +kotlin.incremental.useGradleBuilder=false diff --git a/assets/images/icon.png b/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..71ff744e0a7ba912bd147438a5b1377999aeab3e GIT binary patch literal 43450 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�AQu>~M-g~?w%=>|jq3h< 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 XB<^cb3J{)wj{!0t6eY{V4FmoM4<~mY literal 10932 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 797d452e458972bab9d994556c8305db4c827017..3774076ac8f109180be6bb15cc6c3960abb132e5 100644 GIT binary patch delta 2299 zcmVrm}kSF^RvX$dy~4uQpy8SY@a1>8tT5GXET zApuQJ8**mKtDd}h#QS|hfOr9@wO|zI+I2dz>-FTyCjvncUw>sO)e-RXUb=64|9Dkd z>xY>F=0HPty&i}

)J(8V*Ws8@|cY9K@Mnec_&f=mX7YfrABBsW$#S&>ju1mEFxo z7+;(^iu1Q2eRCt`7 zSX)e7#~J?rIcHfe3wFF17Hr3bI5ZF^*lut_)Feo*YRNBE6Gcg?D3z+Hm0C4zANu5~ z4}R!HeMr?xeQ~6!Rn^NwBg?%wvJ#uLxzvsw1Hllv#D6vp1q>L-0=uw#&V1F(oH>^T z94klS=nFd^{xPJ$^cl2GrNgNZO!Fi7h0@(wIe8FV-K7FuJ#91CgT5qZJrh>XAML zMr;hJ{(qQm155#=TG0t0m3LClg^3siF6+dp!O(+!J)pelvbY_v(B`}9fwcz=``)IO z%}*1B&`XCPh&_gjz=Fy^f;ItW63QkvOCa&3@&WeQ(RZmVP<{&pCVENipfEQC)~KYz zE2MUhRa#&RDgrYPEC6kzO1;M^<KUGjsFL_I_dT-|q(#gJc=<@qdB^W5vZbwXsaYA_Y|%)szF&ftmpFBV`1s(=h(J7ix=c7Dwt zSSc1+G(fgzw+vptHcrkoJ4IcbrV#@|w<%*CzbMB@B1Ahu?41Crfh?%qrLXPloPStY z`o+27d1jB5LHWXJU3K*eEfvV|IS3eno;Nfub+i@w`gYR!Fp#i`hDid~LN)_m%58oA zVE3OdjJ!5^>!wh2Q7aYKOfD?#yemUAtC5gcG9nxkLd0`ySvN7mIIXy;7RZ5~Zp%H= zcJ~ke@zzHYdBI@XF6ro_55D~N(0|feDO0`GI7xxWY>CfskxsMvnJ6wqSV%CGP^E+x z&@=bs_U+p7qq7&rnF~ywpeji<#P?=u8i*Rw=|Z`L(DpEFY^w~W#K9ygLTw8o>}Dbt zqVAgMW%)qe9%o2UP;XD5)w!yUWM=9`0^wo>?xO7{2z`E7!|J zzjN^C93-@YRpvoq`yoF>p=Od{0IDD}gyPcjidSym-P*b%S16R$iiMKr_g@;F zST0Qx=NVsVZ#{C~u9KHW&P>ftkee5dAMK)X$*i$J(HkU~OG^b70+azhpBCSF?4dVC zuK#Xe%q8bYTk{w1+kZWAYyNOgrz4!RV;^6gUw*Q?{g)?B-vqCcv&QU&3NWfrj-@#! zJ#`<4MoP7LLXmZb{O>=}J2yF7pUG?y;>F&*`Qp;iQ~h}*O}Lh1qYy`rJU%*l_1lM^ zxV2I^IX3>csf86bTVPm5+6YLCn$W!ACSl-x&8Ut?d}?Uqdw+ese?0TvkH6gW>d@%v z$=MlliY!uuCeY)pjkT$&{T-hx7FJWG^4{&+PEFm?nj|I}qzPxh9*7F$PEhJ67cM(Q%fxwdSJn2ThWW&cgpIqaCglq*zp!lNWtR~*j~dobj# zk6$pnAaqP=#*Y{Q)dvyY(9y)pbqZvYaq&hp(guN&k|5p)>{I?H;gV^qkXJ*Apq(-z zB78P6(9hDYzWzTMY?m=g2Jv!cdq#1YV=KfSv^iGb#_mBobG&OqeUb2Yy-jhf{{u~Y VzZ3n+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f(Rzpy#N3J diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6ed2d933e1120817fe9182483a228007b18ab6ae..2f77f82254438c47f22fd762615724fdaa33615b 100644 GIT binary patch literal 4299 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 U5{;O$g8%>k07*qoM6N<$g8fCh@Bjb+ delta 266 zcmV+l0rmdD3z`Cu8Gi!+003c4mpuRg09{Z_R7L;)|5U~JDYo_jSDX9(|7FYh`2GLd z^Zv2r{H^2sT*&w!Y^SB+`<>qVZqE6)=lqo0`vF#&*75!I`TIh@_d&k*HoEtQyV-iD z%Xz2D9EQRbeYh5Nr~y=#0ZD;^+vz0$004MNL_t(2&&|%+4u6C&2tZM$Wf&dzefR%A z(^3-?6X>hnCz2Ba@RH&`m!pgy?n@#@AuLYB&}Q)FGY`?vcft0!vht0Z@M&ZeNCWXh75gzRTXR8EE3oN&6 Q00000NkvXXt^-0~f+uB#z5oCK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index fe730945a01f64a61e2235dbe3f45b08f7729182..50315b1b665c680834c947f1bd44fb4b6004829c 100644 GIT binary patch literal 4096 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10..4ef043b670c8ff41f3eed83cf0fa59b71b2fabd2 100644 GIT binary patch literal 8087 zcmV;IA86o-P) zHvkTS#gQ5AV7mp}NJtPUE@2@7O->tfX3DFcym`d?eL{eE0jRZL6zAG?IFZW<0sZX3SI(;UQ^VSVAAfan9w zXn}(TR;f1rJYTbAPEMV>teXd}J4F>S_44WQozry;}-y(^(Nl8RORCt`NTxqZz)pb7ScF)Y)=IQBa10*2{p?$Np0b-Mk1QysBFi_YO zt~gHO#7-&|mlK=Vj-93Kq>>*_RdDQ7ffF0sAZ!C=B(VxG0)zzGK|)VL0tr2>Z_&(~ znK#pYPwMWsduFtdbg7|_#f3sL+|GRAXXY8m;3n-=_4Nvq}k*^@9+QRiQes`W|uH21#UFI z{yDx0Jg;e2Las9Qc*jqJt)g}>ziJ$bN&Y^WgRNr*^N$KxQ zStEIp=_|lG8r!pgoTNxj%vt9Dyi_CE5lR|0{WVP8g9vAzW;OnEs)DD(h~7!L7-Mq* zNm-zFIAkwlsD;8n%Z?kNBnIfU1CVxv%>;)=vzR^Wq~K5QS#;i%az$3KOeFM)I@z z#>7CBCjmypO@GK!8Pi4NWS6b@8i)lb?VWTb;;NkC|HhG9*dErv1R}Cb{E4MbFk?zBkUP6L>VHCSCd7a)SPIFuMDGbQ0%)M> zD|*w5LUD|qn+|bvt94ao4T0w$lwiq|5zvUbB`}5{ zG%7%1z^apIpqE-DVlYASLF8H@jn)7ac=Ozq4_vjqP~Fy!L%EU*w-+uxsz=c0D+TG> zeXk?Oz)V-HeQ40UFLd)6^*WMvM@_y(a9m$Nqz$b-go%*eMc>OWAdn@4pBvc)ln>|4 zoTdDgDR`q12N}nUWY&de0@Za^-xIPx?=x2zDfvumWw;g^BTy~|tu+ay%0+Tj1@bWs z0cgrbsx~!zt(Ss^FU>@te1RMq^Jd2HnL$C$5<~KH;&Dmw_zL151}qRIe>bv#unDrN z7XjMKY!@%UIvOv?%=`qpMJA^aA)%{?79)TX8Kq)@B$5?+%@XIyzmy0K;u0TXCu?;c z)qHSoz`mJi^jv-W1xUfVHAZUiXr_>n#zg>b^^(QSOs_2TW-=iH-!6FZzeY-)%O&Mf zi4$>)eNpv94xX%lg62x$;|0?zk7YUgq3xfZY&FS3GYt4uU3DXIHcTQ#s_PQfDZhy_ zhzG(?P#`gLXjD$>8^u5oKtvcN=ExXkV$w}TCR~o2(G~`dq3m^93e8-mig2V;Ah{xt zYcoo=9}Fn5!i}e+x~A%>1RH(u03at^7iNGm5a;9>(*LjmSdkzEkYYl@R8vwA!bWmC z*WM$@P&EMNR~Z_nS47&5C&gp>iZ&p&hA=Tgxe9o5pXFcA?Olv05F^J7@^<1aApW%i z&q!myfvSKdpfa%%ge8I+V9nZ##NR+ZA(rlwl6uJPXq*z(=|ZZDR%ubUx z=3EBLVm4Tlm6?L{vMo|GNEw1GP#≶!dD$glVHkO}}_-mIZx<;_eT74_C^4QX8dB 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 delta 691 zcmV;k0!;mvKfnc$8Gi!+002f7DP8~o0Jl&~R7L;)|5U~JDYo_jSDX9(|M~s@SH}2N z#rS{J`h3&+@cRDr`1>4br2|=<_Wb|z`~RBV`-<24{r>;E==`tb{CU#(0alua*7{P! z_>|iF0Z@&o;`@Zw`ed2Hv*!Fwin#$(m7w4Ij@kM+yZ0`*_J0?7s{u=e0YGxN=lnXn z_j;$xb)?A|hr(Z#!1DV3H@o+7qQ_N_ycmMI0acg)Gg|cf|J(EaqTu_A!rvTerUFQQ z05n|zFjFP9FmM0>0mMl}K~z}7?bK^if#bc3@hBPX@I$58-z}(ZZE!t-aOGpjNkbau@>yEzH(5Yj4kZ ziMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_stABAHe$v|ToifVv60B@podBTcIqVcr1w`hG7HeY|fvLid#^Ok4NAXIXSt1 Zxpx7IC@PekH?;r&002ovPDHLkV1gh_Yi0ld diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 797d452e458972bab9d994556c8305db4c827017..3774076ac8f109180be6bb15cc6c3960abb132e5 100644 GIT binary patch delta 2299 zcmVrm}kSF^RvX$dy~4uQpy8SY@a1>8tT5GXET zApuQJ8**mKtDd}h#QS|hfOr9@wO|zI+I2dz>-FTyCjvncUw>sO)e-RXUb=64|9Dkd z>xY>F=0HPty&i}

)J(8V*Ws8@|cY9K@Mnec_&f=mX7YfrABBsW$#S&>ju1mEFxo z7+;(^iu1Q2eRCt`7 zSX)e7#~J?rIcHfe3wFF17Hr3bI5ZF^*lut_)Feo*YRNBE6Gcg?D3z+Hm0C4zANu5~ z4}R!HeMr?xeQ~6!Rn^NwBg?%wvJ#uLxzvsw1Hllv#D6vp1q>L-0=uw#&V1F(oH>^T z94klS=nFd^{xPJ$^cl2GrNgNZO!Fi7h0@(wIe8FV-K7FuJ#91CgT5qZJrh>XAML zMr;hJ{(qQm155#=TG0t0m3LClg^3siF6+dp!O(+!J)pelvbY_v(B`}9fwcz=``)IO z%}*1B&`XCPh&_gjz=Fy^f;ItW63QkvOCa&3@&WeQ(RZmVP<{&pCVENipfEQC)~KYz zE2MUhRa#&RDgrYPEC6kzO1;M^<KUGjsFL_I_dT-|q(#gJc=<@qdB^W5vZbwXsaYA_Y|%)szF&ftmpFBV`1s(=h(J7ix=c7Dwt zSSc1+G(fgzw+vptHcrkoJ4IcbrV#@|w<%*CzbMB@B1Ahu?41Crfh?%qrLXPloPStY z`o+27d1jB5LHWXJU3K*eEfvV|IS3eno;Nfub+i@w`gYR!Fp#i`hDid~LN)_m%58oA zVE3OdjJ!5^>!wh2Q7aYKOfD?#yemUAtC5gcG9nxkLd0`ySvN7mIIXy;7RZ5~Zp%H= zcJ~ke@zzHYdBI@XF6ro_55D~N(0|feDO0`GI7xxWY>CfskxsMvnJ6wqSV%CGP^E+x z&@=bs_U+p7qq7&rnF~ywpeji<#P?=u8i*Rw=|Z`L(DpEFY^w~W#K9ygLTw8o>}Dbt zqVAgMW%)qe9%o2UP;XD5)w!yUWM=9`0^wo>?xO7{2z`E7!|J zzjN^C93-@YRpvoq`yoF>p=Od{0IDD}gyPcjidSym-P*b%S16R$iiMKr_g@;F zST0Qx=NVsVZ#{C~u9KHW&P>ftkee5dAMK)X$*i$J(HkU~OG^b70+azhpBCSF?4dVC zuK#Xe%q8bYTk{w1+kZWAYyNOgrz4!RV;^6gUw*Q?{g)?B-vqCcv&QU&3NWfrj-@#! zJ#`<4MoP7LLXmZb{O>=}J2yF7pUG?y;>F&*`Qp;iQ~h}*O}Lh1qYy`rJU%*l_1lM^ zxV2I^IX3>csf86bTVPm5+6YLCn$W!ACSl-x&8Ut?d}?Uqdw+ese?0TvkH6gW>d@%v z$=MlliY!uuCeY)pjkT$&{T-hx7FJWG^4{&+PEFm?nj|I}qzPxh9*7F$PEhJ67cM(Q%fxwdSJn2ThWW&cgpIqaCglq*zp!lNWtR~*j~dobj# zk6$pnAaqP=#*Y{Q)dvyY(9y)pbqZvYaq&hp(guN&k|5p)>{I?H;gV^qkXJ*Apq(-z zB78P6(9hDYzWzTMY?m=g2Jv!cdq#1YV=KfSv^iGb#_mBobG&OqeUb2Yy-jhf{{u~Y VzZ3n+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f(Rzpy#N3J diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 502f463a9bc882b461c96aadf492d1729e49e725..51ae364b64b49efa6d869df8c76932fa05a3e3d6 100644 GIT binary patch literal 7066 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 Eg4WZAzW@LL delta 572 zcmV-C0>k~9H_8N%8Gi!+006nq0-pc?0H{z*R7L;)|5U~JDYo_jSDXF*|5nEMy6F5^ z$M}8I`uzU?*Yf=uXr;5|{0m;6_Wb|A>ik^D_|)+I$?g3CSDK^3+eX0mD!2CP`2NN0 z{dLg!a?km&%iyTt`yiax0acdp`~T(l{$a`ZF1YpsRg(cvjDG_-U$Er-fz#Bw>2W$eUI#iU z)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G!hkE!s;%oku3;IwG3U^2k zw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn_j%}l|2+O?a>_7qq7W zmx(qtA2nV^tZlLpy_#$U%ZNx5;$`0L&dZ!@e7rFXPGAOup%q`|03hpdtXsPP0000< KMNUMnLSTY5u{BNr diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 0ec303439225b78712f49115768196d8d76f6790..f38f4707d7c7d9693f0a79f3ea96f9adc1b65ca4 100644 GIT binary patch literal 13814 zcmV zHvkTS#gQ5AV7mp}NJtPUE@2@7O->tfX3DFcym`d?eL{eE0jRZL6zAG?IFZW<0sZX3SI(;UQ^VSVAAfan9w zXn}(TR;f1rJYTbAPEMV>teXd}J4F>S_44WQozry;}-y(_4s7XXYRCt`NeRr@O*LmOfo!wjByRQNdodiIl5daAiBuIh~i@{z^ixw3- zvMjfF5|@cQ)+8BE@`wL(JmXm7v8_Z>;>eO?%91Ra6eacoPyk2}g(!pwqLb*r>*cmR zUvm06yL<0@pmGQEaLex5v)}p7SAJjF7!g6fhzK$-MD)K$U<3p}_E-CpIt&5DA0YV$ z<-zK6dT@2F9b8?g&1C$ayjj@^8|2UVv_LcgT zfM+KW9-#jCgcS$nA54^b-+D5bJve>Y>26`B)K!d;IyY}(sVU{&BZ%+C|FLC5pH-)y zOU|GS!Vyr9nKMy;E3_KlOjL4B{=_hM!jgv|k9nuRJF{g!%}Z|^O;0eqEp8nVW4&ju zc+`9*4G*DwO3Y}|_PjPzQ(}szzLn>qp2C%1Iem@kZgaYEqzpwgq677c1efp^CH#pX zd%Sg=C7hHI*yj7b0tu~X~x_+r5SeGIpr$D)=~w-t**@` zV>W6H>D^zF86o@PU{9aHtJT`KV)@`0$kBNz(UFpRZH&{5h|V*sTTR-sd3pil2A4)8 zlHO02=u&%o-*|Io=5);htu3fl*2@*Mc{uYt)s03;N!v8Xj+REqG%Fu?F=ivD9Fw*J z0hK_~12`QdO?w7&p}oQ#&sxgL{G5XkdoLLX#WZw}K(hG(QW z+B<6oj$-OHbCy7`3W`9Ou7**;X9{V$p<-BP#^|5ap3?KQ3&xDm9eE3&Ok=fKa}1UC zQd{2gjExpIB>LPP$mm=;&QSSg*0wD#OI}m1fznQP1Ci!$CbvETMv`P!R2j*^<$L1t z8)gW>{Y8>95bK0w*TkP#YUAh3c{*n`_ulNj^hX!B8T;=1OnkQN>q@4=lsrW(BHRo~ zv#nro!|)!iLiQF=%WCn8w0O``hy>-sVLcm5Q8UtxLE6syGx za`gWPr${rGC5=3SNqP}eG?z-6$!{WYcA_VkGDSge{a{xbi$gGtaik1)vq;Ddu55rr zjcMHAmT1(>%*|H%lYAH4eTS`N^p(8Y`hIBmFf#L#<^;D&1|_+(a*Z+rV#p}|_v&RF zGqFOk854lXIdBHxcweov`kV4%u1r?su1Y9}(xM~R+D%y(t!%aYNx1uG#6q}<&?9S# zbIB42to~CLjrxaD@DgdO4!K)RwS@LU+*7&AT!g07mCU%jio03roawkn2{39Q1~6+z z=bLw}D0rn}gp>>gLrO@;2iP^c;bs{@VBpD6~^T9zqA#|VmY%%ON8C#Fn(&b0F8LhC0 zg~y;QHh16TO~`&@|96IS<{nZPL^Dzph+4F)8J>mKePJIOOX#0- z8SP6M$R3#t+Uf|&%yKjTx{8;Xq!EU&k$(U>5vg`3GPAvmGE_1OjfcWK2U8u-(YPU? zzd-_?$Up@%QYHC0Y2y2-LPoba%n@rwFEvFpyo^SMpkWWLZ=Q_e3a%HE76k;@YP$rQ z*_i*5cRl~mjI7;G&;2%{1O;6^lUMC6X5|kW{b{Cgr4&c2bimNErFm!ZhZ#t1WfLe~ zHmoWvVy4;1g)5o4a5$RPgc)}!1ROla&rp_>f0z%>pc5j2^_bXUz+r*H29uX+nkBHo zxmNey%9>`@7qADkA~ekq9x_2*=F~qL74J_1ZN%1?^W^*9z9@=}8cO8Ionp6gJAGi}vK2BZrK<811e$_o zAE6aFS|)OC^DW$&9x86lZM1A|Z=ucHtSPqQkHudaUF8y3nEuXrUZyL;-L5 zyMvp}+e-eXRHBdeY6fRYBXd&ru(W~5oPb<{b~0EeR8>O65z_=z-{|=(+k+eJ5=jTY zJzrDK&9+sB)4q&MBm_HM&Bzqkkp68rGs~js*@ANfmLhM6 zL=c)aftoswX3V!7oJvYD9mruo2{=uSEv!#BF)cBj7HFvqTUjmOO-v{a$wf?A9ddF! zka`Y5MvvcpN&&VrnKAD@ch<2vABn2~L9G9wBrz3%7r$h4@v0*GcQm=+no&kK0FXGHJioY6j3KsHMDb zr85uYOo>0|9!yKt)LcR~LkSY{0DpMT=d{^|K+)fyM}1U01vmk?*jlC;Hd^pSR^ z7*dn+WLoBy9aAewGSftKV`-@W6QOME7uuN9Q9(>CWh+AGUYByU`=n=mw)Mz{_fI?@9cZ_?RUp{F=4o{)VXw^_sH47caNVxc=FZXee}+?E3SU} zj$6O>=JqP_n$Vn4Q-GvV9hIFO8Nb|mwn`;LQf^r5B88)-zyRkHDAAM6Ce6o^T&k5q zZ^_cvx~=W$>QmF7nSX-sNgJ7HKYG+xP^@HU5Y`1!2jKz+fB49Ky_LduUwiw7J%@*> z&;(doDgEc)c%r{hJaS?9&;IebiyXf5+SWf=^7N*)*Zt#`9U}=AkctEi5jP_yazGd- zdplOEafzX;G?GYCuw}NNp&)r|nD4M)W}!Tn3{?so^LCSed~3<2{F)SLQ=Dt#NO@^} zsZWdxJx~zFval<9fF8MF^^*B>cOE+Oqdgy9CN?3B$gAh~50pDNHJ2}(Q!2#6RW?}V zhmL=|VfBiux;rlpk5!2pz-z)m$LSY`})HaO6NM^+|bnCIV;yP4R)0?H^5lY~yn0CS7%@l6}5 zP5#}jyDn2a3{({DBO}Zp5^h3TmTXR8lW5a1MAlIS2|vJ_x)qz)p4M4WDUudpET&d zJo|E&kj2FYMHS?$mM!U>-3Rr?=N`Iiu-1I@*s%#?vvMn+Y;)d!UEXqe@3f z3lK71g5-H_Yt&o~OGaXNbOUf$oIc8+E#&Q~jLOO(m6bw>CUWg-k5Dd$D`z$rGDw&# z2`K=TQRu+gF?;CdbyE#`;k|t$z{dfmlp%(~qG)o~0dWa<1u#PPjqm+EvxW`scrUhvnN(r!5T|VGTkrCD@ z%WQf=+tJ-eOS~CmVJTFT5l0EH6eW~V0;&MqbKUY;T^(Bv9{FUlF(E{OaQ1|96Pr## zO9&l+0}(xT? zoZaQoBb{ylImHlUa!n$ArBuwx#@uG|(woQXLm30LK4i+84&@RPl1^x?GC@hI!4g0Z z!h<(oPXI6M-Zx4(DcBk6g2XZ{Ro-+N*n+6>hfi$YaP8uu$;soV&S1pm%CB4H2<2o-`(gqs)7Uo>~lzT;;;x->iiIEjMFiBT*OL4?>1&Bt$9 zyWyIv_nkWP&F6kRQESvu9Frg)1U3xul<-3&JPje8{b+!tJX$a^Wprik*vsySgWP02 zTq@aFfh;DM+qZ3VN$j{4GaCrfONBP~(7PA^4DAF8nH390#)6X0l#~E_fIoWs&6vP* zJNAwcs{%9$8pxW8${J}(dLsVtZ8uFe`TzdWOXuqKDqx+c4y;O%SR0AqHAOT)2qtTC zSZ%EdO5Ce@MQvjy=*1Q7lu_H_B!gzCQ^K+}vt&GPb&VL5>F8DKxD7t7f1=ASWcD;CY#dGy52GiOJkFafK=Ly={AjI2*&}6h&MKToell(Q+os&EUX7!hcmmzZE)OxMoKv;{xzPRcZBD9=LPr?vhfnH=KOsJ1#<^%Ou~ z{`es)G(X!kXWzXrW1$xZFv+4G&gw)E1RF!A({aJYM6p1iDP~aOSQ5xa(jg7C0mNUu z_s+SM&L6(J_x(%5BOr|pgu3!1xW>oT6go>KVpwZ76W|S^8bDQYw2&cyb%X?olhB`O zr=PUf5r7fiR`yfNd@wn%#}G72+R_T&%(9s=hMk$K)N_eaS`Im0_1S@8N+8)v6f;*( zdN4v^Ur_$)}Q_8tzqD!5DSxzSOd6>n?}NC=F0Wd zm%TVP%86!II++o6g1#cQq5>=FNKk-n8NXkD7XsY;s~XM?lTr$x)S z8TiboqHgKKoT=`7&K&;rjY+lHRl+Qf0Sd?zCRY)Hf_IA0RI+jDlF#0C`_g%R&4lkb zeC+V0@j-}3flmmvhD}BZ>LLkgQOUoc!oYBOv|4K>vwOM9KU_(Vm-xr~F}Z)`k}uqM&#aE(k+bK%w`J$f)0Zw$GzN`viiCZJ z&_qm3>muL~i)|-riA11F(j}3_9T!H%<`4AuR!Y%Wg5dKcl8wV+Xc6aWqQGSG$nC)$ zo}uLpqC^Li8B+duIaNKuk6FFvFs5*F==q-H$rD{tB@EsODB=_&D^t=5SP_g&1DO1) zJ2yOe`;AEx|KW{yU)cMz3xs2Yqrj_*!~hKg7fbohL^_Ais5)ILlG~00Zwh@l1q^#T zJEHNbZOUV)WoK+_+C!Lya;y>OYB^hqrTEpPhoB{Ns|smzm`}A09t*e@$^weR3Q|AO!kGW=L%;BumCMc#j{ofoZ|pvIc?g(tmnQ_8feoq3gi|8u zD&%{SLm$Ey)-69bI{MS&m&OghDb#$dT4R7+pUB zW!EE;XE)ukXljN8-pIVd$MlQ2i}vi4sw5cfATA{a^#d)6@%JCQ zfBmwn4xhdJ)n{KmGRcP_l1h(iC>)c91pLUMW)u?^0eYk6A3u2eRD*u=Z=N~c5R4od z)S_Bz08t?>cnze&Etu({p+E<4Bc;h0+t2a#i>j&_qg< zIgB!L!A;%)LLp%Xj()sh`8BsMUU>f4iK@IinHewSlJc5uSO~z>T%=`!e~YOMH~U|D zH>i+`SI1xy1kt1$q)DI=5Ac0TcNt}d`YsNV2Q>FD6Gk8i(r z@v^zI%STVD^$>YXfaPKd0P4+#s#u~_!j*BjopI{L_bq8cS~wN&iDQ2y>{?L@j}GL5 zp^ptK5ZJwHwJkyT*Tc86Jff(~DUucFF&B zU0W*6XWfD#xM3GLV;J~~KC^2ShnvqlRG|LGSLk&R1vfvpb6za`YCjwB#+$Ko7kxHY zLRp4AMgAvZSunEjO8SA8mf`oGdSu<=MSG8&{;TI+Jz0lggh}F45LFSCZ=DcN!n!%7 zzmx?nY($2Im?2WqtXr5yM9PsC4D>ZPT^Jda6@=PGBj4{cUX}uV?0b8Y4u1Ep4=Ek* zj!x4xEjo;;>j&7?8?JCCB0W&PQ)t^lq-vo_=OhY1P9}eL7-P8``HHUce|Y+_r3+`j zfB5v@JooyUIvWFCC#=gvX2HnP&EPDEc1Ks z7vn{ADhBv8W;m0bKy-5+M@ajj(QZ_g9{JWL{5s>-Ga%-`V{~|L)g^Ca3m)&<#q$P?x^Ac$(bZu|tx&;eQUKl(vINB7GVFJIV^YyuG)ivsSZqO%PVkU#8DulQrF?2rqHGy6t7`10o-9_Xq3`1S1vKREi>{dbobbQYs7Y!(GZDkdke zY0=q)N3!#zE((%~>?-%JOsqoC3)GLv(|2qnmb|+A-~b zxa;D0(^^Q<@JLkUi_Gt5VrQ@liA<$_;Ma7}?>xMjSmE#AdgnZk8Zrr_46vXG58Sb~ z-lUgy?VmsqA*>4ljVkAytP|FTsl7IUh$d*`TXBLE=t*S{yfBrJDbax`qM8#eryD$) zJoJlfJXY-=E_bxx;tq+%bpVe=S}k<|mPA&4BBCc0#Yml{jyU172L|3e_~8$??71-6 zh!J1dzWb@WZ~6DX{OF%Q^ZbF~sw~~-1-&;3Ls7VK{g)HWsA`OFgKvE{?M(T;!z1LsY z+t>4hE$lIL8E{i0J$89q6ibK61;tKl#E_|NZ$_cbqy` zglLjrO4%W@yeE>$G#v=DkS{N@FF*D0vIVpD96kNamR;k-nkaCO3el?G(nGi1INIPp zcz5rx2!8V#L=7&)H`hLf-HF!ia;*T;wb_1)gjClRQ~6>zItefo`6tI=u}e$AcL=_F z8j3SnJw~dAvVc_PSdp>R9${Lrc@b`0zVz`sH_V;YHCE$0cf9xTeRtn+^V+X}|Anu= z@y;-3lMu-yE}_30&FEWiyjO2Fp1gDYfBeFuZ|*wugRMJHPc_GcSq&y&C&Dhh2)8aA z_^rq8oZa2E|M=j;E~ z^L{-e#LvQDslMR00}Fy;18-~iqp}v|Z+1Ps;v}@C{-(FPA0LxcW-|Y(B%}nFI2>P8 zjvijS>i+dN40LxjlIGrhhlhv9zVfBd&*|?P9-X*6#Rqv|R46@Om$NK@tNwyJF`DM|OUA{Lm-o$D0B-FC#6RH~apZ*WPyhaz@FEJ3sjLmYo-P zEa5s4FCW0hmmav|+68mA9{lK~Lm!RHFuBM_02}r;j-$2PY?#UCQ=eK!;5zP;wQ?%y zCL`m6-7sz6JF>>2454d8inz&IGTC^_m{bNvNo3Q)Y~)Ygu;PoGH+Gkb)oOG1?)?+Z z=IS*oZo0lw-OOMmadyT>Q1+xHz}L~B|J)tayFKK#Z z#TZONrfSVFl8ZW0rx&*G-?e-HBX`}pas9exeWDm)U!`ZN+1!8pW$+O+1nGeg5)efH(EwZ<4k<1+h87OH@$akJK1z>DOm9LtZMu;$+X zN~$EOvpu>QyF;!^oEghMHVsm{Um%S8$$86s7h%Sgkk&4kiw(LwICkres~I*YIli=Q z_p7@Oot?rlaoeme_*f(#l}LGg!Zk0;WZVK^g*AH_U$tP)jVrEMxBTiky%ma*pX}K4 z%6o_ELJqJ=;FE%jLG_y|BK9I*S&4t=7av+Sf7Z!Mga7q=|9ot+J}R;7DTJzWz6p57 zOitgKd+$l-z*R{F`PA0uE&kVZ+=8YbT8n93|w-Pa;npb#s4 z$fJEnPCaqUx}{gm86IoAy=(tF9~?b5Q6CqX%Swz27+M7sWXdxYpxIR{Ts5ojs#$$Y zXZI~#FnjUbIi*qzQB+HkJ;zSJzW?y{k4}zIB=AxJ3@NNBF3XzleuR5gFMj%-+j~08 z?|yXRn=id}qFNsjp)aO{MqR`hg(f6l2x#+y%M>zWj0Fc|0@MCW<(GnOx)~%Rcy+iA z_|I8nlT~IBeWMDph4s>~W3uW`L7<4#-BUqG_WkVm4_|z1JYjWUl{o4v6-uRIxfpeI zl*{E(U!^k8)ln%I2KxGD_g8u<9juw4gy^dEsSXi2OzoinuU+ve*N+Vb0?~ezk6xRPYxa$;%pRXLNGokp^?b^Ql1STE5R7% zV5axCFMC_~w~*Db%8>uF8~KqD%&-Ly=)AMX1~tvF=KMHn&x{5Dd7ge2=Bu zEsy3GhD8zInpI0zuUgh@Gz)Po(IFuu7%@@NM^akyhAf^hj!jJ-KXv}h;NaOyBPY&} z96vueNi-o+p0Ngnsz|hjCPhMG)(Lqg^{dG|{s_`G!kZ6(A&WSZ2DQiuYWcN{$x0B{4UH!7t2LVc9G1M75lW7M zjeludy6XtEa#A7z(Q$#gA$@%2(zl-d$)+1u7mGy_04b{{&3dEJXe1NW`gpZEHC3Oe z)+9j|M0Q9*Dju$ zaCraNi66ha@4)HvgM<@+;~?T*Qv_8ZsYJ49lbMEl0pEqU>P(BgNWX_yJE)m+$UDJ+ z$>?_|n6AN~3oRI=ibYa30T@?MMWCe#L@+BwFod4=~UYO#M)c7h_ zRPTraFow+@3!jqAy>cx?f(ebH?YQ4#MLcEH69B2sQhICkBf)0dv9De_y z&)jg;y!|K7J@@+d!J>CL95zU$F-8p$F(96Lc2ekxWf{!8Vd0mytAP5OnD5C; zBxh1q1X;>jMz^VmGTytbmQmF-#-cYx_)?XrR5?-d*N?EE5Pfd*9rvuip~3l{4^Et? z;wW$_DHxc>8fAnIOm4ht&eQj7Tr_`HB-`l-8P8=wHj5e@n)POqBty08U%t3?+nLb@ z@{)|pth=iJhUE(n9sT5QfB2KpgeFx}8Cj3VrPrqe1E@m>q{>fIAerZFw@-o%$l;)Q z7vS(pCUPlB({u?Vot8>w0nwDdk-Cpa6r2jxqTOgC;rEC zFYP)rItX!1dJ4+ruK<(~=f(87JJ)Z%Wep>G?`KC296804WKLiA?B1UKu1ck|QY^#- zyjGv;@0+!#yQ>>VibMq_ocs057BgV`KRi}%%A{LqBcVfgB1u0Ru}2#UF-3c5vSssc z+sMXzqJg*3B|^nBo!T5~XD`t{!a^Z7>Qcvb+YZ@=t$B*B1ajcUQBKpsC@Chjn^!gdwOugIuV4N4{=-d?sjmeCmo|7qx3t$YW@IxjO#*#7 zC&It)ti3_tFf_DrQT@;nEg>i^qct`U)=kOD>#&_qz2pIoy1AJ;hG|J6Ob#lF(h}Z} z_**vzce&Ku`D@aC4|{fzkk)@U%P)}Ic9I{|Jk?S z+IFeIYeLsC6NJMERizur4wg(6zRm3{-M41R9ZMJf>4_hFaQKr$$4{+Uy7YmK>tA|j zcTB2Zl0Y-Yg^cD6na3WJ(kBMN@XJrY6rHs5wk^wfrOR5{aF4fJy@EXxn}k0rZ&Hx7 zx;FPbdTw)dRXc7bO^$(b@xk>sog2LLjc1;poTA0EyFdHLJxi}z^rzqb(Y9k}IIu2E z<`(GJf8mb1)-Ic>PW{hU-+c4KQRBogm>*R6$jrF>YE~MN$I9qKA+0YfCZ- zzCp>$Ti>~P>D71NwC00D$Hzv-pZVuk9=Pw0mCLRc`$bkfaG-lPu3fd~!@qv{?QxK{ zCYkN${0n!JKEjqm28ZXRNTG`0l@XF|GaWYUAzOw(o!Ton5tr%|+O>Z0_gp+tk_B`R1NO-`cwET)ioM3PEBC zU4pV1lsZ?D@}hKx7$h=YLoxD;!{d7oAKh^MiVfE-KXB;q*>jh^`-2yWk~k7gzIYUO z_jWz`;N4GbxZ$UVkDWbnTJAJZZk3B#7&YS>n5E!QAJJ2Jziww+hui1B)asC5)uFzz z*`y&g{rLpni}F3GZn-M6P>CdobihV{f9s8H@9p0I<)gf1~7v6a9==lWLyqKQ4 z`{qqIu9<4`uRs6t8;6fy1U@NqaHZGB>Jn6IN>EJ&BZajgry)BSLO}vXJwScMXz1cF z06zZ6oeyljt+QN_&0Uj(_|Wj!j(vx=>^=DX*S7xZ(@#v)8Y->U^fV?{G3D4P@4;$m zBP~o6(mGcKOp&JPcnm(j#(9oVT6EZw3u)+TTUz!}6+5Rcqj^=r5ulSJqlIF}@Wj;N z6Cam>U4Qk0C-2#~V0Pu?`Qg8Nb<6(qmxchwAd=372y)kCK6yei>S0o}3Nm9xSt%UY zO^XJ;^3dk)j#9Z;ib%M(G4ZHW9Gw^%x;#QnD0h_S%<6r7^XPR-@L$O zArOJCDwb+BAXuu_F`r1>QNkK(&S2v+c`}X^X~;Q`Gnry7*F>FYiw~qrFVcwWQUVkK z#)*ay-#_-r#+6IH^2J}Fi2C~~1nkwl2fq8(wlhr_0~!}Vk1D5XQn_3@GdMIpH8nauJ~lRX+YPJc_V)Jl%$}Np{RcnTwRb-ii@)tMn~92QMFlJ%R7&6IP)nJODySQ6l(%J#5LxVag{KKnB(Z_VWebL6D^r%icV z7p`&*rKKyvq>1df8cFbTQZ}s|=Jbu%-<)WE=Jw^+uqfVt^8Ab2-`jQO>=4IsP(2<5 zPA}v#QG>~1Ka}N{o)neaGHME#g4Z~`dF=FouYIRTJQm7LR1>|q`@_3#UAz9e6$|Fg zesKP#>(;FN>t~+*=1Xt&^z{u9Oo;6wdtrh??98KWxYa8eDhKUZ2oTd|o32l`SvQXJ zGF#ud-HzCKF~f9g1W$)5Co3_D^xD8~N@z_!nMy!w&06y>UVW?b${S2_`lM*>AgWG8 zCb=T9Ks!|pkJ{RvJ*&gWr~okrG$|QrLR8M8G)0maV6aXnw(b4Fw!Qu3!c&_!erE0J z^1#53(-)>rUmlU@XjOwA3Kuo00jVmR)J>b)bF1N=+2Zv`)1MRFeJQOQ(_LFlh$RQ> zaA5-f`9u!T7UR~1?Id$$6Pfo_mq>!>EkY~-oFW>MCaeMybtKK9Q$?ipjBJdH5s&-++qSxl{te=e)90ihFA$+mqp$>+KrT;Y}z*M%hhFh{-JMpc($02 zY-ClTB8wNJ(GDeJ(M%e3Th+_WbP_ZGlWrQVuZwc&1=^wSMzlEbLFAt0F~e)Xm8h|W#A zmW7ZYyXk}VQ9^;NAn>q`)}h}#{o(u-)K6hV<)@2+v=})vdR}Z^RQ{8EP8*sYcVWY2 z^WI(vi7{FGsM?Y1@Pb6L)O*fQ13Dmb>4bGCi(F)!TXymxAFxT^KpX0Z)-CyNdrI|X zx_fxkbY6};BzSP7H$*!sn=iS+RG7S7-9?MSXY*-L*gVD^%wvGWTBhR2MsJ`+e{@?2 zQeask`h#(mswyk8wDG0`Or*_3Wpo;QH*Hh7_H!ytMR;CKom*-vXL;&TH!4iuBubA) zE!NDTPX@@lf*$|r7BxUFAHg`R>R|(_owjLVYEqghMMreGmwH62)G2jgd&h~?Xwv2u zad)u%he{vlPU~%+|LtLT=eTo!&1TR)jvO2_Z1!lA8ev(3W|>ltWN2$wDRZU%kt zTD`(VDOH1J%}h1F0ywao%wO-xqhxSa)AP;biiXc93(ACS-W#T$Sd&_tbXJi2!6l{I z8*x|;HzZbPD~&U4XKwqLCq1CAB-OUbm(fAh54q`Px?5SMCiB1rW|%F~U2({Gn|2)g zlvqIRASkipS45EkG6Tc5?S{=2L^c%>J>6(_pdQWH$YeUyfSD_A4+Qx%3Mb~r0sHmKY)#>?kV}Qqd6qvhIP@{tBs=f?abejKQU9*eoRJxKx>^6=6!ob`moKxmT$G-Hp-6MM5)v~&2yF2C-bwj)65%YGk@~DUhu`P-+$N> zJ4mLVnlGuW1;S-lw_Fw4?v?`&4g7m?TpG{(`P8|utnp_}3TfYw)VExhl8ZDX7Hp$T zsf^=iO5s7=TG=i$i1d@fy}LBp#e3v~^U{>pOi6gRq*Zj__}OihvO3${dybeh@8V3i z==5m*H2v$T%e3pbsU6$I-nmI2s%xo@R(hao?MV=jnAyghE|39WFht$9GXzZZ5*RC3 z^z|mW##$wk8%q64GS5cK>f|eU`Ie(7&9@zBrte0ccQNPJxOj5cPlQLRlA0D)i4OVd@jcCgOI2d%(GXTlRCzJjfEkgOGPd#lXr4PtyWHsGm_S#&@dvnERct*RDdFD5_U?n#unl{6=A;_IHF)}CP z>LkY8_AfN8U5ri*v=Aw6PY-`G6;=qY$3IwjEn@}F*w<|NYpW5`KZT;)mGZd!9?RG+ z<0r(3(-ZpCzQIhW+>W;l&hBO-GL^zJ?FZ*a`g^=J`_GV|*!rgyUxqPU?S!|+-9II5 zTMy96OR!TlDF);ptbfrOM_C=gX2B3=%T5Eq;gMwhned4sZb>QpCe>y)4{i)R@ zvT14Q+TE-IpN=K%DE4051KDh#&PKaE@4@dJOf8e@jQJ`fEas~K*D^xbeD4;@AuFLj zY3Jb=n`3Z>jiu!IqGt8{yGo7ehkjgVc31giAAg{gWbTRH4f@^Peau?MBf*I#Yp0@Z ziRYC~m^;nkOXF4R(hABw$m`b#9(U+#rtJ1?+^daS@Bd^|iFH+lN8i*<=8Xd>kH)8B z?iJk@0dR0_h$6_h&6LNXM1MNT3X9r;+&^~ zOlKhbyF2w|t5bsMW;P2EH!a4}Bc~rQ9A1=+D>x%1Xyt@C*YAMdo?Rf+0_H9EomboJ z9fLD8vj?D3mOWd&va*76Zb$G@J(nhFpbF~&hB<1`N;OrUCbaZYjJo^$ z{nGILmD~Da$@upC{`C6(Ey4dPw)Pyc^>5DkHoEo!QcuK-Jwl-l}t(fQKv z{dds$V#@dygS`PvhX6is7Z+@*x-d;$ zb=6f@U3Jw}_s+W3%*+b9H_vS)-R#9?zrXogeLVI2We2RFTTAL}&3C8PS~<5D&v@UI z+`s*$wqQ=yd$laNUY-|ovcS9~n_90tFUdl#qq0tEUXle|k{Op|DHpSrbxEeZ5~$>o%>OSe z^=41qvh3LlC2xXzu+-2eQoqs1^L>7ylB$bCP);(%(xYZL1 cY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$g0yJLd;kCd diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..eba43b496c0cccf2797b50792b2752791bedb3d8 GIT binary patch literal 3197 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 Diq(pb literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bc048a2317920bbbe2d52c546fb1c8ee34c484bb GIT binary patch literal 3966 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 Y2UE;}fYF=LVE_OC07*qoM6N<$f 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 0ec303439225b78712f49115768196d8d76f6790..f38f4707d7c7d9693f0a79f3ea96f9adc1b65ca4 100644 GIT binary patch literal 13814 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index e9f5fea27c705180eb716271f41b582e76dcbd90..321ff0386db2dafce619ba9190b2fbfa1d4fdbed 100644 GIT binary patch literal 26750 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b519fcaeaa09de27c1f13719f2ee896b8173759d GIT binary patch literal 18393 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 AcK`qY literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 84ac32ae7d989f82d5e46a60405adcc8279e8001..c89875ebb337057df7e00fa3e53f6fcec8bb86dd 100644 GIT binary patch literal 6461 zcmV-D8N%j?P) zHvkTS#gQ5AV7mp}NJtPUE@2@7O->tfX3DFcym`d?eL{eE0jRZL6zAG?IFZW<0sZX3SI(;UQ^VSVAAfan9w zXn}(TR;f1rJYTbAPEMV>teXd}J4F>S_44WQozry;}-y(^y?@2^KRCt`7TM3XJ)p72AGyk!dw7c5XjTeCgLI)C-kXRuZO95gloIWsB zu2k8^B(YtNE2)ahM;u7msY>EhIWdkaMJm1mwjv5JDaisM0U}t|g(MJ?U=avbXm#vr zum9Npn0cMNbKcDV|ErDv+S;9+e`en6*WF)#-LJ=o%X|=kYR-T>iRO&H01=527f=3V zsCoD#<4*0NdJd=`g1`{`%RRAHLTdbN!=cTMliWL%CtqH2M?&>S{OeEQL3JOEHD{o) z8p-^&kE&JU@1wVRpQMC{Qb=U>7YP9v0IzpVa>UDhw7`Bs z#g`dB8bDv=j@Mvp*AOs%!0TO44bD$KN~5dA^?vl9)?uxfv40V<(Ma(%MwF6}cF5RC zJzFWiSp%9>&r`>t1R|o=q$_sgN$Ytvn1uQkAubY0sR%;xS5B0yXDSiFlad1o?b(C6 zwwjQ$5jb0ri^Q!3o=CQO>aws=3r>h)#$?4KAs~|vVbSnNdNEOn84@vZDDLG1+(^zZ zr`yY*2B`qjNXRJ|eZt33PElE&C-nhBFa>5552u8Y67=0f#N@vofLatGGYXlhCh*k# z)P^7BDTEeXf8P%pBs2%)$QB#UxV(^r%(3!HwcH3w&Ip^hmON&?Q-vIK{<^^Pdr0Vu z;gOjs#vKw3P8xNY8<|F&*hyCe`5iKI3XQcBK()bSlESOivWtCL##2{3koM`zyQFxG zBG|VA2&H*-CczAXNox`dA%r_J^M#WtAoK)uX_8a0_z z5mTT-X2#ZOZIBQ#$k?S7NnsKfKXx+Y8JXo*0=qpDqX$!)Fj-Y5%{8u+nlFWTOwNsg zGIa!FlN3p$CT-0!x*bg%vT)+A0&{Fi3XIkjnYl5PGla{j6cvCfe@_ZIiG=d$7Gqd6 zQ8aK( zsoQDkfuf})a*ajY?*W&#Ay^1%b0UruXmVi0*I=vgmgG`-Ql*KHjZykDMIk*ckGhvB zLo(lz8Cyf5aXFX90@OI6)H_j1#4$_(rGfkM8flJLBCH@(l$_CXlt*}SP;L;UmTXH# zX$DLPscb3EV5N|PdvOUl=t!vT)5_+k$jw~|^ey7I3a#p)lmbj6Zzjq@n1wJS70Ut2 z07bwec}2u3XMtP~18Q7q-BSx9EO_%kgzIPyvN0uhWcrG$Q-s%FZDBeo6ILo@bz@|ph>2SiWL2g z@*CGU&3TO0O|4lPP)ZoCoYwN)Pv12(KK74Ww)bBgZX!yj)0=x&KK!XWzVY}|hsO&Q z;8nm7SU|>mz`6`Gu_UqFvCm{e#y|=c?O^dII*aBq�#3#6a^XM&t`8q!tM0F#OgX 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 XqMT0rb($p}00000NkvXXu0mjf9(YFM delta 749 zcmVg;Ps8|O$@u8^{Z_{KM!@$5TAfS6_e#O{MZfpz`2O`0$7~@NRr(1{THzH08y3x{{PYM{eL;T_A9^tcF_4Sxb`8l z_9V3RD6;a(-0A^Pjsi!1?)d#Ap4Tk3^CP0(07;VpJ7@tgQ}z4)*zx@&yZwC9`DV-b z0ZobH_5IB4{KxD3;p_6%|f=bdFhu+F!zMZ2UFj;GUKX7tI;hv3{q~!*pMj75WP_c}> z6)IWvg5_yyg<9Op()eD1hWC19M@?_9_MHec{Z8n3FMs~w_u?Av_yNBmRxVYrpi(M% zFMP21g+hmocQp3ay*Su=qM6He)*HaaTg$E^sym`(t%s3A)x!M+vfjXUBEpK6X9%iU zU!u9jj3(-$dM~sJ%Liy#?|+!6IY#MTau#O6vVj`yh_7%Ni!?!VS+MPTO(_fG+1<#p zqu;A#i+_(N%CmVnYvb>#nA{>Q%3E`Ds7<~jZMywn@h2t>G-LrYy7?Dj{aZqhQd6tzX%(Trn+ z)HNF}%-F{rr=m*0{=a;s#YDL00000NkvXXu0mjfb7q+m diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 8953cba09064923c5daf2d37e7c3c836ccdd794b..ce9436dd6436e2fbe0f7098343f19dfbb51d9ee2 100644 GIT binary patch literal 20513 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 delta 1218 zcmV;z1U>tqpaIGWkQsji0000l9MBU0009V4OjJex|Nm6Q_$jvb0au$-#rXRD|5(QO z{Qm#_{{H^|{{U8+R>k;B!uRL){b9-YNx}D?-TM6f{zbp{`~3X}Tb%$&k_1|u zfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H=Y@z@@bOAMB5Ltl$E>bJJ z{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|Ni~t=w02?-0&j0TD{>bb6 zsNwsK*!p?V`RIS|^^~{NQ;oVfi@GXtsy}m|06&ZXRfhl}L;FffSO5S6eMv+?RCwC$ zm+Mj*K@f#|VPSRzV-`>`5=AivqaegY#CX>v=6+A!|4lL@R9e~05Q;d{YJXM!v7q>> z&!M*ghG7_nVHk#Ch$1t?5a0tTVJH&ZBLEH`Sebvn1@3nI=#>g9wp4IUiKWZU*nra%8XRM`ec%3_8fn6*N~&dEd0kD-FRV|g=|QuUsuh> z-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw@1|eLG>!8ruU1pF zXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7AkD(jpw|oZLNiA> z;>>?C9}bLOXyzQ{1Rn4<%v)eC3l%nM2G34t{)-XFW3|MzCkLnfZHeN+{A#^TwHZ+!{p9q?%c*%w{Z< z=GMTm8KyaBqw(Y0Cy2orXm)b;<)J!_v$f9pF07*qoM6N<$f+O*SEC2ui diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0467bf12aa4d28f374bb26596605a46dcbb3e7c8..06a3e50d200c5d3ea06785943ca401bc9e950ad9 100644 GIT binary patch literal 23758 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 _instance; LocalDbService._internal(); + static const int _dbVersion = 8; + Future get database async { if (_database != null) return _database!; _database = await _initDb(); return _database!; } + Future _createMessagesTable(Database db) async { + await db.execute(''' + CREATE TABLE messages( + id INTEGER PRIMARY KEY, + sender_id INTEGER, + receiver_id INTEGER, + content TEXT, + timestamp TEXT, + delivered_at TEXT, + read_at TEXT, + reply_to_id INTEGER, + reply_to_text TEXT, + edited_at TEXT, + message_type TEXT DEFAULT 'text', + file_id TEXT, + encrypted_key TEXT, + file_name TEXT, + file_size INTEGER + ) + '''); + } + Future _initDb() async { String path = join(await getDatabasesPath(), 'chat_app.db'); return await openDatabase( path, - version: 7, + version: _dbVersion, onCreate: (db, version) async { - await db.execute(''' - CREATE TABLE messages( - id INTEGER PRIMARY KEY, - sender_id INTEGER, - receiver_id INTEGER, - content TEXT, - timestamp TEXT, - delivered_at TEXT, - read_at TEXT, - reply_to_id INTEGER, - reply_to_text TEXT, - edited_at TEXT, - message_type TEXT DEFAULT 'text', - file_id TEXT, - encrypted_key TEXT - ) - '''); + await _createMessagesTable(db); }, onUpgrade: (db, oldVersion, newVersion) async { + if (oldVersion < 8) { + // v8: stop storing media bytes in SQLite; rebuild messages table. + await db.execute('DROP TABLE IF EXISTS messages'); + await _createMessagesTable(db); + return; + } if (oldVersion < 2) { await db.execute('ALTER TABLE messages ADD COLUMN delivered_at TEXT'); await db.execute('ALTER TABLE messages ADD COLUMN read_at TEXT'); @@ -79,15 +93,7 @@ class LocalDbService { print('encrypted_key column already exists: $e'); } } - if (oldVersion < 7) { - try { - await db.execute( - 'ALTER TABLE messages ADD COLUMN local_file_bytes BLOB', - ); - } catch (e) { - print('local_file_bytes column already exists: $e'); - } - } + // old migrations kept for safety, but v8 rebuild returns early. }, ); } @@ -121,12 +127,11 @@ class LocalDbService { 'reply_to_id': msg.replyToId, 'reply_to_text': msg.replyToText, 'edited_at': msg.editedAt?.toIso8601String(), - 'message_type': msg.messageType == MessageType.image - ? 'image' - : 'text', + 'message_type': msg.messageType.name, 'file_id': msg.fileId, 'encrypted_key': msg.encryptedFileKey, - 'local_file_bytes': msg.localFileBytes, + 'file_name': msg.fileName, + 'file_size': msg.fileSize, }, conflictAlgorithm: ConflictAlgorithm.replace); } else { // Если это Map из API @@ -145,6 +150,8 @@ class LocalDbService { 'message_type': msg['message_type'] ?? 'text', 'file_id': msg['file_id'], 'encrypted_key': msg['encrypted_key'], + 'file_name': msg['file_name'], + 'file_size': msg['file_size'], }, conflictAlgorithm: ConflictAlgorithm.replace); } } @@ -211,19 +218,6 @@ class LocalDbService { ); } - Future updateMessageLocalFileBytes( - int messageId, - Uint8List localFileBytes, - ) async { - final db = await database; - await db.update( - 'messages', - {'local_file_bytes': localFileBytes}, - where: 'id = ?', - whereArgs: [messageId], - ); - } - Future updateMessageContent( int messageId, String content, diff --git a/lib/data/datasources/ws_client.dart b/lib/data/datasources/ws_client.dart index 462be8e..f1fd482 100644 --- a/lib/data/datasources/ws_client.dart +++ b/lib/data/datasources/ws_client.dart @@ -8,10 +8,9 @@ import 'package:chepuhagram/core/constants.dart'; import 'package:flutter/widgets.dart'; class SocketService with WidgetsBindingObserver { - static final SocketService _instance = SocketService._internal(); factory SocketService() => _instance; - + SocketService._internal() { WidgetsBinding.instance.addObserver(this); } @@ -24,8 +23,8 @@ class SocketService with WidgetsBindingObserver { Stream> get messages => _messageController.stream; bool allowConnect = true; // Флаг для контроля подключения + Timer? _connectTimer; - @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { @@ -33,29 +32,42 @@ class SocketService with WidgetsBindingObserver { } else { allowConnect = false; disconnect(); - } + } + } + + Future startConnect(ApiService apiService) async { + if (_connectTimer != null && _connectTimer!.isActive) + return; // Уже запущено + _connectTimer = Timer.periodic(const Duration(seconds: 15), (_) { + connect(apiService); + }); } Future connect(ApiService apiService) async { final token = await apiService.getAccessToken(); if (_channel != null) return; // Уже подключены if (token == null || token.isEmpty) { - print('❌ SocketService.connect: no access token, skipping connect'); - return; + throw Exception('Нет токена доступа. Пожалуйста, войдите в систему.'); } if (!allowConnect) return; // Не разрешаем подключение - // В FastAPI эндпоинт ожидает токен в URL-параметре - final uri = Uri.parse("${AppConstants.wsUrl}/ws?token=$token"); + // print("✅ Токен получен, устанавливаем WebSocket соединение..."); - //_channel = WebSocketChannel.connect(uri); - - _channel = IOWebSocketChannel.connect( - uri, - connectTimeout: Duration(seconds: 10), - ); + startConnect( + apiService, + ); // Запускаем таймер на случай, если соединение не установится try { + // В FastAPI эндпоинт ожидает токен в URL-параметре + final uri = Uri.parse("${AppConstants.wsUrl}/ws?token=$token"); + + //_channel = WebSocketChannel.connect(uri); + + _channel = IOWebSocketChannel.connect( + uri, + connectTimeout: Duration(seconds: 10), + ); + await _channel!.ready; _channel!.stream.listen( (data) { @@ -68,10 +80,10 @@ class SocketService with WidgetsBindingObserver { ); } on TimeoutException catch (_) { _channel = null; - throw Exception('timeout'); + throw Exception('Превышено время ожидания. Пожалуйста, попробуйте позже.'); } catch (e) { _channel = null; - throw Exception("Ошибка подключения: $e"); + throw Exception('Ошибка при подключении к WebSocket: $e'); } } @@ -85,7 +97,10 @@ class SocketService with WidgetsBindingObserver { if (_channel == null) { if (retryCnt < maxRetries) { // Schedule retry with exponential backoff - Future.delayed(Duration(seconds: 1 << retryCnt), () => sendMessage(data, retryCnt: retryCnt + 1)); + Future.delayed( + Duration(seconds: 1 << retryCnt), + () => sendMessage(data, retryCnt: retryCnt + 1), + ); } return false; } @@ -111,5 +126,7 @@ class SocketService with WidgetsBindingObserver { void disconnect() { _channel?.sink.close(status.normalClosure); _channel = null; + _connectTimer?.cancel(); + _connectTimer = null; } } diff --git a/lib/data/models/contact_model.dart b/lib/data/models/contact_model.dart index 7098b78..a1b52b8 100644 --- a/lib/data/models/contact_model.dart +++ b/lib/data/models/contact_model.dart @@ -1,4 +1,5 @@ import '/core/constants.dart'; +import 'package:chepuhagram/data/models/message_model.dart'; class Contact { final int id; @@ -11,10 +12,17 @@ class Contact { final DateTime? lastMessageTime; final bool isOnline; final int unreadCount; - final String? publicKey; + String? publicKey; final bool isLastMsgDecrypted; + final int? lastMessageId; + final MessageType? lastMessageType; - String? get effectiveAvatarUrl => avatarUrl ?? (avatarFileId != null ? '${AppConstants.baseUrl}/media/$avatarFileId' : null); + String? get effectiveAvatarUrl { + if (avatarFileId != null && avatarFileId!.isNotEmpty) { + return '${AppConstants.baseUrl}/media/$avatarFileId'; + } + return avatarUrl; +} Contact({ required this.id, @@ -29,6 +37,8 @@ class Contact { this.unreadCount = 0, this.publicKey, this.isLastMsgDecrypted = false, + this.lastMessageId, + this.lastMessageType, }); Contact copyWith({ @@ -44,6 +54,8 @@ class Contact { int? unreadCount, String? publicKey, bool? isLastMsgDecrypted, + int? lastMessageId, + MessageType? lastMessageType, }) { return Contact( id: id ?? this.id, @@ -51,13 +63,15 @@ class Contact { name: name ?? this.name, surname: surname ?? this.surname, lastMessage: lastMessage ?? this.lastMessage, - avatarFileId: avatarFileId, - avatarUrl: avatarUrl, + avatarFileId: avatarFileId ?? this.avatarFileId, + avatarUrl: avatarUrl ?? this.avatarUrl, lastMessageTime: lastMessageTime ?? this.lastMessageTime, isOnline: isOnline ?? this.isOnline, unreadCount: unreadCount ?? this.unreadCount, publicKey: publicKey ?? this.publicKey, isLastMsgDecrypted: isLastMsgDecrypted ?? this.isLastMsgDecrypted, + lastMessageId: lastMessageId ?? this.lastMessageId, + lastMessageType: lastMessageType ?? this.lastMessageType, ); } @@ -78,10 +92,12 @@ class Contact { avatarFileId: json['avatar_file_id'] ?? json['avatarFileId'], avatarUrl: json['avatar_url'] ?? json['avatarUrl'], lastMessageTime: parseTime(json['last_message_time'] ?? json['lastMessageTime']), - isOnline: (json['is_online'] ?? json['isOnline']) == true, + isOnline: (json['online'] ?? json['Online']) == true, unreadCount: int.tryParse((json['unread_count'] ?? json['unreadCount'] ?? 0).toString()) ?? 0, publicKey: json['public_key'], isLastMsgDecrypted: json['is_last_msg_decrypted'] ?? false, + lastMessageId: int.tryParse((json['last_message_id'] ?? json['lastMessageId'] ?? 0).toString()) ?? 0, + lastMessageType: MessageModel.parseMessageType(json['last_message_type'] ?? json['lastMessageType'] ?? 'text'), ); } } diff --git a/lib/data/models/lib — ярлык.lnk b/lib/data/models/lib — ярлык.lnk new file mode 100644 index 0000000000000000000000000000000000000000..8621c20d1e3afb4066bb4b762f5aa0315da552c2 GIT binary patch literal 1048 zcma)5TT4_?6#hmhP`e$|B*oN<(kP~5^`KLd)i6#LIV5G)2|SLYGcx9MW`=qQBr3X$ zK^PJxhJ+=8J`{AJEc^jMLr|3YP%k|cr2`T6*0+u`D$;EqzO~ohd#&}Ywe~*y09dk9 zD1lK^!Wl&x6zU`K7dPu(j$0gRQ|iR0am&Nh@X30vr_Jb>R1)(ZOEwDKA8KMnpY49- z_S-aUP}SaCY;xGOd8V>Fj#6{?x~5-L;0#2UL(peHyQ@!gf9{3nHNH!mIw2(!gRCK?}eDDUNHSbo$ z>bYM)m<($;|4*6PAKIkNR3j0AazaS&<+M45uLNBKu1Z^f#i`Df-1muri}*HmqhsL6 RWai-e$=7w!l0n%|j$epH-CzI! literal 0 HcmV?d00001 diff --git a/lib/data/models/message_model.dart b/lib/data/models/message_model.dart index c4b3b11..58d9f6e 100644 --- a/lib/data/models/message_model.dart +++ b/lib/data/models/message_model.dart @@ -1,8 +1,9 @@ import 'dart:typed_data'; +import 'dart:io'; -enum MessageStatus { sending, sent, delivered, read, failed } +enum MessageStatus { encrypting, sending, sent, delivered, read, failed } -enum MessageType { text, image } +enum MessageType { text, image, video, file, videoNote, voiceNote } class MessageModel { final int? id; // server id (null пока не подтверждено сервером) @@ -16,10 +17,12 @@ class MessageModel { final int? replyToId; // ID сообщения, на которое отвечают final String? replyToText; // текст сообщения, на которое отвечают (для отображения) final DateTime? editedAt; - final Uint8List? localFileBytes; + final File? localFile; final MessageType messageType; final String? fileId; final String? encryptedFileKey; + final String? fileName; + final int? fileSize; MessageModel({ this.id, @@ -33,10 +36,12 @@ class MessageModel { this.replyToId, this.replyToText, this.editedAt, - this.localFileBytes, + this.localFile, this.messageType = MessageType.text, this.fileId, this.encryptedFileKey, + this.fileName, + this.fileSize }); MessageModel copyWith({ @@ -51,10 +56,12 @@ class MessageModel { int? replyToId, String? replyToText, DateTime? editedAt, - Uint8List? localFileBytes, + File? localFile, MessageType? messageType, String? fileId, String? encryptedFileKey, + String? fileName, + int? fileSize, }) { return MessageModel( id: id ?? this.id, @@ -68,10 +75,12 @@ class MessageModel { replyToId: replyToId ?? this.replyToId, replyToText: replyToText ?? this.replyToText, editedAt: editedAt ?? this.editedAt, - localFileBytes: localFileBytes ?? this.localFileBytes, + localFile: localFile ?? this.localFile, messageType: messageType ?? this.messageType, fileId: fileId ?? this.fileId, encryptedFileKey: encryptedFileKey ?? this.encryptedFileKey, + fileName: fileName ?? this.fileName, + fileSize: fileSize ?? this.fileSize, ); } @@ -79,6 +88,7 @@ class MessageModel { final senderId = int.parse(json['sender_id'].toString()); final receiverId = int.parse((json['receiver_id'] ?? json['recipient_id']).toString()); final createdAtRaw = (json['created_at'] ?? json['timestamp']).toString(); + final messageTypeStr = json['message_type']?.toString() ?? 'text'; return MessageModel( id: json['id'] == null ? null : int.tryParse(json['id'].toString()), @@ -92,12 +102,52 @@ class MessageModel { replyToId: json['reply_to_id'] == null ? null : int.tryParse(json['reply_to_id'].toString()), replyToText: json['reply_to_text'] == null ? null : json['reply_to_text'].toString(), editedAt: json['edited_at'] == null ? null : DateTime.tryParse(json['edited_at'].toString()), - messageType: json['message_type'] == 'image' ? MessageType.image : MessageType.text, + messageType: MessageModel.parseMessageType(messageTypeStr), fileId: json['file_id']?.toString(), encryptedFileKey: json['encrypted_key']?.toString(), + fileName: json['file_name']?.toString(), + fileSize: json['file_size'] == null ? null : int.tryParse(json['file_size'].toString()), ); } + static MessageType parseMessageType(String typeStr) { + switch (typeStr.toLowerCase()) { + case 'image': + return MessageType.image; + case 'video': + return MessageType.video; + case 'file': + return MessageType.file; + case 'video_note': + case 'videonote': + return MessageType.videoNote; + case 'voice_note': + case 'voicenote': + return MessageType.voiceNote; + case 'text': + default: + return MessageType.text; + } + } + + + static String getMediaPreview(MessageType type) { + switch (type) { + case MessageType.videoNote: + return '[Кружок]'; + case MessageType.voiceNote: + return '[Голосовое]'; + case MessageType.image: + return '[Фото]'; + case MessageType.video: + return '[Видео]'; + case MessageType.file: + return '[Файл]'; + case MessageType.text: + return ''; + } + } + Map toJson() { return { 'id': id, @@ -110,9 +160,11 @@ class MessageModel { 'reply_to_id': replyToId, 'reply_to_text': replyToText, 'edited_at': editedAt?.toIso8601String(), - 'message_type': messageType == MessageType.image ? 'image' : 'text', + 'message_type': messageType.name, 'file_id': fileId, 'encrypted_key': encryptedFileKey, + 'file_name': fileName, + 'file_size': fileSize, }; } } diff --git a/lib/data/repositories/contact_repository.dart b/lib/data/repositories/contact_repository.dart index 541d925..9d04834 100644 --- a/lib/data/repositories/contact_repository.dart +++ b/lib/data/repositories/contact_repository.dart @@ -3,88 +3,155 @@ import 'package:http/http.dart' as http; import '/core/constants.dart'; import '/data/models/contact_model.dart'; import '/domain/services/api_service.dart'; +import 'package:flutter_http_cache/flutter_http_cache.dart'; class ContactRepository { - final http.Client _client = http.Client(); + late final CachedHttpClient _client; + bool _isCacheInitialized = false; final ApiService _apiService = ApiService(); - Future> fetchChatContacts() async { - final token = await _apiService.getAccessToken(); - - - DateTime now = DateTime.now(); + ContactRepository() { + _initCachedClient(); + } - Duration offset = now.timeZoneOffset; - - if (token == null) { - throw Exception('No access token'); - } - - final response = await _client.get( - Uri.parse('${AppConstants.baseUrl}/users/chats'), - headers: { - 'Authorization': 'Bearer $token', - 'Content-Type': 'application/json', - }, + // Единая инициализация кэша для всех запросов репозитория + void _initCachedClient() { + final cache = _apiService.cache; + _client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, ); + } - if (response.statusCode == 200) { - final List data = jsonDecode(utf8.decode(response.bodyBytes)); - print(data); - List contacts = data.map((json) => Contact.fromJson(json)).toList(); - for (var item in contacts) { - if (item.lastMessageTime != null) { - DateTime serverTime = item.lastMessageTime!; - item = item.copyWith(lastMessageTime: serverTime.add(offset)); - } - } - return contacts; - } else { - throw Exception('Failed to load contacts'); + Future _ensureCacheReady() async { + if (!_isCacheInitialized) { + await _apiService.cache.initialize(); + _isCacheInitialized = true; } } - Future> fetchAllUsers() async { + Future> fetchChatContacts({bool forceRefresh = false}) async { final token = await _apiService.getAccessToken(); DateTime now = DateTime.now(); Duration offset = now.timeZoneOffset; - + + final Map requestHeaders = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + if (forceRefresh) { + requestHeaders['Cache-Control'] = 'no-cache'; + } + + await _ensureCacheReady(); + + try { + final response = await _client.get( + Uri.parse('${AppConstants.baseUrl}/users/chats'), + headers: requestHeaders, + ); + + if (response.statusCode == 200) { + final List data = jsonDecode(utf8.decode(response.bodyBytes)); + print(data); + return data.map((json) { + final contact = Contact.fromJson(json); + print(contact.lastMessageType); + if (contact.lastMessageTime != null) { + return contact.copyWith( + lastMessageTime: contact.lastMessageTime!.add(offset), + ); + } + return contact; + }).toList(); + } else { + throw Exception('Failed to load contacts'); + } + } catch (e) { + print( + '⚠️ Ошибка сети при загрузке контактов: $e. Пробуем строгий кэш...', + ); + + // FALLBACK: Если сеть упала, принудительно создаем запрос с политикой cacheOnly + final offlineClient = CachedHttpClient( + cache: _apiService.cache, + defaultCachePolicy: CachePolicy.cacheOnly, // Читаем строго из кэша + ); + + try { + final response = await offlineClient.get( + Uri.parse('${AppConstants.baseUrl}/users/chats'), + headers: requestHeaders, + ); + + final List data = jsonDecode(utf8.decode(response.bodyBytes)); + return data.map((json) => Contact.fromJson(json)).toList(); + } catch (cacheError) { + throw Exception('Нет доступа к сети. Проверте подключение к интернету.'); + } + } + } + + Future> fetchAllUsers({bool forceRefresh = false}) async { + final token = await _apiService.getAccessToken(); + + DateTime now = DateTime.now(); + Duration offset = now.timeZoneOffset; + if (token == null) { throw Exception('No access token'); } + final Map requestHeaders = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + if (forceRefresh) { + requestHeaders['Cache-Control'] = 'no-cache'; + } + await _ensureCacheReady(); final response = await _client.get( Uri.parse('${AppConstants.baseUrl}/users/all'), - headers: { - 'Authorization': 'Bearer $token', - 'Content-Type': 'application/json', - }, + headers: requestHeaders, ); if (response.statusCode == 200) { final List data = jsonDecode(utf8.decode(response.bodyBytes)); - List contacts = data.map((json) => Contact.fromJson(json)).toList(); - for (var contact in contacts) { + return data.map((json) { + final contact = Contact.fromJson(json); if (contact.lastMessageTime != null) { - DateTime serverTime = contact.lastMessageTime!; - contact = contact.copyWith(lastMessageTime: serverTime.add(offset)); + return contact.copyWith( + lastMessageTime: contact.lastMessageTime!.add(offset), + ); } - } - return contacts; + return contact; + }).toList(); } else { throw Exception('Failed to load contacts'); } } - Future fetchContactById(int userId) async { + Future fetchContactById( + int userId, { + bool forceRefresh = false, + }) async { final token = await _apiService.getAccessToken(); + + final Map requestHeaders = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + if (forceRefresh) { + requestHeaders['Cache-Control'] = 'no-cache'; + } + await _ensureCacheReady(); final response = await _client.get( Uri.parse('${AppConstants.baseUrl}/users/$userId'), - headers: { - 'Authorization': 'Bearer $token', - 'Content-Type': 'application/json', - }, + headers: requestHeaders, ); if (response.statusCode == 200) { @@ -94,4 +161,39 @@ class ContactRepository { throw Exception('Не удалось загрузить данные контакта'); } } + + Future>> getLastMessagesForContact( + int contactId, { + int limit = 2, + bool forceRefresh = false, + }) async { + final token = await _apiService.getAccessToken(); + if (token == null) { + throw Exception('No access token'); + } + + final Map requestHeaders = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + if (forceRefresh) { + requestHeaders['Cache-Control'] = 'no-cache'; + } + + await _ensureCacheReady(); + final response = await _client.get( + Uri.parse( + '${AppConstants.baseUrl}/messages/last?contact_id=$contactId&limit=$limit', + ), + headers: requestHeaders, + ); + + if (response.statusCode == 200) { + final List data = jsonDecode(utf8.decode(response.bodyBytes)); + return data.map((item) => item as Map).toList(); + } else { + throw Exception('Failed to load last messages'); + } + } } diff --git a/lib/domain/services/api_service.dart b/lib/domain/services/api_service.dart index 0a7c52d..7bf47a8 100644 --- a/lib/domain/services/api_service.dart +++ b/lib/domain/services/api_service.dart @@ -1,49 +1,244 @@ +import 'dart:math'; +import 'package:chepuhagram/data/models/contact_model.dart'; import 'package:jwt_decoder/jwt_decoder.dart'; import 'dart:convert'; import 'dart:typed_data'; - +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:chepuhagram/core/constants.dart'; +import 'package:flutter_http_cache/flutter_http_cache.dart'; import 'package:http/http.dart' as http; +import 'package:path_provider/path_provider.dart'; +import 'dart:io'; class ApiService extends ChangeNotifier { final _client = http.Client(); final _storage = const FlutterSecureStorage(); bool _isRefreshing = false; + bool _isCacheInitialized = false; - Future uploadMedia(List bytes, {String purpose = 'media'}) async { + final cache = HttpCache( + config: const CacheConfig( + maxMemorySize: 100 * 1024 * 1024, // 100MB + maxDiskSize: 500 * 1024 * 1024, // 500MB + ), + ); + + Future _ensureCacheReady() async { + if (!_isCacheInitialized) { + await cache.initialize(); + _isCacheInitialized = true; + } + } + + /// Получает данные пользователя (включая его публичный ключ E2EE) по username + Future getUserByUsername(String username) async { try { - final token = await getAccessToken(); - var request = http.MultipartRequest( - 'POST', - Uri.parse('${AppConstants.baseUrl}/media/v2/upload'), - ); - request.headers.addAll({ - 'Authorization': 'Bearer $token', - }); - // Добавляем файл в запрос - request.files.add( - http.MultipartFile.fromBytes( - 'file', - bytes, - filename: 'media.enc', // Имя файла для сервера - ), - ); - // Добавляем purpose - request.fields['purpose'] = purpose; - - var streamedResponse = await request.send().timeout(Duration(seconds: 30)); - var response = await http.Response.fromStream(streamedResponse); - - if (response.statusCode == 200) { - // Предполагаем, что сервер возвращает JSON {"file_id": "..."} - final data = jsonDecode(response.body); - return data['file_id']; + // Подставляй свой эндпоинт, например: /users/by-username/ + final response = await Dio().get('/users/by-username/$username'); + + if (response.statusCode == 200 && response.data != null) { + // Парсим полученные данные в модель контакта. + // Убедись, что метод Contact.fromJson или Contact.fromMap корректно обрабатывает поле public_key + return Contact.fromJson(response.data); } return null; } catch (e) { - print("Ошибка API при загрузке: $e"); + print("[ApiService] Ошибка при получении пользователя по username: $e"); + return null; + } + } + + Future copyMediaOnServer(String fileId, int receiverId) async { + try { + final token = await getAccessToken(); + final response = await Dio().post( + '${AppConstants.baseUrl}/media/copy', + data: FormData.fromMap({'file_id': fileId, 'receiver_id': receiverId}), + options: Options(headers: {'Authorization': 'Bearer $token'}), + ); + if (response.statusCode == 200) { + return response.data['new_file_id']; + } + } catch (e) { + print("Ошибка копирования на сервере: $e"); + } + return null; + } + + Future uploadFile( + List bytes, { + String purpose = 'media', + Function(double)? onProgress, + }) async { + final token = await getAccessToken(); + final dio = Dio(); + final formData = FormData.fromMap({ + 'file': MultipartFile.fromBytes(bytes, filename: 'media.enc'), + 'purpose': purpose, + }); + + final response = await dio.post( + '${AppConstants.baseUrl}/media/v2/upload', + data: formData, + onSendProgress: (sent, total) { + onProgress?.call(sent / total); + }, + options: Options(headers: {'Authorization': 'Bearer $token'}), + ); + + return response.data['file_id']; + } + + Future<(int?, String?)> getRemoteFileSizeAndName(String fileId) async { + try { + final token = await getAccessToken(); + final url = + '${AppConstants.baseUrl}/media/size/$fileId'; // Скорректируй путь согласно роутеру + + final response = await Dio().get( + url, + options: Options( + headers: { + 'Authorization': 'Bearer $token', // Твой токен, если требуется + }, + ), + ); + + if (response.statusCode == 200 && response.data != null) { + // Извлекаем размер из JSON: {"file_id": "...", "size": 123456} + final intSize = response.data['size'] as int?; + String? fileName = response.data['file_name'] as String?; + + if (fileName != null) { + fileName = Uri.decodeComponent(fileName); + print("Имя файла, полученное от сервера: $fileName"); + } + debugPrint( + 'Успешно получен размер файла через API-size: $intSize байт', + ); + return (intSize, fileName); + } + } catch (e) { + debugPrint('Ошибка при получении размера файла через API-size: $e'); + } + return (null, null); + } + + Future<(http.ByteStream, String)> downloadFileAsStream(String fileId) async { + final token = await getAccessToken(); // Получаем JWT токен авторизации + + final url = Uri.parse( + '${AppConstants.baseUrl}/media/$fileId', + ); // Замените на ваш эндпоинт скачивания + + final request = http.Request('GET', url); + request.headers.addAll({'Authorization': 'Bearer $token'}); + + // Отправляем запрос + final http.StreamedResponse response = await _client.send(request); + + final contentDisposition = response.headers['content-disposition']; + String serverFileName = 'media.enc'; + + if (contentDisposition != null) { + final match = RegExp( + r"filename\*=UTF-8''(.+)", + ).firstMatch(contentDisposition); + if (match != null) { + serverFileName = Uri.decodeComponent(match.group(1)!); + print("Имя файла, полученное от сервера: $serverFileName"); + } + } + + if (response.statusCode == 200) { + return (response.stream, serverFileName); + } else { + throw Exception( + 'Ошибка скачивания файла: сервер вернул статус ${response.statusCode}', + ); + } + } + + Future downloadFile(String fileId, String filePath) async { + final token = await getAccessToken(); + try { + final response = await Dio().download( + '${AppConstants.baseUrl}/media/$fileId', + filePath, + options: Options( + headers: {'Authorization': 'Bearer $token'}, + validateStatus: (status) => status == 200, + ), + ); + + if (response.statusCode == 200) { + return File(filePath); + } + } catch (e) { + debugPrint('Ошибка при скачивании: $e'); + final file = File(filePath); + if (await file.exists()) await file.delete(); + } + return null; + } + + Future uploadFileStream( + Stream> stream, + int sourceLength, { + String purpose = 'media', + void Function(int processed, int total)? onProgress, + String? fileName, + }) async { + try { + final token = await getAccessToken(); + final dio = Dio(); + + print( + '[DEBUG] uploadFileStream: работаем через поточное чтение. Размер=$sourceLength bytes, purpose=$purpose', + ); + + // БЕЗОПАСНО ДЛЯ RAM: Передаем стрим напрямую в Dio. Память не забивается! + final formData = FormData.fromMap({ + 'file': MultipartFile.fromStream( + () => stream, + sourceLength, // Передаем точную длину стрима, это важно для прогресса! + filename: fileName, + ), + 'purpose': purpose, + }); + + final response = await dio.post( + '${AppConstants.baseUrl}/media/v2/upload', + data: formData, + onSendProgress: (sent, total) { + // Твой print(sent) теперь будет вызываться динамически по мере ухода байт в сеть! + if (total > 0) { + onProgress?.call(sent, total); + } + }, + options: Options( + headers: {'Authorization': 'Bearer $token'}, + validateStatus: (status) => status != null && status < 500, + ), + ); + + print('[DEBUG] uploadFileStream response status=${response.statusCode}'); + print('[DEBUG] uploadFileStream response data=${response.data}'); + + if (response.statusCode == 200 || response.statusCode == 201) { + final fileId = response.data['file_id']?.toString(); + print('[DEBUG] uploadFileStream: успешно загружен, file_id=$fileId'); + return fileId; + } else { + print( + '[ERROR] uploadFileStream: ошибка ${response.statusCode} - ${response.data}', + ); + return null; + } + } catch (e) { + print('[ERROR] uploadFileStream exception: $e'); return null; } } @@ -58,11 +253,13 @@ class ApiService extends ChangeNotifier { try { final refreshToken = await _storage.read(key: 'refresh_token'); - final response = await _client.post( - Uri.parse('${AppConstants.baseUrl}/auth/refresh'), - body: jsonEncode({'refresh_token': refreshToken}), - headers: {'Content-Type': 'application/json'}, - ).timeout(Duration(seconds: 30)); + final response = await _client + .post( + Uri.parse('${AppConstants.baseUrl}/auth/refresh'), + body: jsonEncode({'refresh_token': refreshToken}), + headers: {'Content-Type': 'application/json'}, + ) + .timeout(Duration(seconds: 30)); final decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map; @@ -112,25 +309,31 @@ class ApiService extends ChangeNotifier { Future updateFcmToken(String fcmtoken) async { notifyListeners(); - try { final token = await getAccessToken(); - final response = await _client.post( - Uri.parse('${AppConstants.baseUrl}/auth/update-fcm?token=$fcmtoken'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); + if (token == null) return false; // Нет токена — прерываем выполнение + + final response = await _client + .post( + Uri.parse( + '${AppConstants.baseUrl}/auth/update-fcm?token=$fcmtoken', + ), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, + ) + .timeout(const Duration(seconds: 10)); // Ограничиваем время ожидания if (response.statusCode == 200) { return true; } else { - print("Ошибка установки ключа: ${response.statusCode}"); + print("Ошибка установки FCM ключа: ${response.statusCode}"); return false; } } catch (e) { - rethrow; + print("ℹ️ Не удалось обновить FCM токен (нет сети): $e"); + return false; // Возвращаем false вместо падения приложения } finally { notifyListeners(); } @@ -165,7 +368,12 @@ class ApiService extends ChangeNotifier { Future> getMe() async { final token = await getAccessToken(); - final response = await _client.get( + await cache.initialize(); + final client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, + ); + final response = await client.get( Uri.parse('${AppConstants.baseUrl}/users/me'), headers: { 'Content-Type': 'application/json', @@ -214,9 +422,27 @@ class ApiService extends ChangeNotifier { return response.statusCode == 200; } - Future> getChatHistory(int contactId) async { + Future> getChatHistory( + int contactId, { + bool forceRefresh = false, + }) async { final token = await getAccessToken(); - final response = await _client.get( + await _ensureCacheReady(); + + final client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, + ); + + final Map requestHeaders = { + 'Authorization': 'Bearer $token', + }; + + if (forceRefresh) { + requestHeaders['Cache-Control'] = 'no-cache'; + } + + final response = await client.get( Uri.parse( '${AppConstants.baseUrl}/messages/history/${contactId.toString()}', ), @@ -225,25 +451,57 @@ class ApiService extends ChangeNotifier { "Authorization": "Bearer $token", }, ); - return jsonDecode(response.body) as List; + return jsonDecode(utf8.decode(response.bodyBytes)) as List; } - Future downloadMedia(String fileId) async { + Future downloadMedia( + String fileId, { + void Function(int received, int total)? onProgress, + }) async { try { final token = await getAccessToken(); - final response = await _client.get( - Uri.parse('${AppConstants.baseUrl}/media/$fileId'), - headers: { - 'Authorization': 'Bearer $token', - }, + await _ensureCacheReady(); + + final client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, ); - if (response.statusCode == 200) { - return response.bodyBytes; + + final uri = Uri.parse('${AppConstants.baseUrl}/media/$fileId'); + + if (onProgress == null) { + final response = await client.get( + uri, + headers: {'Authorization': 'Bearer $token'}, + ); + if (response.statusCode == 200) { + return response.bodyBytes; + } + print('?????? ???????? ?????: ${response.statusCode}'); + return null; } - print('Ошибка загрузки медиа: ${response.statusCode}'); + + final req = http.Request('GET', uri); + req.headers['Authorization'] = 'Bearer $token'; + final streamed = await client.send(req); + + final total = + int.tryParse(streamed.headers['content-length'] ?? '') ?? -1; + int received = 0; + final bytes = []; + await for (final chunk in streamed.stream) { + bytes.addAll(chunk); + received += chunk.length; + onProgress(received, total); + } + + if (streamed.statusCode == 200) { + return Uint8List.fromList(bytes); + } + print('?????? ???????? ?????: ${streamed.statusCode}'); return null; } catch (e) { - print('Ошибка downloadMedia: $e'); + print('?????? downloadMedia: $e'); return null; } } @@ -286,7 +544,12 @@ class ApiService extends ChangeNotifier { Future> getUserById(int userId) async { final token = await getAccessToken(); - final response = await _client.get( + await _ensureCacheReady(); + final client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, + ); + final response = await client.get( Uri.parse('${AppConstants.baseUrl}/users/$userId'), headers: { 'Content-Type': 'application/json', @@ -331,7 +594,13 @@ class ApiService extends ChangeNotifier { Future> getPrivacySettings() async { final token = await getAccessToken(); - final response = await _client.get( + + await _ensureCacheReady(); + final client = CachedHttpClient( + cache: cache, + defaultCachePolicy: CachePolicy.networkFirst, + ); + final response = await client.get( Uri.parse('${AppConstants.baseUrl}/users/me/privacy'), headers: { 'Content-Type': 'application/json', diff --git a/lib/domain/services/crypto_service.dart b/lib/domain/services/crypto_service.dart index 48e297d..3f19235 100644 --- a/lib/domain/services/crypto_service.dart +++ b/lib/domain/services/crypto_service.dart @@ -2,7 +2,11 @@ import 'package:cryptography/cryptography.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'dart:convert'; import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:chepuhagram/data/models/contact_model.dart'; +import 'dart:async'; +import 'package:pointycastle/export.dart' as pc; +import 'dart:io'; class CryptoService { final _storage = const FlutterSecureStorage(); @@ -244,33 +248,173 @@ class CryptoService { return result; } - Future<(List, String)?> encryptImage( - List fileBytes, + Future<(Stream>, String)> encryptFileStream( + Stream> fileStream, + SecretKey sharedKey, { + void Function(int processed, int total)? onProgress, + int? totalSize, + }) async { + // 1. Генерируем уникальный ключ для конкретного файла + final SecretKey fileKey = await aesGcm.newSecretKey(); + final List fileKeyBytes = await fileKey.extractBytes(); + + // 2. Шифруем этот ключ файла на общем ключе чата (sharedKey) + final keyNonce = aesGcm.newNonce(); + final encryptedKeyBox = await aesGcm.encrypt( + fileKeyBytes, + secretKey: sharedKey, + nonce: keyNonce, + ); + + // Кодируем зашифрованный ключ в Base64 для сервера + final String encryptedKeyForServer = base64Encode( + encryptedKeyBox.concatenation(), + ); + int processedBytes = 0; + final int total = totalSize ?? 0; + + // 3. Создаем асинхронный генератор для поблочного шифрования самого файла + Stream> processEncryption() async* { + final List buffer = []; + const int chunkSize = 64 * 1024; // 64 KB + + await for (final chunk in fileStream) { + buffer.addAll(chunk); + + while (buffer.length >= chunkSize) { + final plainBlock = Uint8List.fromList(buffer.sublist(0, chunkSize)); + buffer.removeRange(0, chunkSize); + + final blockNonce = aesGcm.newNonce(); + final secretBox = await aesGcm.encrypt( + plainBlock, + secretKey: fileKey, + nonce: blockNonce, + ); + + final payload = secretBox.concatenation(); + final header = ByteData(4)..setUint32(0, payload.length); + + yield header.buffer.asUint8List(); + yield payload; + processedBytes += chunkSize; + if (onProgress != null) { + onProgress(processedBytes, total); + } + } + } + + // Дозаписываем остаток файла (хвост), если он есть + if (buffer.isNotEmpty) { + final plainBlock = Uint8List.fromList(buffer); + final blockNonce = aesGcm.newNonce(); + final secretBox = await aesGcm.encrypt( + plainBlock, + secretKey: fileKey, + nonce: blockNonce, + ); + + final payload = secretBox.concatenation(); + final header = ByteData(4)..setUint32(0, payload.length); + + yield header.buffer.asUint8List(); + yield payload; + } + } + + // Возвращаем кортеж (Record): очищенный зашифрованный поток данных и ключ для сервера + return (processEncryption(), encryptedKeyForServer); + } + + Stream> decryptFileStream( + Stream> encryptedStream, SecretKey sharedKey, - ) async { + String encryptedFileKey, { + int? totalBytes, + void Function(int processed, int total)? onProgress, + }) async* { try { - final SecretKey fileSecretKey = await aesGcm.newSecretKey(); - final List fileSecretKeyBytes = await fileSecretKey.extractBytes(); - - final SecretBox secretBox = await aesGcm.encrypt( - fileBytes, - secretKey: fileSecretKey, + // 1. Дешифруем ключ файла с помощью общего ключа чата + final encryptedKeyBytes = base64Decode(encryptedFileKey); + final keySecretBox = SecretBox.fromConcatenation( + encryptedKeyBytes, + nonceLength: 12, + macLength: 16, ); - final List dataToUpload = secretBox.concatenation(); - - final encryptedKeyBox = await aesGcm.encrypt( - fileSecretKeyBytes, + final fileKeyBytes = await aesGcm.decrypt( + keySecretBox, secretKey: sharedKey, ); + final fileKey = SecretKey(fileKeyBytes); - final String encryptedKeyForServer = base64Encode( - encryptedKeyBox.concatenation(), + final List buffer = []; + int blocksDecrypted = 0; + int totalProcessedBytes = 0; + + // 2. Потоковая дешифровка блоков файла + await for (final chunk in encryptedStream) { + buffer.addAll(chunk); + + while (true) { + if (buffer.length < 4) break; + + final headerBytes = Uint8List.fromList(buffer.sublist(0, 4)); + final int payloadLength = ByteData.sublistView( + headerBytes, + ).getUint32(0); + + // Проверяем: если длина чанка подозрительно огромная (из-за неверного формата файла) + if (payloadLength > 500 * 1024 || payloadLength <= 0) { + print( + "ОШИБКА: Неверный заголовок длины чанка: $payloadLength байт. Возможно, файл зашифрован старым методом!", + ); + throw Exception("Неверный формат зашифрованного блока"); + } + + if (buffer.length < 4 + payloadLength) break; + + final encryptedBlockBytes = Uint8List.fromList( + buffer.sublist(4, 4 + payloadLength), + ); + buffer.removeRange(0, 4 + payloadLength); + + final blockSecretBox = SecretBox.fromConcatenation( + encryptedBlockBytes, + nonceLength: 12, + macLength: 16, + ); + + final decryptedBlock = await aesGcm.decrypt( + blockSecretBox, + secretKey: fileKey, + ); + blocksDecrypted++; + + if (blocksDecrypted % 10 == 0 || payloadLength < 64 * 1024) { + print( + "Дешифровано блоков: $blocksDecrypted. Текущий размер: ${decryptedBlock.length} байт. Всего обработано $totalProcessedBytes. Всего $totalBytes", + ); + } + + // Увеличиваем счетчик обработанных зашифрованных байт + totalProcessedBytes += 4 + payloadLength; + + // Вызываем колбэк прогресса + if (onProgress != null) { + // Передаем, сколько байт обработано, и общий размер (если totalBytes null, передаем -1) + onProgress(totalProcessedBytes, totalBytes ?? -1); + } + + yield decryptedBlock; + } + } + print( + "ПОТОК ДЕШИФРАЦИИ ЗАВЕРШЕН ПОЛНОСТЬЮ. Всего блоков: $blocksDecrypted", ); - - return (dataToUpload, encryptedKeyForServer); - } catch (e) { - print("Ошибка шифрования медиа: $e"); - return null; + } catch (e, stack) { + print("КРИТИЧЕСКАЯ ОШИБКА ВНУТРИ КРИПТОСТРИМА: $e"); + print(stack); + rethrow; } } @@ -305,7 +449,7 @@ class CryptoService { } } - Future decryptImage( + Future decryptMedia( List encryptedData, String encryptedKey, SecretKey sharedKey, @@ -338,6 +482,27 @@ class CryptoService { } } + Future _decryptFileKey( + String encryptedFileKey, + SecretKey sharedKey, + ) async { + try { + final keyBytes = base64Decode(encryptedFileKey); + final nonce = keyBytes.sublist(0, 12); + final macBytes = keyBytes.sublist(keyBytes.length - 16); + final cipherText = keyBytes.sublist(12, keyBytes.length - 16); + + final decrypted = await aesGcm.decrypt( + SecretBox(cipherText, nonce: nonce, mac: Mac(macBytes)), + secretKey: sharedKey, + ); + return SecretKey(decrypted); + } catch (e) { + print('Error decrypting file key: $e'); + return null; + } + } + Future decryptMessage(String base64Data, SecretKey sharedKey) async { final data = base64Decode(base64Data); @@ -369,4 +534,21 @@ class CryptoService { Future deletePrivateKey() async { await _storage.delete(key: 'private_key'); } + + SecretKey? _currentSharedKey; + + // Метод для установки ключа (вызывается при входе в чат) + void setCurrentSharedKey(SecretKey key) { + _currentSharedKey = key; + } + + // Тот самый метод, который ищет ChatScreen + Future getSharedKey(String? chatId) async { + if (_currentSharedKey == null) { + // Если ключа нет, его нужно либо вычислить заново, + // либо выбросить ошибку. Для теста можно вернуть ошибку: + throw Exception("Shared key not initialized for chat $chatId"); + } + return _currentSharedKey!; + } } diff --git a/lib/logic/auth_provider.dart b/lib/logic/auth_provider.dart index 584d9ae..d0beb3a 100644 --- a/lib/logic/auth_provider.dart +++ b/lib/logic/auth_provider.dart @@ -358,7 +358,7 @@ class AuthProvider extends ChangeNotifier { Future updateAvatar(String path) async { try { final bytes = await File(path).readAsBytes(); - final fileId = await _apiService.uploadMedia(bytes, purpose: 'avatar'); + final fileId = await _apiService.uploadFile(bytes, purpose: 'avatar'); if (fileId != null) { final success = await _apiService.updateAvatar(fileId); if (success) { diff --git a/lib/logic/contact_provider.dart b/lib/logic/contact_provider.dart index 150adae..3601ee0 100644 --- a/lib/logic/contact_provider.dart +++ b/lib/logic/contact_provider.dart @@ -5,6 +5,7 @@ import '/domain/services/crypto_service.dart'; import 'dart:isolate'; import 'package:cryptography/cryptography.dart'; import 'package:flutter/foundation.dart'; +import 'package:chepuhagram/data/models/message_model.dart'; class ContactProvider extends ChangeNotifier { final ContactRepository _repository = ContactRepository(); @@ -94,41 +95,64 @@ class ContactProvider extends ChangeNotifier { } } + + String _getMediaPreview(MessageType type) { + switch (type) { + case MessageType.videoNote: + return '[Кружок]'; + case MessageType.voiceNote: + return '[Голосовое]'; + case MessageType.image: + return '[Фото]'; + case MessageType.video: + return '[Видео]'; + case MessageType.file: + return '[Файл]'; + case MessageType.text: + default: + return ''; + } + } + Future _enrichContactsWithLastMessages() async { - final myPrivKeyBase64 = await _cryptoService.getPrivateKey(); - if (myPrivKeyBase64 == null) return; + final myPrivKeyBase64 = await _cryptoService.getPrivateKey(); + if (myPrivKeyBase64 == null) return; - // Создаем локальные копии для передачи - final contactsToProcess = List.from(_contacts); - final cacheCopy = Map.from(_sharedKeysCache); + // Создаем локальные копии для передачи + final contactsToProcess = List.from(_contacts); + final cacheCopy = Map.from(_sharedKeysCache); - print('Avialable cache for contacts: ${cacheCopy.length}'); + print('Avialable cache for contacts: ${cacheCopy.length}'); - try { - final updatedContacts = await compute( - CryptoService.bulkDecryptContacts, - { + try { + final updatedContacts = await compute(CryptoService.bulkDecryptContacts, { 'contacts': contactsToProcess, 'privKey': myPrivKeyBase64, 'cache': cacheCopy, - }, - ); - for (var contact in updatedContacts) { - print('Decrypted contact: ${contact.name} ${contact.surname}, lastMessage: ${contact.lastMessage}, isDecrypted: ${contact.isLastMsgDecrypted}'); + }); + for (var contact in updatedContacts) { + print( + 'Decrypted contact: ${contact.name} ${contact.surname}, lastMessage: ${contact.lastMessage}, isDecrypted: ${contact.isLastMsgDecrypted}', + ); + } + _contacts = updatedContacts; + notifyListeners(); + } catch (e) { + print("Ошибка дешифровки: $e"); } - _contacts = updatedContacts; - notifyListeners(); - } catch (e) { - print("Ошибка дешифровки: $e"); } -} - Future updateContact(int userId) async { + Future updateContact( + int userId, { + String? lastMessage, + DateTime? lastMessageTime, + bool? isLastMsgDecrypted, + int? unreadCount, + }) async { try { final updatedContact = await _repository.fetchContactById(userId); final index = _contacts.indexWhere((c) => c.id == userId); if (index != -1) { - // Обновляем только поля профиля, сохраняя lastMessage и т.д. final existing = _contacts[index]; _contacts[index] = existing.copyWith( username: updatedContact.username, @@ -138,8 +162,15 @@ class ContactProvider extends ChangeNotifier { avatarFileId: updatedContact.avatarFileId, isOnline: updatedContact.isOnline, publicKey: updatedContact.publicKey, + lastMessage: lastMessage ?? existing.lastMessage, + lastMessageTime: lastMessageTime ?? existing.lastMessageTime, + isLastMsgDecrypted: isLastMsgDecrypted ?? existing.isLastMsgDecrypted, + unreadCount: unreadCount ?? existing.unreadCount, + lastMessageId: updatedContact.lastMessageId, + ); + print( + "Контакт ${updatedContact.name} ${updatedContact.surname} ${updatedContact.id} ${updatedContact.avatarFileId} ${updatedContact.avatarUrl} обновлен", ); - print("Контакт ${updatedContact.name} ${updatedContact.surname} ${updatedContact.id} ${updatedContact.avatarFileId} ${updatedContact.avatarUrl} обновлен"); notifyListeners(); } } catch (e) { @@ -147,4 +178,117 @@ class ContactProvider extends ChangeNotifier { } } + Future updateContactOnlineStatus(int userId, bool isOnline) async { + try { + final index = _contacts.indexWhere((c) => c.id == userId); + if (index != -1) { + final existing = _contacts[index]; + _contacts[index] = existing.copyWith( + isOnline: isOnline, + username: existing.username, + name: existing.name, + surname: existing.surname, + avatarUrl: existing.avatarUrl, + avatarFileId: existing.avatarFileId, + publicKey: existing.publicKey, + ); + print("Контакт ${existing.name} ${existing.surname} онлайн обновлен"); + notifyListeners(); + } + } catch (e) { + print("Error updating contact: $e"); + } + } + + Future updateContactLastMessage(int contactId, {String? lastMessage, DateTime? lastMessageTime, bool? isLastMsgDecrypted, int? lastMessageId, bool isEdited = false}) async { + try { + final index = _contacts.indexWhere((c) => c.id == contactId); + if (index != -1) { + final existing = _contacts[index]; + String displayMessage; + if (isEdited) { + final baseMessage = lastMessage ?? existing.lastMessage; + final rawMessage = baseMessage != null && baseMessage.isNotEmpty + ? baseMessage + : 'Сообщение изменено'; + displayMessage = rawMessage.endsWith('(изменено)') + ? rawMessage + : '$rawMessage (изменено)'; + } else { + displayMessage = lastMessage ?? existing.lastMessage ?? ''; + } + + _contacts[index] = existing.copyWith( + lastMessage: displayMessage.isNotEmpty ? displayMessage : null, + lastMessageTime: lastMessageTime, + isLastMsgDecrypted: isLastMsgDecrypted ?? existing.isLastMsgDecrypted, + lastMessageId: lastMessageId, + ); + print("Последнее сообщение контакта ${existing.name} обновлено: $displayMessage"); + notifyListeners(); + } + } catch (e) { + print("Error updating contact last message: $e"); + } + } + + Future refreshContactLastMessage(int contactId) async { + try { + // Получить предпоследнее сообщение из базы данных + final lastMessages = await _repository.getLastMessagesForContact(contactId, limit: 2); + if (lastMessages.isNotEmpty) { + final lastMsg = lastMessages.first; + final contact = _contacts.firstWhere((c) => c.id == contactId); + final messageId = int.tryParse(lastMsg['id'].toString()); + final timestamp = DateTime.tryParse(lastMsg['timestamp']?.toString() ?? ''); + final myPrivKeyBase64 = await _cryptoService.getPrivateKey(); + if (myPrivKeyBase64 != null && contact.publicKey != null) { + try { + final sharedSecret = await _cryptoService.deriveSharedSecret( + myPrivKeyBase64, + contact.publicKey!, + ); + final decryptedText = await _cryptoService.decryptMessage( + lastMsg['content'], + sharedSecret, + ); + await updateContactLastMessage( + contactId, + lastMessage: decryptedText, + lastMessageTime: timestamp, + isLastMsgDecrypted: true, + lastMessageId: messageId, + ); + } catch (e) { + print("Error decrypting last message: $e"); + await updateContactLastMessage( + contactId, + lastMessage: lastMsg['content50'] ?? 'Зашифрованное сообщение', + lastMessageTime: timestamp, + isLastMsgDecrypted: false, + lastMessageId: messageId, + ); + } + } else { + await updateContactLastMessage( + contactId, + lastMessage: lastMsg['content50'] ?? 'Зашифрованное сообщение', + lastMessageTime: timestamp, + isLastMsgDecrypted: false, + lastMessageId: messageId, + ); + } + } else { + // Нет сообщений + await updateContactLastMessage( + contactId, + lastMessage: null, + lastMessageTime: null, + lastMessageId: null, + ); + } + } catch (e) { + print("Error refreshing contact last message: $e"); + } + } } diff --git a/lib/presentation/screens/camera_screen.dart b/lib/presentation/screens/camera_screen.dart new file mode 100644 index 0000000..9e0a4f4 --- /dev/null +++ b/lib/presentation/screens/camera_screen.dart @@ -0,0 +1,412 @@ +import 'package:camera/camera.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; +import 'media_preview_screen.dart'; + +class CameraScreen extends StatefulWidget { + const CameraScreen({super.key}); + + @override + State createState() => _CameraScreenState(); +} + +enum FlashModeType { off, autoCapture, alwaysCapture, torch } + +class _CameraScreenState extends State { + CameraController? _controller; + List _cameras = []; + + int _cameraIndex = 0; + bool _isRecording = false; + + FlashModeType _flashMode = FlashModeType.off; + double _minZoom = 1.0; + double _maxZoom = 1.0; + double _currentZoom = 1.0; + + bool _showZoomSlider = false; + + Future? _initFuture; + + @override + void initState() { + super.initState(); + _initFuture = _init(); + } + + Future _init() async { + _cameras = await availableCameras(); + await _initCamera(); + } + + Future _initCamera() async { + final camera = _cameras[_cameraIndex]; + + final controller = CameraController( + camera, + ResolutionPreset.high, + enableAudio: true, + ); + + await controller.initialize(); + _minZoom = await controller.getMinZoomLevel(); + _maxZoom = await controller.getMaxZoomLevel(); + _currentZoom = _minZoom; + if (!mounted) return; + + setState(() { + _controller = controller; + }); + } + + Future _switchCamera() async { + if (_cameras.length < 2) return; + + await _controller?.dispose(); + + _cameraIndex = (_cameraIndex + 1) % _cameras.length; + + setState(() => _controller = null); + await _initCamera(); + } + + Future _cycleFlashMode() async { + if (_controller == null) return; + + switch (_flashMode) { + case FlashModeType.off: + _flashMode = FlashModeType.autoCapture; + await _controller!.setFlashMode(FlashMode.off); + break; + + case FlashModeType.autoCapture: + _flashMode = FlashModeType.alwaysCapture; + await _controller!.setFlashMode(FlashMode.off); + break; + + case FlashModeType.alwaysCapture: + _flashMode = FlashModeType.torch; + await _controller!.setFlashMode(FlashMode.torch); + break; + + case FlashModeType.torch: + _flashMode = FlashModeType.off; + await _controller!.setFlashMode(FlashMode.off); + break; + } + + setState(() {}); + } + + Future _takePhoto() async { + if (_controller == null) return; + + bool usedTorch = false; + + if (_flashMode == FlashModeType.alwaysCapture) { + await _controller!.setFlashMode(FlashMode.torch); + usedTorch = true; + await Future.delayed(const Duration(milliseconds: 120)); + } + + if (_flashMode == FlashModeType.autoCapture) { + await _controller!.setFlashMode(FlashMode.torch); + usedTorch = true; + await Future.delayed(const Duration(milliseconds: 120)); + } + + final file = await _controller!.takePicture(); + + if (usedTorch) { + await _controller!.setFlashMode(FlashMode.off); + } + WidgetsBinding.instance.addPostFrameCallback((_) async { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (_) => MediaPreviewScreen(path: file.path, isVideo: false), + ), + ); + + if (result == true && mounted) { + Navigator.pop(context, (file, 'image')); + } + }); + } + + bool usedTorch = false; + Future _startVideo() async { + if (_controller == null || _isRecording) return; + if (_flashMode == FlashModeType.alwaysCapture) { + await _controller!.setFlashMode(FlashMode.torch); + usedTorch = true; + await Future.delayed(const Duration(milliseconds: 120)); + } + + if (_flashMode == FlashModeType.autoCapture) { + await _controller!.setFlashMode(FlashMode.torch); + usedTorch = true; + await Future.delayed(const Duration(milliseconds: 120)); + } + + await _controller!.startVideoRecording(); + + setState(() => _isRecording = true); + } + + Future _stopVideo() async { + if (_controller == null || !_isRecording) return; + if (usedTorch) { + await _controller!.setFlashMode(FlashMode.off); + } + + final file = await _controller!.stopVideoRecording(); + + setState(() => _isRecording = false); + + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (_) => MediaPreviewScreen(path: file.path, isVideo: true), + ), + ); + + if (result == true && mounted) { + Navigator.pop(context, (file, 'video')); + } + } + + Future _setZoom(double zoom) async { + if (_controller == null) return; + + final clamped = zoom.clamp(_minZoom, _maxZoom); + + await _controller!.setZoomLevel(clamped); + + setState(() { + _currentZoom = clamped; + }); + } + + @override + void dispose() { + _controller?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: FutureBuilder( + future: _initFuture, + builder: (context, snapshot) { + if (_controller == null || !_controller!.value.isInitialized) { + return const Center(child: CircularProgressIndicator()); + } + + return Stack( + children: [ + // 📷 Camera preview (full screen, Telegram style crop) + Positioned.fill( + child: FittedBox( + fit: BoxFit.cover, + child: SizedBox( + width: _controller!.value.previewSize!.height, + height: _controller!.value.previewSize!.width, + child: GestureDetector( + onScaleStart: (_) { + setState(() { + _showZoomSlider = true; + }); + }, + + onScaleUpdate: (details) { + final zoom = (_currentZoom * details.scale).clamp( + _minZoom, + _maxZoom, + ); + + _setZoom(zoom); + }, + child: CameraPreview(_controller!), + ), + ), + ), + ), + + // 🌑 top gradient (Telegram feel) + Positioned( + top: 0, + left: 0, + right: 0, + height: 120, + child: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Colors.black87, Colors.transparent], + ), + ), + ), + ), + + // 🔘 top controls + Positioned( + top: 50, + left: 20, + right: 20, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // Flash (left) + IconButton( + onPressed: _cycleFlashMode, + icon: Icon(switch (_flashMode) { + FlashModeType.off => Icons.flash_off, + FlashModeType.autoCapture => Icons.flash_auto, + FlashModeType.alwaysCapture => Icons.flash_on, + FlashModeType.torch => Icons.highlight, + }, color: Colors.white), + ), + + // Camera switch (right) + IconButton( + onPressed: _switchCamera, + icon: const Icon(Icons.cameraswitch, color: Colors.white), + ), + ], + ), + ), + + // 🔘 capture button (center bottom) + Positioned( + bottom: 90, + left: 0, + right: 0, + child: Column( + children: [ + GestureDetector( + onTap: _takePhoto, + onLongPressStart: (_) => _startVideo(), + onLongPressEnd: (_) => _stopVideo(), + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + width: _isRecording ? 80 : 72, + height: _isRecording ? 80 : 72, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _isRecording ? Colors.red : Colors.white, + border: Border.all(color: Colors.white, width: 4), + ), + ), + ), + + const SizedBox(height: 16), + + const Text( + "Нажмите для фото, удерживайте для съемки", + style: TextStyle(color: Colors.white70, fontSize: 13), + ), + ], + ), + ), + + // 🔴 recording indicator + if (_isRecording) + const Positioned( + top: 50, + left: 0, + right: 0, + child: Center( + child: Text( + "REC", + style: TextStyle( + color: Colors.red, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ), + ), + if (_showZoomSlider) + Positioned( + bottom: 200, + left: 20, + right: 20, + child: Center( + child: Container( + child: Row( + children: [ + GestureDetector( + onTap: () { + final newZoom = (_currentZoom - 0.5).clamp( + _minZoom, + _maxZoom, + ); + _setZoom(newZoom); + }, + child: const Text( + '−', + style: TextStyle( + color: Colors.white, + fontSize: 18, + ), + ), + ), + + const SizedBox(width: 8), + + Expanded( + child: SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 2, + activeTrackColor: Colors.white, + inactiveTrackColor: Colors.white24, + thumbColor: Colors.white, + overlayColor: Colors.white24, + thumbShape: const RoundSliderThumbShape( + enabledThumbRadius: 6, + ), + ), + child: Slider( + value: _currentZoom, + min: _minZoom, + max: _maxZoom, + onChanged: (value) { + _setZoom(value); + }, + ), + ), + ), + + const SizedBox(width: 8), + GestureDetector( + onTap: () { + final newZoom = (_currentZoom + 0.5).clamp( + _minZoom, + _maxZoom, + ); + _setZoom(newZoom); + }, + child: const Text( + '+', + style: TextStyle( + color: Colors.white, + fontSize: 18, + ), + ), + ), + ], + ), + ), + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/presentation/screens/chat_screen.dart b/lib/presentation/screens/chat_screen.dart index 48d4487..15eea4f 100644 --- a/lib/presentation/screens/chat_screen.dart +++ b/lib/presentation/screens/chat_screen.dart @@ -1,6 +1,7 @@ -import 'dart:async'; +import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; +import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:cryptography/cryptography.dart'; import '/data/models/message_model.dart'; @@ -11,6 +12,7 @@ import 'package:chepuhagram/data/repositories/contact_repository.dart'; import 'package:chepuhagram/domain/services/crypto_service.dart'; import 'package:chepuhagram/data/datasources/ws_client.dart'; import 'package:provider/provider.dart'; +import 'package:flutter/rendering.dart'; import '/logic/contact_provider.dart'; import '../../domain/services/api_service.dart'; import 'dart:math'; @@ -20,8 +22,21 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'contacts_screen.dart'; import 'package:flutter/services.dart'; import 'user_profile_screen.dart'; -import 'package:image_picker/image_picker.dart'; import '/core/theme_manager.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; +import 'package:path_provider/path_provider.dart'; +import 'camera_screen.dart'; +import 'media_viewer_screen.dart'; +import 'package:visibility_detector/visibility_detector.dart'; +import 'package:path/path.dart' as p; +import 'package:record/record.dart'; +import 'package:camera/camera.dart'; +import 'package:ffmpeg_kit_flutter_new_min_gpl/ffmpeg_kit.dart'; +import 'package:ffmpeg_kit_flutter_new_min_gpl/return_code.dart'; +import '../screens/forward_contact_picker_screen.dart'; class ChatScreen extends StatefulWidget { final Contact contact; @@ -34,6 +49,7 @@ class ChatScreen extends StatefulWidget { class _ChatScreenState extends State with RouteAware { static const String _notificationLaunchKey = 'notification_launch_data'; + static const int _autoMediaLoadLimitBytes = 10 * 1024 * 1024; // 10MB int myId = 0; late Contact _currentContact; bool _isKeyLoading = true; @@ -48,8 +64,8 @@ class _ChatScreenState extends State with RouteAware { final LocalDbService _localDbService = LocalDbService(); final ScrollController _scrollController = ScrollController(); final Map _messageKeys = {}; + Map _messageMap = {}; bool _showScrollToEnd = false; - Uint8List? _pendingImageBytes; MessageModel? _replyTo; bool _isOnline = false; DateTime? _lastOnline; @@ -58,6 +74,37 @@ class _ChatScreenState extends State with RouteAware { bool _isTyping = false; Timer? _typingTimer; late SocketService _socketService; + MessageType _pendingMessageType = MessageType.text; + String? _pendingFileName; + File? _pendingFile; + Uint8List? _previewBytes; + double _inputBarHeight = 0; + + SecretKey? _chatSharedSecret; + final Map> _mediaLoadFutures = {}; + final Map> _messageProgressNotifiers = {}; + + // Состояния для аудио/видео записи + bool _isRecording = false; + bool _isRecordLocked = false; // Режим "замок" (свайп вверх) + bool _isVoiceMode = true; // true - голосовое, false - кружок + double _recordDragX = 0.0; // Для отслеживания свайпа влево (отмена) + double _recordDragY = 0.0; // Для отслеживания свайпа вверх (замок) + + // Дополнительно для UI анимаций (опционально, сколько протащили для отмены) + static const double _swipeCancelThreshold = + -80.0; // Порог свайпа влево для отмены + static const double _swipeLockThreshold = + -80.0; // Порог свайпа вверх для лока + final AudioRecorder _audioRecorder = AudioRecorder(); + + Stopwatch _stopwatch = Stopwatch(); + Timer? _stopwatchTimer; + String _stopwatchDisplay = "0:00"; + + CameraController? _cameraController; + List? _cameras; + bool _isCameraInitialized = false; @override void initState() { @@ -83,6 +130,8 @@ class _ChatScreenState extends State with RouteAware { final socketService = Provider.of(context, listen: false); _socketSubscription = socketService.messages.listen(_handleIncomingMessage); + + _initCameras(); } @override @@ -120,6 +169,195 @@ class _ChatScreenState extends State with RouteAware { } } + // Инициализация камер устройства для кружочков + Future _initCameras() async { + try { + _cameras = await availableCameras(); + if (!mounted) return; + if (_cameras != null && _cameras!.isNotEmpty) { + // Пытаемся найти фронтальную камеру по умолчанию для кружков + final frontCamera = _cameras!.firstWhere( + (camera) => camera.lensDirection == CameraLensDirection.front, + orElse: () => _cameras!.first, + ); + _cameraController = CameraController( + frontCamera, + ResolutionPreset.medium, + enableAudio: true, // Звук пишется в видео-файл + ); + } + } catch (e) { + debugPrint("Ошибка инициализации камер: $e"); + } + } + + // Секундомер + void _startStopwatch() { + _stopwatch.reset(); + _stopwatch.start(); + _stopwatchTimer = Timer.periodic(const Duration(milliseconds: 500), ( + timer, + ) { + if (_stopwatch.isRunning) { + setState(() { + final elapsed = _stopwatch.elapsed; + String minutes = (elapsed.inMinutes % 60).toString(); + String seconds = (elapsed.inSeconds % 60).toString().padLeft(2, '0'); + _stopwatchDisplay = "$minutes:$seconds"; + }); + } + }); + } + + void _stopStopwatch() { + _stopwatch.stop(); + _stopwatchTimer?.cancel(); + setState(() { + _stopwatchDisplay = "0:00"; + }); + } + + // СТАРТ ЗАПИСИ + Future _startRecording() async { + HapticFeedback.lightImpact(); + _startStopwatch(); + + setState(() { + _isRecording = true; + _isRecordLocked = false; + _recordDragX = 0.0; + _recordDragY = 0.0; + }); + + try { + if (_isVoiceMode) { + // Проверка разрешений микрофона встроенная в record + if (await _audioRecorder.hasPermission()) { + final directory = await getTemporaryDirectory(); + final path = + '${directory.path}/voice_${DateTime.now().millisecondsSinceEpoch}.m4a'; + await _audioRecorder.start( + const RecordConfig(encoder: AudioEncoder.aacLc), + path: path, + ); + } + } else { + // Режим кружочка (видео) + if (_cameraController != null) { + await _cameraController!.initialize(); + if (mounted) { + setState(() { + _isCameraInitialized = true; + }); + await _cameraController!.startVideoRecording(); + } + } + } + } catch (e) { + debugPrint("Ошибка старта записи: $e"); + } + } + + // ФИКСАЦИЯ НА ЗАМОК + void _lockRecording() { + HapticFeedback.mediumImpact(); + setState(() { + _isRecordLocked = true; + }); + } + + // ОТМЕНА ЗАПИСИ + Future _cancelRecording() async { + HapticFeedback.heavyImpact(); + _stopStopwatch(); + + setState(() { + _isRecording = false; + _isRecordLocked = false; + _isCameraInitialized = false; + }); + + try { + if (_isVoiceMode) { + await _audioRecorder.stop(); // Просто останавливаем без сохранения + } else { + if (_cameraController != null && + _cameraController!.value.isRecordingVideo) { + await _cameraController!.stopVideoRecording(); + } + } + } catch (e) { + debugPrint("Ошибка при отмене записи: $e"); + } + } + + // УСПЕШНОЕ ЗАВЕРШЕНИЕ И ОТПРАВКА + Future _stopAndSendRecording() async { + if (!_isRecording) return; + _stopStopwatch(); + + String? filePath; + + try { + if (_isVoiceMode) { + filePath = await _audioRecorder.stop(); + } else { + if (_cameraController != null && + _cameraController!.value.isRecordingVideo) { + XFile videoFile = await _cameraController!.stopVideoRecording(); + filePath = videoFile.path; + } + } + } catch (e) { + debugPrint("Ошибка при остановке записи: $e"); + } + + setState(() { + _isRecording = false; + _isRecordLocked = false; + _isCameraInitialized = false; + }); + + if (filePath != null) { + File fileToSend = File(filePath); + setState(() { + _pendingFile = fileToSend; + _pendingFileName = _isVoiceMode + ? "Голосовое сообщение.m4a" + : "Видеосообщение.mp4"; + _pendingMessageType = _isVoiceMode + ? MessageType.voiceNote + : MessageType.videoNote; + }); + + // Вызываем твой существующий метод отправки, который упакует файл в чат + _sendMessage(); + } + } + + void _toggleRecordMode() { + if (_isRecording) return; + setState(() { + _isVoiceMode = !_isVoiceMode; + }); + } + + void _updateMessageInList( + int messageId, + MessageModel Function(MessageModel) updater, + ) { + if (!_messageMap.containsKey(messageId)) return; + + final oldMessage = _messageMap[messageId]!; + final newMessage = updater(oldMessage); + + setState(() { + _messageMap[messageId] = newMessage; + final idx = messages.indexWhere((m) => m.id == messageId); + if (idx != -1) messages[idx] = newMessage; + }); + } + void _sendTypingStatus() { final now = DateTime.now(); if (_lastTypingSent == null || @@ -141,6 +379,7 @@ class _ChatScreenState extends State with RouteAware { } Future _loadOnlineStatus() async { + if (currentActiveChatContactId == null) return; flutterLocalNotificationsPlugin.cancel(currentActiveChatContactId!); try { print( @@ -163,8 +402,7 @@ class _ChatScreenState extends State with RouteAware { _lastOnline = null; }); } catch (e) { - print("❌ ОШИБКА ПРИ ЗАГРУЗКЕ СТАТУСА ОНЛАЙН: $e"); - // Игнорируем ошибки при загрузке статуса + print(e); } } @@ -201,6 +439,42 @@ class _ChatScreenState extends State with RouteAware { } } + String _getMediaPreview(MessageType type) { + switch (type) { + case MessageType.videoNote: + return '[Кружок]'; + case MessageType.voiceNote: + return '[Голосовое]'; + case MessageType.image: + return '[Фото]'; + case MessageType.video: + return '[Видео]'; + case MessageType.file: + return '[Файл]'; + case MessageType.text: + default: + return ''; + } + } + + MessageType _parseMessageTypeString(String? typeStr) { + switch (typeStr?.toLowerCase()) { + case 'voicenote': + return MessageType.voiceNote; + case 'videonote': + return MessageType.videoNote; + case 'image': + return MessageType.image; + case 'video': + return MessageType.video; + case 'file': + return MessageType.file; + case 'text': + default: + return MessageType.text; + } + } + @override void dispose() { currentActiveChatContactId = null; @@ -208,12 +482,19 @@ class _ChatScreenState extends State with RouteAware { _scrollController.removeListener(_updateScrollButtonVisibility); _scrollController.dispose(); _controller.dispose(); + for (final n in _messageProgressNotifiers.values) { + n.dispose(); + } routeObserver.unsubscribe(this); _inputFocusNode.dispose(); _onlineTimer?.cancel(); _typingTimer?.cancel(); _controller.removeListener(_sendTypingStatus); _sendStopTypingStatus(); + _audioRecorder.dispose(); + _cameraController?.dispose(); + _stopwatchTimer?.cancel(); + _stopwatch.stop(); super.dispose(); } @@ -221,6 +502,7 @@ class _ChatScreenState extends State with RouteAware { Widget build(BuildContext context) { final themeProv = context.watch(); return Scaffold( + resizeToAvoidBottomInset: true, appBar: AppBar( leading: IconButton( icon: const Icon(Icons.arrow_back), @@ -256,7 +538,7 @@ class _ChatScreenState extends State with RouteAware { if (_isKeyLoading == true) const Text( 'загрузка...', - style: const TextStyle( + style: TextStyle( fontSize: 12, color: Color.fromARGB(255, 219, 219, 219), ), @@ -298,58 +580,371 @@ class _ChatScreenState extends State with RouteAware { ), ), ), - body: Column( - children: [ - Expanded( - child: Container( - decoration: themeProv.wallpaperPath != null - ? BoxDecoration( - image: DecorationImage( - image: FileImage(File(themeProv.wallpaperPath!)), - fit: BoxFit.cover, - ), - ) - : null, - child: ListView.builder( + body: Container( + decoration: themeProv.wallpaperPath != null + ? BoxDecoration( + image: DecorationImage( + image: FileImage(File(themeProv.wallpaperPath!)), + fit: BoxFit.cover, + ), + ) + : null, + child: Stack( + children: [ + Positioned.fill( + child: CustomScrollView( controller: _scrollController, - reverse: true, // Сообщения растут снизу вверх - itemCount: messages.length, - itemBuilder: (context, index) { - final msg = messages[messages.length - 1 - index]; - final keyId = msg.id ?? msg.tempId ?? index; - final itemKey = _messageKeys.putIfAbsent( - keyId, - () => GlobalKey(), - ); - return MessageBubble( - key: itemKey, - message: msg, - onTap: () => _showMessageActions(msg), - onReplyTap: msg.replyToId != null - ? () => _scrollToMessage(msg.replyToId) - : null, - onImageTap: msg.messageType == MessageType.image - ? () => _openFullScreenImage(msg) - : null, - onImageNeeded: _loadImageBytesForMessage, - ); - }, + reverse: true, + cacheExtent: + 0, // Сохраняем: строго запрещает предзагрузку элементов вне экрана + physics: const AlwaysScrollableScrollPhysics(), + slivers: [ + SliverPadding( + padding: EdgeInsets.only( + bottom: + _inputBarHeight * + (MediaQuery.of(context).viewInsets.bottom > 0 + ? 1.0 + : 1.0) + + 28, + left: 8, + right: 8, + top: 8, + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + final msg = messages[messages.length - 1 - index]; + final keyId = msg.id ?? msg.tempId ?? index; + final itemKey = _messageKeys.putIfAbsent( + keyId, + () => GlobalKey(), + ); + final isMedia = + msg.messageType == MessageType.image || + msg.messageType == MessageType.video || + msg.messageType == MessageType.file; + + final showDateDivider = _isNewDay(index); + + // Формируем основное содержимое элемента сообщения + Widget itemChild = Column( + crossAxisAlignment: CrossAxisAlignment.start, + key: ValueKey(keyId.hashCode), + mainAxisSize: MainAxisSize.min, + children: [ + if (showDateDivider) + Container( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + alignment: Alignment.center, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .surfaceContainerHighest + .withOpacity(0.75), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + _formatDividerDate(msg.createdAt), + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, + ), + ), + ), + ), + Dismissible( + direction: DismissDirection.endToStart, + key: ValueKey('dismiss_$keyId'), + confirmDismiss: + (DismissDirection direction) async { + String text = msg.text; + if (msg.text.isEmpty && + msg.messageType == MessageType.image) { + text = "[Фото]"; + } + setState( + () => _replyTo = msg.copyWith(text: text), + ); + return false; + }, + child: RepaintBoundary( + child: MessageBubble( + key: ValueKey( + '${msg.id ?? msg.tempId}_${msg.localFile?.path ?? 'none'}', + ), + message: msg, + onTap: () => _showMessageActions(msg), + onReplyTap: msg.replyToId != null + ? () => _scrollToMessage(msg.replyToId) + : null, + onImageTap: () => _openFullScreenMedia(msg), + onDownloadRequested: (m) async { + await _ensureFileDecrypted( + m, + dontLoad: false, + ); + }, + onDownloadRequestedWithoutLoad: (m) async { + await _ensureFileDecrypted( + m, + dontLoad: true, + ); + }, + autoLoadMedia: + msg.messageType != MessageType.image + ? true + : (msg.fileSize == null || + msg.fileSize! <= + _autoMediaLoadLimitBytes), + downloadProgress: + _messageProgressNotifiers['${msg.fileId}'], + onDownloadStoped: (m) async { + await _stopFileLoading(msg); + }, + ), + ), + ), + ], + ); + + // Если это медиафайл или документ, оборачиваем в VisibilityDetector + if (isMedia) { + return VisibilityDetector( + key: ValueKey('visible_${keyId}'), + onVisibilityChanged: (visibilityInfo) { + // Как только элемент показался в зоне видимости хотя бы на 10% + if (visibilityInfo.visibleFraction > 0.1) { + if (msg.fileSize == null || msg.fileSize == 0) { + print( + "Элемент стал видим. Фоновый запрос размера для: ${msg.fileId}", + ); + _fetchFileSizeIfNeeded(msg); + } + } + }, + child: itemChild, + ); + } + + // Обычный текст возвращаем без детектора видимости + return itemChild; + }, childCount: messages.length), + ), + ), + ], ), ), - ), - _buildMessageInput(), - ], + + // 3. Кнопка скролла + AnimatedPositioned( + duration: const Duration(milliseconds: 200), + curve: Curves.easeOutCubic, + right: 16.0, + bottom: _inputBarHeight + 8.0 + 16, + child: AnimatedOpacity( + opacity: _showScrollToEnd ? 1.0 : 0.0, + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + child: IgnorePointer( + ignoring: !_showScrollToEnd, + child: ClipOval( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of( + context, + ).colorScheme.surfaceVariant.withOpacity(0.75), + border: Border.all( + color: Theme.of( + context, + ).dividerColor.withOpacity(0.25), + width: 1, + ), + ), + child: SizedBox( + width: 40, + height: 40, + child: IconButton( + onPressed: _scrollToBottom, + icon: Icon( + Icons.keyboard_arrow_down, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ), + ), + ), + ), + ), + ), + + if (_isRecording && + !_isVoiceMode && + _isCameraInitialized && + _cameraController != null) + IgnorePointer( + child: Center( + child: Container( + width: + MediaQuery.of(context).size.width * + 0.9, // Увеличили размер, так как по центру экрана круг должен быть крупным и четким + height: MediaQuery.of(context).size.width * 0.9, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.5), + blurRadius: 25, + spreadRadius: 4, + ), + ], + ), + child: ClipOval( + child: LayoutBuilder( + builder: (context, constraints) { + // Берем пропорции самой камеры (важно: для вертикального отображения инвертируем) + final cameraAspectRatio = + _cameraController!.value.aspectRatio; + // Оборачиваем в OverflowBox, чтобы видео заполняло круг по меньшей стороне, а лишнее обрезалось + return OverflowBox( + alignment: Alignment.center, + child: FittedBox( + fit: BoxFit.cover, + child: SizedBox( + width: constraints.maxWidth, + height: + constraints.maxWidth * cameraAspectRatio, + child: CameraPreview(_cameraController!), + ), + ), + ); + }, + ), + ), + ), + ), + ), + + // 4. Плавающее поле ввода + Positioned( + left: 0, + right: 0, + bottom: 16, + child: _MeasureSize( + onChange: (size) { + if (_inputBarHeight != size.height) { + setState(() { + _inputBarHeight = size.height; + }); + + if (!_showScrollToEnd) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_scrollController.hasClients) { + _scrollController.animateTo( + 0.0, + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + ); + } + }); + } + } + }, + child: SafeArea( + top: false, + minimum: const EdgeInsets.fromLTRB(16, 0, 16, 2), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + clipBehavior: Clip.antiAlias, + child: AnimatedSize( + duration: const Duration(milliseconds: 250), + curve: Curves.easeOutCubic, + alignment: Alignment.bottomCenter, + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + clipBehavior: Clip.hardEdge, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: Container( + color: Theme.of( + context, + ).colorScheme.surfaceVariant.withOpacity(0.5), + child: _buildMessageInput(), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ), ), - floatingActionButton: _showScrollToEnd - ? FloatingActionButton( - onPressed: _scrollToBottom, - child: const Icon(Icons.keyboard_arrow_down), - tooltip: 'Перейти к последнему сообщению', - ) - : null, ); } + bool _isNewDay(int currentIndex) { + final int realIndex = messages.length - 1 - currentIndex; + + if (realIndex == 0) return true; + + final currentMsgTime = messages[realIndex].createdAt; + final previousMsgTime = messages[realIndex - 1].createdAt; + + return currentMsgTime.year != previousMsgTime.year || + currentMsgTime.month != previousMsgTime.month || + currentMsgTime.day != previousMsgTime.day; + } + + // Форматирование даты для плашки + String _formatDividerDate(DateTime date) { + final now = DateTime.now(); + if (date.year == now.year && + date.month == now.month && + date.day == now.day) { + return "Сегодня"; + } + final yesterday = now.subtract(const Duration(days: 1)); + if (date.year == yesterday.year && + date.month == yesterday.month && + date.day == yesterday.day) { + return "Вчера"; + } + + const months = [ + "января", + "февраля", + "марта", + "апреля", + "мая", + "июня", + "июля", + "августа", + "сентября", + "октября", + "ноября", + "декабря", + ]; + + return "${date.day} ${months[date.month - 1]} ${date.year != now.year ? date.year : ''}" + .trim(); + } + String _formatLastOnline(DateTime lastOnline) { final now = DateTime.now(); final difference = now.difference(lastOnline); @@ -362,6 +957,9 @@ class _ChatScreenState extends State with RouteAware { return '${difference.inHours} час${_pluralize(difference.inHours, "", "а", "ов")} назад'; } else if (difference.inDays < 7) { return '${difference.inDays} ${_pluralize(difference.inDays, "день", "дня", "дней")} назад'; + } else if (difference.inDays < 30) { + final weeks = (difference.inDays / 7).floor(); + return '$weeks ${_pluralize(weeks, "неделю", "недели", "недель")} назад'; } else { return 'давно'; } @@ -394,12 +992,15 @@ class _ChatScreenState extends State with RouteAware { leading: const Icon(Icons.reply), title: const Text('Ответить'), onTap: () { - Navigator.of(ctx).pop(); - String text = msg.text; - if (msg.text.isEmpty && msg.messageType == MessageType.image) { + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(); + String text = msg.text; + if (msg.text.isEmpty && + msg.messageType == MessageType.image) { text = "[Фото]"; - } - setState(() => _replyTo = msg.copyWith(text: text)); + } + setState(() => _replyTo = msg.copyWith(text: text)); + }); }, ), if (msg.isMe) @@ -407,51 +1008,76 @@ class _ChatScreenState extends State with RouteAware { leading: const Icon(Icons.edit), title: const Text('Изменить'), onTap: () { - Navigator.of(ctx).pop(); - _editMessage(msg); + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(); + _editMessage(msg); + }); }, ), ListTile( leading: const Icon(Icons.copy), title: const Text('Скопировать'), onTap: () async { - Navigator.of(ctx).pop(); - await Clipboard.setData(ClipboardData(text: msg.text)); - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Скопировано'), - behavior: - SnackBarBehavior.floating, // Обязательно для margin - margin: EdgeInsets.only( - bottom: - 80.0 + - 10.0, // 20px + стандартный отступ (по желанию) - left: 10.0, - right: 10.0, + WidgetsBinding.instance.addPostFrameCallback((_) async { + Navigator.of(ctx).pop(); + await Clipboard.setData(ClipboardData(text: msg.text)); + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Скопировано'), + behavior: + SnackBarBehavior.floating, // Обязательно для margin + margin: EdgeInsets.only( + bottom: + 80.0 + + 10.0, // 20px + стандартный отступ (по желанию) + left: 10.0, + right: 10.0, + ), + duration: Duration(seconds: 2), ), - duration: Duration(seconds: 2), - ), - ); + ); + }); }, ), - if (msg.messageType == MessageType.image) + if (msg.messageType == MessageType.image || + msg.messageType == MessageType.video || + msg.messageType == MessageType.videoNote) ListTile( leading: const Icon(Icons.save_alt), title: const Text('Сохранить в галерею'), onTap: () { - Navigator.of(ctx).pop(); - _saveImageToGallery(msg); + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(); + _saveMediaToGallery(msg); + }); }, ), ListTile( leading: const Icon(Icons.forward), title: const Text('Переслать'), onTap: () { - Navigator.of(ctx).pop(); - _showForwardContactPicker(msg); + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(); + _showForwardContactPicker(msg); + }); }, ), + /*if (msg.messageType == MessageType.image || + msg.messageType == MessageType.video || + msg.messageType == MessageType.file || + msg.messageType == MessageType.videoNote || + msg.messageType == MessageType.voiceNote) + ListTile( + leading: const Icon(Icons.delete_outline), + title: const Text('Удалить локальный файл'), + textColor: Colors.red, + iconColor: Colors.red, + onTap: () { + Navigator.of(ctx).pop(); + _deleteLocalFile(msg); + }, + ),*/ if (msg.isMe) ListTile( leading: const Icon(Icons.delete_outline), @@ -459,8 +1085,10 @@ class _ChatScreenState extends State with RouteAware { textColor: Colors.red, iconColor: Colors.red, onTap: () async { - Navigator.of(ctx).pop(); - await _deleteMessage(msg); + WidgetsBinding.instance.addPostFrameCallback((_) async { + Navigator.of(ctx).pop(); + await _deleteMessage(msg); + }); }, ), const SizedBox(height: 8), @@ -471,6 +1099,35 @@ class _ChatScreenState extends State with RouteAware { ); } + Future _deleteLocalFile(MessageModel msg) async { + if (msg.localFile != null && msg.localFile!.existsSync()) { + try { + await msg.localFile!.delete(); + debugPrint("Локальный файл успешно удален с диска: ${msg.fileId}"); + } catch (e) { + debugPrint("Ошибка при физическом удалении файла с диска: $e"); + // Даже если файл не удалился физически, мы всё равно очистим стейт, + // чтобы приложение не пыталось его прочитать и не падало. + } + + final sharedPrefs = await SharedPreferences.getInstance(); + final String sizeKey = 'valid_dec_size_${msg.fileId}'; + await sharedPrefs.remove(sizeKey); + + if (mounted) { + setState(() { + final idx = messages.indexWhere((m) => m.id == msg.id); + print( + "Очистка локального файла для сообщения ${msg.id}. Индекс в списке: $idx", + ); + if (idx != -1) { + messages[idx] = messages[idx].copyWith(localFile: null); + } + }); + } + } + } + Future _editMessage(MessageModel msg) async { final controller = TextEditingController(text: msg.text); final result = await showDialog( @@ -486,11 +1143,19 @@ class _ChatScreenState extends State with RouteAware { ), actions: [ TextButton( - onPressed: () => Navigator.of(ctx).pop(false), + onPressed: () { + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(false); + }); + }, child: const Text('Отмена'), ), ElevatedButton( - onPressed: () => Navigator.of(ctx).pop(true), + onPressed: () { + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(ctx).pop(true); + }); + }, child: const Text('Сохранить'), ), ], @@ -565,396 +1230,829 @@ class _ChatScreenState extends State with RouteAware { } Future _showForwardContactPicker(MessageModel msg) async { - final contactProvider = context.read(); - contactProvider.setCurrentUserId(myId); - await contactProvider.loadAllContactsForNewChat(); - if (!mounted) return; - - final selectedContact = await showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (ctx) { - final provider = context.watch(); - if (provider.isLoading) { - return const SizedBox( - height: 150, - child: Center(child: CircularProgressIndicator()), - ); - } - if (provider.error != null) { - return Padding( - padding: const EdgeInsets.all(16.0), - child: Text('Ошибка загрузки контактов: ${provider.error}'), - ); - } - if (provider.allContacts.isEmpty) { - return const Padding( - padding: EdgeInsets.all(16.0), - child: Text('Нет доступных контактов для пересылки.'), - ); - } - return SafeArea( - child: ListView.builder( - shrinkWrap: true, - itemCount: provider.allContacts.length, - itemBuilder: (ctx2, index) { - final contact = provider.allContacts[index]; - return ListTile( - leading: CircleAvatar( - child: Text(contact.name.isNotEmpty ? contact.name[0] : '?'), - ), - title: Text(contact.name), - subtitle: Text(contact.username), - onTap: () => Navigator.of(ctx).pop(contact), - ); - }, - ), - ); - }, + // Открываем новый красивый экран выбора вместо bottomSheet + final selectedContact = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ForwardContactPickerScreen(message: msg), + ), ); - if (selectedContact != null) { + // Если контакт был выбран и нажата кнопка «Продолжить» + if (selectedContact != null && mounted) { + // Запускаем твою готовую и исправленную функцию пересылки медиа/текста await _forwardMessage(msg, selectedContact); } } - Future _forwardMessage(MessageModel msg, Contact targetContact) async { - final forwardText = msg.text.trim(); - final isImage = msg.messageType == MessageType.image; - if (forwardText.isEmpty && !isImage) { - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Нечего пересылать.'), - behavior: SnackBarBehavior.floating, // Обязательно для margin - margin: EdgeInsets.only( - bottom: 80.0 + 10.0, // 20px + стандартный отступ (по желанию) - left: 10.0, - right: 10.0, - ), - duration: Duration(seconds: 5), - ), - ); - return; - } - - if (targetContact.publicKey == null) { - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Публичный ключ контакта ${targetContact.name} не найден.', - ), - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), - duration: const Duration(seconds: 3), - ), - ); - return; - } - + Future _forwardMessage( + MessageModel originalMsg, + Contact targetContact, + ) async { try { - final myPrivKey = await _cryptoService.getPrivateKey(); - if (myPrivKey == null) { - throw Exception('Не найден приватный ключ.'); - } - final sharedSecret = await _cryptoService.deriveSharedSecret( - myPrivKey, - targetContact.publicKey!, - ); + final isSameChat = _currentContact.id == targetContact.id; + String? newFileId; + String? newEncryptedKey; + File? newLocalFile; - String contentToEncrypt = forwardText; - if (contentToEncrypt.isEmpty && isImage) { - contentToEncrypt = ""; - } - final encryptedContent = await _cryptoService.encryptMessage( - contentToEncrypt, - sharedSecret, - ); - final String previewText = forwardText.isNotEmpty - ? (forwardText.length > 50 - ? forwardText.substring(0, 50) - : forwardText) - : (isImage ? "[Фото]" : ""); - final encryptedContent50 = await _cryptoService.encryptMessage( - previewText, - sharedSecret, - ); + final tempId = DateTime.now().millisecondsSinceEpoch; - String? fileIdToSend; - String? encryptedFileKeyToSend; - Uint8List? localImageBytes = msg.localFileBytes; - - if (isImage) { - if (msg.fileId != null && - msg.encryptedFileKey != null && - _currentContact.publicKey != null) { - final currentChatSharedSecret = await _cryptoService - .deriveSharedSecret(myPrivKey, _currentContact.publicKey!); - final originalFileKeyBytes = await _cryptoService.decryptAesKey( - msg.encryptedFileKey!, - currentChatSharedSecret, + // 1. E2EE Защита: Если публичного ключа нет в объекте, пробуем запросить его у сервера + String? targetPublicKey = targetContact.publicKey; + if (originalMsg.fileId != null && + (targetPublicKey == null || targetPublicKey.isEmpty)) { + debugPrint( + "==> [Forward] У контакта нет публичного ключа в кэше. Запрашиваем с сервера...", + ); + try { + // Вызываем метод твоего API для получения свежих данных пользователя + final freshContact = await apiService.getUserByUsername( + targetContact.username, ); - if (originalFileKeyBytes != null) { - final reencryptedKey = await _cryptoService.encryptAesKey( - originalFileKeyBytes, - sharedSecret, - ); - if (reencryptedKey != null) { - fileIdToSend = msg.fileId; - encryptedFileKeyToSend = reencryptedKey; - } + if (freshContact != null && freshContact.publicKey != null) { + targetPublicKey = freshContact.publicKey; + targetContact.publicKey = + freshContact.publicKey; // Обновляем инстанс в памяти } + } catch (e) { + debugPrint( + "==> [Forward] Не удалось запросить ключ получателя с сервера: $e", + ); + } + } + + // 2. Если есть медиа — обрабатываем на сервере и перешифровываем ключи + if (originalMsg.fileId != null) { + debugPrint( + "==> [Forward] Старт копирования медиа. fileId: ${originalMsg.fileId}", + ); + + final copiedFileId = await apiService.copyMediaOnServer( + originalMsg.fileId!, + targetContact.id, + ); + + if (copiedFileId == null) { + throw Exception("Сервер отказал в копировании файла"); + } + newFileId = copiedFileId; + + // Копируем локальный файл асинхронно, дожидаясь (await) завершения + if (originalMsg.localFile != null) { + final directory = await getApplicationDocumentsDirectory(); + // Сохраняем строго под префиксом file_, который ожидает MessageBubble + final decFile = '${directory.path}/dec_$copiedFileId'; + newLocalFile = await originalMsg.localFile!.copy(decFile); + print( + "Локальный файл для пересылки создан по пути: ${newLocalFile.path}", + ); + } else if (originalMsg.fileId != null) { + final directory = await getApplicationDocumentsDirectory(); + // Сохраняем строго под префиксом file_, который ожидает MessageBubble + final decFile = '${directory.path}/dec_$copiedFileId'; + final File oldFile = File( + '${directory.path}/dec_${originalMsg.fileId!}', + ); + newLocalFile = await oldFile.copy(decFile); + print( + "Локальный файл для пересылки создан через id по пути: ${newLocalFile.path}", + ); + } else { + print( + "Невозможно создать локальную копию файла для пересылки: отсутствует и локальный файл, и fileId.", + ); + } + final sharedPrefs = await SharedPreferences.getInstance(); + final String sizeKey = 'valid_dec_size_$copiedFileId'; + final finalFileSize = await newLocalFile?.length(); + if (finalFileSize != null && finalFileSize > 0) { + // Запоминаем, сколько байт весит ЧИСТЫЙ расшифрованный файл + await sharedPrefs.setInt(sizeKey, finalFileSize); + debugPrint( + "Файл успешно загружен. Размер сохранен: $finalFileSize байт.", + ); } - if (fileIdToSend == null || encryptedFileKeyToSend == null) { - if (msg.localFileBytes != null) { - final imageEncryptResult = await _cryptoService.encryptImage( - msg.localFileBytes!, - sharedSecret, - ); - if (imageEncryptResult == null) { - throw Exception('Ошибка шифрования пересылаемой картинки'); - } - fileIdToSend = await apiService.uploadMedia(imageEncryptResult.$1); - if (fileIdToSend == null) { - throw Exception( - 'Не удалось загрузить пересылаемое изображение на сервер', - ); - } - encryptedFileKeyToSend = imageEncryptResult.$2; - } - } + // Проверяем условия для криптографии + final myPrivKey = await _cryptoService.getPrivateKey(); - if (fileIdToSend == null || encryptedFileKeyToSend == null) { + if (originalMsg.encryptedFileKey == null) { throw Exception( - 'Невозможно переслать изображение: отсутствует шифрованный ключ или файл.', + "У оригинального сообщения отсутствует ключ шифрования файла.", ); } + if (targetPublicKey == null || targetPublicKey.isEmpty) { + throw Exception( + "Невозможно переслать медиа: у получателя отсутствует публичный ключ шифрования E2EE.", + ); + } + + final oldSecret = await _cryptoService.deriveSharedSecret( + myPrivKey!, + _currentContact.publicKey!, + ); + final newSecret = await _cryptoService.deriveSharedSecret( + myPrivKey, + targetPublicKey, + ); + + final decryptedKey = await _cryptoService.decryptAesKey( + originalMsg.encryptedFileKey!, + oldSecret, + ); + if (decryptedKey == null) { + throw Exception("Не удалось расшифровать ключ файла для пересылки"); + } + newEncryptedKey = await _cryptoService.encryptAesKey( + decryptedKey, + newSecret, + ); } - final tempId = DateTime.now().microsecondsSinceEpoch; - final localMessage = MessageModel( - tempId: tempId, - text: forwardText.isNotEmpty ? forwardText : (isImage ? "[Фото]" : ""), - isMe: true, - senderId: myId, - receiverId: targetContact.id, - createdAt: DateTime.now(), - status: MessageStatus.sending, - localFileBytes: isImage ? localImageBytes : null, - messageType: isImage ? MessageType.image : MessageType.text, - fileId: fileIdToSend, - encryptedFileKey: encryptedFileKeyToSend, + // 3. Отрисовываем сообщение в текущем чате (если пересылаем сами себе) + // Теперь localFile передается сразу, предотвращая ложные индикаторы загрузки + print( + "Перед добавлением пересланного сообщения в UI: newFileId=$newFileId, newEncryptedKey=${newEncryptedKey != null ? 'есть' : 'нет'}, newLocalFile=${newLocalFile != null ? 'есть' : 'нет'}", ); - if (_currentContact.id == targetContact.id) { + if (isSameChat) { + final localMsg = MessageModel( + tempId: tempId, + text: originalMsg.text, + isMe: true, + senderId: myId, + receiverId: targetContact.id, + createdAt: DateTime.now(), + status: MessageStatus.sending, + messageType: originalMsg.messageType, + fileId: newFileId ?? originalMsg.fileId, + fileName: originalMsg.fileName, + localFile: newLocalFile, + fileSize: originalMsg.fileSize, + encryptedFileKey: newEncryptedKey ?? originalMsg.encryptedFileKey, + ); + setState(() { - messages.add(localMessage); - _pendingImageBytes = null; + messages.add(localMsg); }); + _scrollToBottom(); } + // 4. Шифруем текстовую часть контента + if (targetPublicKey == null || targetPublicKey.isEmpty) { + throw Exception( + "У получателя отсутствует публичный ключ для шифрования текста.", + ); + } + + final textSecret = await _cryptoService.deriveSharedSecret( + (await _cryptoService.getPrivateKey())!, + targetPublicKey, + ); + final encryptedContent = await _cryptoService.encryptMessage( + originalMsg.text, + textSecret, + ); + + // 5. Формируем Payload final payload = { - 'type': 'private_message', - 'receiver_id': targetContact.id, - 'message_type': isImage ? 'image' : 'text', - 'content': encryptedContent, - 'content50': encryptedContent50, - 'temp_id': tempId, - if (isImage) ...{ - 'file_id': fileIdToSend, - 'encrypted_key': encryptedFileKeyToSend, + "type": "private_message", + "receiver_id": targetContact.id, + "message_type": originalMsg.messageType.name, + "content": encryptedContent, + "temp_id": tempId, + if (newFileId != null) ...{ + "file_id": newFileId, + "encrypted_key": newEncryptedKey, }, }; - final ok = Provider.of( - context, - listen: false, - ).sendMessage(payload); + // 6. Отправка и навигация + final socket = Provider.of(context, listen: false); + final isSent = socket.sendMessage(payload); - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - ok - ? 'Сообщение переслано контакту ${targetContact.name}.' - : 'Не удалось переслать сообщение.', - ), - behavior: SnackBarBehavior.floating, // Обязательно для margin - margin: const EdgeInsets.only( - bottom: 80.0 + 10.0, // 20px + стандартный отступ (по желанию) - left: 10.0, - right: 10.0, - ), - duration: const Duration(seconds: 3), - ), - ); + if (!isSent) throw Exception("Ошибка отправки через сокет"); - setState(() { - final idx = messages.indexWhere((m) => m.tempId == tempId); - if (idx != -1) { - messages[idx] = messages[idx].copyWith( - status: ok ? MessageStatus.sent : MessageStatus.failed, + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + if (!isSameChat) { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => ChatScreen(contact: targetContact), + ), ); + } else { + // Если переслали в текущий чат — обновляем статус + setState(() { + final idx = messages.indexWhere((m) => m.tempId == tempId); + if (idx != -1) { + messages[idx] = messages[idx].copyWith( + status: MessageStatus.sent, + fileId: newFileId ?? originalMsg.fileId, + localFile: newLocalFile, + ); + } + }); } - _replyTo = null; }); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ChatScreen(contact: targetContact), - ), - ); } catch (e) { - if (!mounted) return; + debugPrint("[Error] Ошибка пересылки: $e"); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text('Ошибка пересылки: $e'), - behavior: SnackBarBehavior.floating, - margin: const EdgeInsets.only( - bottom: 80.0 + 10.0, - left: 10.0, - right: 10.0, - ), - duration: const Duration(seconds: 5), + content: Text(e.toString().replaceAll("Exception: ", "")), + backgroundColor: Colors.redAccent, ), ); } } Widget _buildMessageInput() { - return SafeArea( - // Добавляем SafeArea здесь - child: Container( - color: Theme.of(context).colorScheme.surfaceVariant, - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (_replyTo != null) - Container( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), - margin: const EdgeInsets.only(bottom: 8), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - const Icon(Icons.reply, size: 18), - const SizedBox(width: 8), - Expanded( - child: Text( - _replyTo!.text.isNotEmpty - ? _replyTo!.text - : (_replyTo!.messageType == MessageType.image - ? "[Фото]" - : ""), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - IconButton( - icon: const Icon(Icons.close, size: 18), - onPressed: () => setState(() => _replyTo = null), - ), - ], - ), - ), - if (_pendingImageBytes != null) - Container( - margin: const EdgeInsets.only(bottom: 8), - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - Expanded( - child: ClipRRect( - borderRadius: BorderRadius.circular(10), - child: Image.memory( - _pendingImageBytes!, - fit: BoxFit.cover, - height: 120, + final bool hasTextOrFile = + _controller.text.trim().isNotEmpty || _pendingFile != null; + final bool showSendButton = hasTextOrFile || _isRecordLocked; + + return Stack( + clipBehavior: Clip.none, + children: [ + Container( + constraints: const BoxConstraints(maxHeight: 250), + decoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.surfaceVariant.withOpacity(0.75), + borderRadius: BorderRadius.circular(18), + border: Border.all( + color: Theme.of(context).dividerColor.withOpacity(0.25), + width: 1, + ), + ), + padding: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (_replyTo != null) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), + margin: const EdgeInsets.only(bottom: 8), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(12), + ), + child: Row( + children: [ + const Icon(Icons.reply, size: 18), + const SizedBox(width: 8), + Expanded( + child: Text( + _replyTo!.text.isNotEmpty + ? _replyTo!.text + : _getMediaPreview(_replyTo!.messageType), + maxLines: 1, + overflow: TextOverflow.ellipsis, ), ), - ), - const SizedBox(width: 8), - IconButton( - icon: const Icon(Icons.close), - onPressed: () => - setState(() => _pendingImageBytes = null), - ), - ], - ), - ), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - IconButton( - icon: const Icon(Icons.photo), - onPressed: _pickImage, - ), - Expanded( - child: TextField( - controller: _controller, - minLines: 1, - maxLines: 5, - textInputAction: TextInputAction.newline, - textCapitalization: TextCapitalization.sentences, - decoration: const InputDecoration( - hintText: "Напиши сообщение...", - ), + IconButton( + icon: const Icon(Icons.close, size: 18), + onPressed: () => setState(() => _replyTo = null), + ), + ], ), ), - IconButton( - icon: const Icon(Icons.send), - onPressed: () { - _sendMessage(); - }, + if (_pendingFile != null) + Container( + margin: const EdgeInsets.only(bottom: 6), + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.withOpacity(0.3)), + ), + child: Row( + children: [ + SizedBox( + width: 44, + height: 44, + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: _buildPreviewIcon(), + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + _pendingFileName ?? "Файл", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + Text( + _pendingMessageType.name.toUpperCase(), + style: const TextStyle(fontSize: 12), + ), + ], + ), + ), + IconButton( + icon: const Icon(Icons.close, size: 22), + onPressed: () => setState(() { + _pendingFile = null; + _pendingFileName = null; + _previewBytes = null; + _pendingMessageType = MessageType.text; + }), + ), + ], + ), ), - ], - ), - ], + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + if (!_isRecording) + GestureDetector( + onTapDown: (details) { + _showPopup(context, details.globalPosition); + }, + child: Container( + width: 32, + height: 32, + alignment: Alignment.center, + child: const Icon(Icons.photo, size: 22), + ), + ) + else + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6, vertical: 6), + child: Icon( + Icons.fiber_manual_record, + color: Colors.red, + size: 20, + ), + ), + Expanded( + child: _isRecording + ? Container( + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 4, + ), + child: Row( + children: [ + Text( + _stopwatchDisplay, + style: const TextStyle( + color: Colors.red, + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 8), + _isRecordLocked + ? Text( + "Удержание записи", + style: TextStyle( + color: Colors.grey.shade500, + fontSize: 11, + ), + ) + : Text( + _recordDragX < _swipeCancelThreshold / 2 + ? "Отпусти для отмены" + : (_recordDragY < + _swipeLockThreshold / 2 + ? "Отпусти для удержания" + : "Проведите вверх для удержания"), + style: TextStyle( + color: Colors.grey.shade500, + fontSize: 11, + ), + ), + const SizedBox(width: 4), + ], + ), + ) + : TextField( + controller: _controller, + minLines: 1, + maxLines: 5, + readOnly: _isRecordLocked, + textInputAction: TextInputAction.newline, + textCapitalization: TextCapitalization.sentences, + textAlignVertical: TextAlignVertical.center, + style: const TextStyle(fontSize: 15), + decoration: InputDecoration( + hintText: _isRecordLocked + ? "Запись зафиксирована..." + : "Напиши сообщение...", + isDense: true, + isCollapsed: true, + contentPadding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 6, + ), + ), + onChanged: (text) => setState(() {}), + ), + ), + _buildContextButton(showSendButton), + ], + ), + ], + ), + ), + ], + ); + } + + Widget _buildContextButton(bool showSendButton) { + if (showSendButton) { + return GestureDetector( + onTap: () { + if (_isRecordLocked) { + _stopAndSendRecording(); + } else { + _sendMessage(); + } + }, + child: Container( + width: 36, + height: 36, + alignment: Alignment.center, + child: const Icon(Icons.send, size: 22), + ), + ); + } + + return GestureDetector( + onTap: _toggleRecordMode, + onLongPressStart: (_) => _startRecording(), + onLongPressMoveUpdate: (details) { + if (!_isRecording || _isRecordLocked) return; + + setState(() { + _recordDragX = details.localOffsetFromOrigin.dx; + _recordDragY = details.localOffsetFromOrigin.dy; + }); + + if (_recordDragX < _swipeCancelThreshold) { + _cancelRecording(); + } else if (_recordDragY < _swipeLockThreshold) { + _lockRecording(); + } + }, + onLongPressEnd: (_) { + if (_isRecording && !_isRecordLocked) { + _stopAndSendRecording(); + } + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 100), + width: 36, + height: 36, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _isRecording + ? Colors.red.withOpacity(0.15) + : Colors.transparent, + shape: BoxShape.circle, + ), + child: Icon( + _isVoiceMode ? Icons.mic : Icons.videocam, + size: _isRecording ? 24 : 22, + color: _isRecording ? Colors.red : Theme.of(context).iconTheme.color, ), ), ); } - Future _pickImage() async { - final ImagePicker _picker = ImagePicker(); - final XFile? image = await _picker.pickImage( - source: ImageSource.gallery, - maxWidth: 1280, - maxHeight: 1280, - imageQuality: 80, + void _showPopup(BuildContext context, Offset position) async { + final selected = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + position.dx, + position.dy, + position.dx, + position.dy, + ), + items: [ + PopupMenuItem( + value: 'camera', + child: Row( + children: const [ + Icon(Icons.camera_alt), + SizedBox(width: 8), + Text("Камера"), + ], + ), + ), + PopupMenuItem( + value: 'gallery', + child: Row( + children: const [ + Icon(Icons.photo_library), + SizedBox(width: 8), + Text("Галерея"), + ], + ), + ), + PopupMenuItem( + value: 'file', + child: Row( + children: const [ + Icon(Icons.insert_drive_file), + SizedBox(width: 8), + Text("Файлы"), + ], + ), + ), + ], ); - if (image != null) { - final Uint8List fileBytes = await image.readAsBytes(); - if (!mounted) return; + + // обработка выбора + switch (selected) { + case 'camera': + _pickCamera(); + break; + case 'gallery': + _pickGallery(); + break; + case 'file': + _pickFile(); + break; + } + } + + Future _pickCamera() async { + WidgetsBinding.instance.addPostFrameCallback((_) async { + final result = await Navigator.push<(XFile, String)>( + context, + MaterialPageRoute(builder: (_) => const CameraScreen()), + ); + if (result == null) return; + final file = result.$1; + final type = result.$2; + final bytes = type == 'image' ? await file.readAsBytes() : null; setState(() { - _pendingImageBytes = fileBytes; + if (type == 'image') { + _previewBytes = bytes; + } + _pendingFile = File(file.path); + _pendingFileName = 'media_${DateTime.now().millisecondsSinceEpoch}'; + _pendingMessageType = type == 'video' + ? MessageType.video + : MessageType.image; }); + }); + } + + Future _pickGallery() async { + final photosGranted = await Permission.photos.request(); + final videosGranted = await Permission.videos.request(); + if (!photosGranted.isGranted || !videosGranted.isGranted) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "Разрешение на доступ к медиа необходимо для выбора фото или видео.", + ), + behavior: SnackBarBehavior.floating, + margin: EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), + duration: Duration(seconds: 3), + ), + ); + return; + } + final List? result = await AssetPicker.pickAssets( + context, + pickerConfig: AssetPickerConfig( + maxAssets: 1, + pageSize: 33, + gridCount: 3, + pickerTheme: ThemeData( + brightness: Theme.of(context).brightness, + primaryColor: Theme.of(context).primaryColor, + colorScheme: Theme.of(context).colorScheme, + scaffoldBackgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBarTheme: AppBarTheme( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Theme.of(context).textTheme.bodyLarge?.color, + ), + ), + specialItemBuilder: null, + ), + ); + if (result != null && result.isNotEmpty) { + final asset = result.first; + try { + Uint8List? bytes; + if (asset.type == AssetType.image) { + bytes = await asset.originBytes; + } + final File? file = await asset.file; + if (file == null) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Не удалось получить доступ к файлу медиа.'), + duration: Duration(seconds: 2), + ), + ); + return; + } + if (!mounted) return; + setState(() { + if (asset.type == AssetType.image && bytes != null) { + _previewBytes = bytes; + } + _pendingFile = file; + _pendingFileName = + asset.title ?? 'media_${DateTime.now().millisecondsSinceEpoch}'; + _pendingMessageType = asset.type == AssetType.video + ? MessageType.video + : MessageType.image; + }); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Ошибка при выборе медиа: $e'), + duration: const Duration(seconds: 3), + ), + ); + } + } + } + + Future _pickFile() async { + FilePickerResult? result = await FilePicker.pickFiles(type: FileType.any); + + if (result != null && result.files.isNotEmpty) { + try { + final file = File(result.files.single.path!); + + if (!mounted) return; + setState(() { + _pendingFile = file; + _pendingFileName = result.files.single.name; + _pendingMessageType = MessageType.file; + }); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Ошибка при выборе файла: $e'), + duration: const Duration(seconds: 3), + ), + ); + } + } + } + + Future _compressAndCropVideoNoteSafe(File originalVideoFile) async { + try { + if (!await originalVideoFile.exists()) { + debugPrint('==> FFmpeg: Исходный файл не найден на диске.'); + return null; + } + + final String targetOriginalPath = originalVideoFile.path; + debugPrint( + '==> Исходный файл: $targetOriginalPath, размер: ${await originalVideoFile.length()} байт', + ); + + // 1. Мгновенно переименовываем оригинальный файл во временный входной файл + final String tempInputPath = '${targetOriginalPath}_temp_input.mp4'; + final File movedOriginalFile = await originalVideoFile.rename( + tempInputPath, + ); + + // 2. Строим команду в виде списка аргументов (List). + // Больше никаких ручных кавычек вокруг путей типа "$tempInputPath" — плагин сам всё экранирует! + final List ffmpegArgs = [ + '-i', + tempInputPath, + '-vf', + 'crop=min(iw\\,ih):min(iw\\,ih),scale=512:512', + '-vcodec', + 'libx264', + '-crf', + '28', + '-preset', + 'fast', + '-y', + targetOriginalPath, + ]; + + debugPrint( + '==> FFmpeg: Запуск потоковой обработки через массив аргументов...', + ); + + // 3. Вызываем executeWithArguments вместо обычной строки + final session = await FFmpegKit.executeWithArguments(ffmpegArgs); + final returnCode = await session.getReturnCode(); + + // Логируем внутренний вывод FFmpeg на случай непредвиденных ошибок кодека устройства + final output = await session.getOutput(); + if (output != null && output.isNotEmpty) { + debugPrint('==> FFmpeg Консоль:\n$output'); + } + + if (ReturnCode.isSuccess(returnCode)) { + final outputFile = File(targetOriginalPath); + if (await outputFile.exists()) { + debugPrint( + '==> FFmpeg: Успех! Новый размер файла: ${await outputFile.length()} байт', + ); + } + + // Безопасно удаляем временный файл исходника + if (await movedOriginalFile.exists()) { + await movedOriginalFile.delete(); + } + + return outputFile; + } else { + final failStackTrace = await session.getFailStackTrace(); + debugPrint( + '==> FFmpeg: Ошибка кодирования. Код возврата: $returnCode. Стек: $failStackTrace', + ); + + // ВОССТАНОВЛЕНИЕ: Возвращаем оригинальный файл на место, если перекодирование не удалось + if (await movedOriginalFile.exists()) { + await movedOriginalFile.rename(targetOriginalPath); + } + return null; + } + } catch (e) { + debugPrint('==> Критическая ошибка при изменении файла: $e'); + return null; } } Future _sendMessage() async { _sendStopTypingStatus(); - final rawText = _controller.text.trim(); - final hasImage = _pendingImageBytes != null; + String rawText = _controller.text.trim(); + File? file = _pendingFile; + final MessageType messageType = _pendingMessageType; + final hasMedia = _pendingFile != null; + final replyTo = _replyTo; - // Если и текст пустой, и картинки нет — выходим - if (rawText.isEmpty && !hasImage) return; + if (messageType == MessageType.videoNote || + messageType == MessageType.voiceNote) { + rawText = + ""; // Для видеозаметок и голосовых сообщений текст не обязателен, игнорируем его + } + // Если и текст пустой, и медиа нет — выходим + if (rawText.isEmpty && !hasMedia) return; + _scrollToBottom(); // Блокируем UI на время загрузки _controller.clear(); + _pendingFile = null; + _pendingMessageType = MessageType.text; // Сбрасываем тип медиа + _previewBytes = null; // Очищаем превью + _pendingFileName = null; + _replyTo = null; + final tempId = DateTime.now().millisecondsSinceEpoch; try { + print( + "Исходный файл: ${file?.path}, размер: ${await file?.length()} байт", + ); + if (messageType == MessageType.videoNote && file != null) { + file = await _compressAndCropVideoNoteSafe(file); + print( + "После обработки видеозаметки: ${file?.path}, размер: ${await file?.length()} байт", + ); + } + + int? fileSize = await file?.length(); + // создаем первичную модель отобрадения + MessageModel tempMsg = MessageModel( + senderId: myId, + receiverId: _currentContact.id, + createdAt: DateTime.now(), + isMe: true, + text: rawText, + tempId: tempId, + messageType: messageType, + localFile: file, + status: MessageStatus.encrypting, + fileSize: fileSize, + replyToId: replyTo?.id, + replyToText: replyTo?.text, + fileId: tempId.toString(), + fileName: file != null ? p.basename(file.path) : "file", + ); + + setState(() => messages.add(tempMsg)); // 1. Подготовка ключей final myPrivKey = await _cryptoService.getPrivateKey(); final sharedSecret = await _cryptoService.deriveSharedSecret( @@ -967,53 +2065,114 @@ class _ChatScreenState extends State with RouteAware { String encryptedContent; String encryptedContent50; String? encryptedReplyToText; - - // 2. Если есть изображение — сначала загружаем его - if (hasImage) { - final encryptionResult = await _cryptoService.encryptImage( - _pendingImageBytes!, + _messageProgressNotifiers['${tempMsg.fileId}'] ??= ValueNotifier( + 0.0, + ); + _messageProgressNotifiers['${tempMsg.fileId}']!.value = 0.0; + // 2. Если есть медиа — сначала загружаем его + if (hasMedia && file != null && fileSize != null) { + final fileStream = file.openRead(); + final encryptedStream = await _cryptoService.encryptFileStream( + fileStream, sharedSecret, + totalSize: fileSize, + onProgress: (received, total) { + print(received); + if (total != -1) { + double progress = received / total; + if (progress > 1.0) progress = 1.0; + _messageProgressNotifiers['${tempMsg.fileId}']?.value = progress; + } + }, ); - if (encryptionResult == null) { - throw Exception("Ошибка шифрования медиа"); + final fileKeyForServer = encryptedStream.$2; + final tempDir = await getTemporaryDirectory(); + final encFile = File('${tempDir.path}/enc_${tempId}.tmp'); + final ios = encFile.openWrite(); + await ios.addStream(encryptedStream.$1); + await ios.close(); + + final int exactEncryptedSize = await encFile.length(); + + setState(() { + tempMsg = tempMsg.copyWith(status: MessageStatus.sending); + final idx = messages.indexWhere((m) => m.tempId == tempId); + if (idx != -1) { + messages[idx] = tempMsg; + } + fileSize = exactEncryptedSize; + }); + + _messageProgressNotifiers['${tempMsg.fileId}'] ??= + ValueNotifier(0.0); + _messageProgressNotifiers['${tempMsg.fileId}']!.value = 0.0; + fileId = await apiService.uploadFileStream( + encFile.openRead(), + exactEncryptedSize, + purpose: messageType.name, + fileName: p.basename(file.path), + + onProgress: (received, total) { + print(received); + if (total != -1) { + double progress = received / total; + if (progress > 1.0) progress = 1.0; + _messageProgressNotifiers['${tempMsg.fileId}']?.value = progress; + } + }, + ); + if (await encFile.exists()) { + await encFile.delete(); } - final encryptedFileData = encryptionResult.$1; - final fileKeyForServer = encryptionResult.$2; - fileId = await apiService.uploadMedia(encryptedFileData); - - if (fileId == null) throw Exception("Ошибка загрузки файла на сервер"); + if (fileId == null) { + throw Exception("Ошибка загрузки файла на сервер"); + } encryptedFileKey = fileKeyForServer; } - // 3. Шифруем текст сообщения (даже если там пусто, или есть подпись к фото) - // Если текста нет, но есть фото, отправим пустую строку или "[Фото]" + // 3. Шифруем текст сообщения (даже если там пусто, или есть подпись к медиа) + // Если текста нет, но есть медиа, отправим пустую строку final String textToEncrypt = rawText.isNotEmpty ? rawText - : (hasImage ? "" : ""); + : (hasMedia ? "" : ""); encryptedContent = await _cryptoService.encryptMessage( textToEncrypt, sharedSecret, ); - String previewText = rawText.isNotEmpty ? rawText : "[Фото]"; + // Генерируем превью текст в зависимости от типа медиа + String previewText; + if (rawText.isNotEmpty) { + previewText = rawText; + } else if (hasMedia) { + previewText = switch (messageType) { + MessageType.voiceNote => "[Кружок}", + MessageType.videoNote => "[Голосовое]", + MessageType.image => "[Фото]", + MessageType.video => "[Видео]", + MessageType.file => "[Файл]", + MessageType.text => "", + }; + } else { + previewText = ""; + } if (previewText.length > 50) previewText = previewText.substring(0, 50); encryptedContent50 = await _cryptoService.encryptMessage( previewText, sharedSecret, ); - if (_replyTo?.id != null && _replyTo!.text.trim().isNotEmpty) { + if (replyTo?.id != null && replyTo!.text.trim().isNotEmpty) { encryptedReplyToText = await _cryptoService.encryptMessage( - _replyTo!.text, + replyTo.text, sharedSecret, ); } // 4. Создаем локальную модель для мгновенного отображения - final tempId = DateTime.now().microsecondsSinceEpoch; final localMessage = MessageModel( tempId: tempId, text: rawText, @@ -1022,38 +2181,92 @@ class _ChatScreenState extends State with RouteAware { receiverId: _currentContact.id, createdAt: DateTime.now(), status: MessageStatus.sending, - localFileBytes: _pendingImageBytes, - messageType: hasImage ? MessageType.image : MessageType.text, + localFile: file, + messageType: messageType, fileId: fileId, encryptedFileKey: encryptedFileKey, - replyToId: _replyTo?.id, - replyToText: _replyTo?.text, + replyToId: replyTo?.id, + replyToText: replyTo?.text, + fileSize: await file?.length(), + fileName: file != null ? p.basename(file.path) : "file", ); + final directory = await getApplicationDocumentsDirectory(); + if (file != null) { + await file.copy('${directory.path}/dec_$fileId'); + print( + "DEBUG: Сохраняю файл: ${file.path}, существует: ${await file.exists()}, размер: ${await file.length()}", + ); + + final sharedPrefs = await SharedPreferences.getInstance(); + final String sizeKey = 'valid_dec_size_$fileId'; + final finalFileSize = await file.length(); + if (finalFileSize > 0) { + // Запоминаем, сколько байт весит ЧИСТЫЙ расшифрованный файл + await sharedPrefs.setInt(sizeKey, finalFileSize); + debugPrint( + "Файл успешно загружен. Размер сохранен: $finalFileSize байт.", + ); + } + } else { + print( + "==> [Warning] Локальный файл отсутствует для сообщения с tempId: $tempId", + ); + } setState(() { - messages.add(localMessage); - _pendingImageBytes = null; // Очищаем черновик + final idx = messages.indexWhere((m) => m.tempId == tempId); + if (idx != -1) { + messages[idx] = localMessage; + } + file = null; // Очищаем черновик }); + if (hasMedia && (fileId == null || encryptedFileKey == null)) { + throw Exception( + 'Не удалось загрузить медиа перед отправкой сообщения.', + ); + } + // 5. Формируем финальный payload для сокета final payload = { "type": "private_message", "receiver_id": _currentContact.id, - "message_type": hasImage ? "image" : "text", - "content": encryptedContent, // Шифрованный текст (подпись) - "content50": encryptedContent50, // Шифрованное превью + "message_type": messageType.name, + "content": encryptedContent, + "content50": encryptedContent50, "temp_id": tempId, - if (hasImage) ...{ + if (hasMedia) ...{ "file_id": fileId, - "encrypted_key": encryptedFileKey, // Зашифрованный AES-ключ файла + "encrypted_key": encryptedFileKey, + if (messageType == MessageType.file) + "file_name": file != null ? p.basename(file!.path) : "file", }, - if (_replyTo?.id != null) ...{ - "reply_to_id": _replyTo!.id, + if (replyTo?.id != null) ...{ + "reply_to_id": replyTo!.id, if (encryptedReplyToText != null) "reply_to_text": encryptedReplyToText, }, }; + // Логирование для отладки + print('[DEBUG] _sendMessage payload:'); + print('[DEBUG] - type: ${payload['type']}'); + print('[DEBUG] - receiver_id: ${payload['receiver_id']}'); + print('[DEBUG] - message_type: ${payload['message_type']}'); + print( + '[DEBUG] - content length: ${(payload['content'] as String?)?.length ?? 0}', + ); + print('[DEBUG] - temp_id: ${payload['temp_id']}'); + if (hasMedia) { + print('[DEBUG] - file_id: ${payload['file_id']}'); + print( + '[DEBUG] - encrypted_key: ${(payload['encrypted_key'] as String?)?.length ?? 0}', + ); + if (payload.containsKey('file_name')) { + print('[DEBUG] - file_name: ${payload['file_name']}'); + } + } + // 6. Отправка через сокет final ok = Provider.of( context, @@ -1071,8 +2284,23 @@ class _ChatScreenState extends State with RouteAware { _replyTo = null; }); } catch (e) { - // В случае ошибки возвращаем текст в контроллер + try { + setState(() { + final idx = messages.indexWhere((m) => m.tempId == tempId); + if (idx != -1) { + messages.removeAt(idx); + } + _replyTo = null; + }); + } catch (e) { + print(e); + } + print(e); + // В случае ошибки возвращаем текст и медиа в контроллер _controller.text = rawText; + _pendingFile = file; + _pendingMessageType = messageType; + _replyTo = replyTo; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text("Ошибка отправки: $e"), @@ -1085,10 +2313,10 @@ class _ChatScreenState extends State with RouteAware { } void _handleIncomingMessage(Map data) async { + print('Meesage from websocket: $data'); DateTime now = DateTime.now(); Duration offset = now.timeZoneOffset; - // ACK от сервера: сообщение сохранено и получило server_id if (data['type'] == 'message_sent') { final tempId = int.tryParse(data['temp_id']?.toString() ?? ''); final serverId = int.tryParse(data['server_id']?.toString() ?? ''); @@ -1097,16 +2325,26 @@ class _ChatScreenState extends State with RouteAware { )?.add(offset); if (tempId == null) return; - if (!mounted) return; + setState(() { final idx = messages.indexWhere((m) => m.tempId == tempId); if (idx == -1) return; - messages[idx] = messages[idx].copyWith( + + // 1. Создаем обновленный объект сообщения с серверным ID + final updatedMsg = messages[idx].copyWith( id: serverId ?? messages[idx].id, createdAt: ts ?? messages[idx].createdAt, status: MessageStatus.sent, ); + + // 2. Обновляем его в основном списке + messages[idx] = updatedMsg; + + // 3. ИСПРАВЛЕНИЕ: Обязательно регистрируем сообщение в мапе по его серверному ID! + if (serverId != null) { + _messageMap[serverId] = updatedMsg; + } }); return; } @@ -1144,11 +2382,10 @@ class _ChatScreenState extends State with RouteAware { if (!mounted) return; setState(() { - for (int i = 0; i < messages.length; i++) { - if (messages[i].id == messageId) { - messages[i] = messages[i].copyWith(status: MessageStatus.delivered); - } - } + _updateMessageInList( + messageId, + (m) => m.copyWith(status: MessageStatus.delivered), + ); }); if (ts != null) { @@ -1194,6 +2431,19 @@ class _ChatScreenState extends State with RouteAware { ts, ); } catch (_) {} + + // Обновить последнее сообщение в списке контактов + final contactProvider = context.read(); + if (messages.isNotEmpty && messages.last.id == messageId) { + await contactProvider.updateContactLastMessage( + widget.contact.id, + lastMessage: decryptedText, + lastMessageTime: ts, + isLastMsgDecrypted: true, + lastMessageId: messageId, + isEdited: true, + ); + } return; } @@ -1207,6 +2457,21 @@ class _ChatScreenState extends State with RouteAware { try { await _localDbService.deleteMessage(messageId); } catch (_) {} + + // Обновить последнее сообщение в списке контактов + final contactProvider = context.read(); + if (messages.isEmpty) { + // Если не осталось сообщений, очистить последнее сообщение + await contactProvider.updateContactLastMessage( + widget.contact.id, + lastMessage: null, + lastMessageTime: null, + lastMessageId: null, + ); + } else { + // Обновить на предпоследнее сообщение + await contactProvider.refreshContactLastMessage(widget.contact.id); + } return; } @@ -1219,11 +2484,10 @@ class _ChatScreenState extends State with RouteAware { if (!mounted) return; setState(() { - for (int i = 0; i < messages.length; i++) { - if (messages[i].id == messageId) { - messages[i] = messages[i].copyWith(status: MessageStatus.read); - } - } + _updateMessageInList( + messageId, + (m) => m.copyWith(status: MessageStatus.read), + ); }); if (ts != null) { @@ -1306,12 +2570,10 @@ class _ChatScreenState extends State with RouteAware { ? null : int.tryParse(data['reply_to_id'].toString()), replyToText: replyToText, - messageType: data['message_type'] == 'image' - ? MessageType.image - : MessageType.text, + messageType: _parseMessageTypeString(data['message_type']), fileId: data['file_id']?.toString(), encryptedFileKey: encryptedFileKey, - localFileBytes: decryptedImageBytes, + //localFile: decryptedImageBytes,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ), ); }); @@ -1389,48 +2651,45 @@ class _ChatScreenState extends State with RouteAware { ); print('[DEBUG] Локальная история загружена: ${cached.length} сообщений'); - // Сохраняем кэшированные изображения перед обновлением - Map cachedImages = {}; - for (var msg in cached) { - if (msg['id'] != null && msg['local_file_bytes'] != null) { - cachedImages[msg['id'] as int] = msg['local_file_bytes'] as Uint8List; - } - } + _chatSharedSecret = sharedSecret; + + // Сюда будем складывать успешно расшифрованные локальные сообщения + // Используем Map, где ключ — id сообщения, для мгновенного поиска + Map localMessagesMap = {}; try { - List loadedLocalMessages = []; for (var msg in cached) { - final decrypted = await _cryptoService.decryptMessage( - msg['content'], - sharedSecret, - ); + final msgId = int.tryParse(msg['id']?.toString() ?? ''); + if (msgId == null) continue; - final deliveredAt = msg['delivered_at'] == null - ? null - : DateTime.tryParse(msg['delivered_at'].toString())?.add(offset); - final readAt = msg['read_at'] == null - ? null - : DateTime.tryParse(msg['read_at'].toString())?.add(offset); + try { + final decrypted = await _cryptoService.decryptMessage( + msg['content'], + sharedSecret, + ); - MessageStatus status = (msg['sender_id'] == myId) - ? MessageStatus.sent - : MessageStatus.delivered; - if (msg['sender_id'] == myId) { - if (readAt != null) { - status = MessageStatus.read; - } else if (deliveredAt != null) { - status = MessageStatus.delivered; + final deliveredAt = msg['delivered_at'] == null + ? null + : DateTime.tryParse( + msg['delivered_at'].toString(), + )?.add(offset); + final readAt = msg['read_at'] == null + ? null + : DateTime.tryParse(msg['read_at'].toString())?.add(offset); + + MessageStatus status = (msg['sender_id'] == myId) + ? MessageStatus.sent + : MessageStatus.delivered; + if (msg['sender_id'] == myId) { + if (readAt != null) { + status = MessageStatus.read; + } else if (deliveredAt != null) { + status = MessageStatus.delivered; + } } - } - Uint8List? decryptedImageBytes; - if (msg['message_type'] == 'image') { - decryptedImageBytes = msg['local_file_bytes'] as Uint8List?; - } - - loadedLocalMessages.add( - MessageModel( - id: int.tryParse(msg['id']?.toString() ?? ''), + localMessagesMap[msgId] = MessageModel( + id: msgId, text: decrypted, isMe: msg['sender_id'] == myId, senderId: msg['sender_id'], @@ -1447,19 +2706,71 @@ class _ChatScreenState extends State with RouteAware { editedAt: msg['edited_at'] != null ? DateTime.tryParse(msg['edited_at'].toString())?.add(offset) : null, - messageType: msg['message_type'] == 'image' - ? MessageType.image - : MessageType.text, + messageType: _parseMessageTypeString(msg['message_type']), fileId: msg['file_id']?.toString(), encryptedFileKey: msg['encrypted_key']?.toString(), - localFileBytes: decryptedImageBytes, - ), - ); + fileName: msg['file_name']?.toString(), + fileSize: msg['file_size'] == null + ? null + : int.tryParse(msg['file_size'].toString()), + // ВАЖНО: Если в твоем MessageModel при чтении из БД как-то парсится localFile, + // обязательно пропиши его инициализацию здесь! + ); + } catch (e) { + // Обработка ошибки дешифровки локального сообщения... + final deliveredAt = msg['delivered_at'] == null + ? null + : DateTime.tryParse( + msg['delivered_at'].toString(), + )?.add(offset); + final readAt = msg['read_at'] == null + ? null + : DateTime.tryParse(msg['read_at'].toString())?.add(offset); + + MessageStatus status = (msg['sender_id'] == myId) + ? MessageStatus.sent + : MessageStatus.delivered; + if (msg['sender_id'] == myId) { + if (readAt != null) { + status = MessageStatus.read; + } else if (deliveredAt != null) { + status = MessageStatus.delivered; + } + } + localMessagesMap[msgId] = MessageModel( + id: msgId, + text: msg['content'], + isMe: msg['sender_id'] == myId, + senderId: msg['sender_id'], + receiverId: msg['receiver_id'], + createdAt: DateTime.parse(msg['timestamp']).add(offset), + status: status, + replyToId: msg['reply_to_id'] == null + ? null + : int.tryParse(msg['reply_to_id'].toString()), + replyToText: await _decryptReplyText( + msg['reply_to_text']?.toString(), + sharedSecret, + ), + editedAt: msg['edited_at'] != null + ? DateTime.tryParse(msg['edited_at'].toString())?.add(offset) + : null, + messageType: _parseMessageTypeString(msg['message_type']), + fileId: msg['file_id']?.toString(), + encryptedFileKey: msg['encrypted_key']?.toString(), + fileName: msg['file_name']?.toString(), + fileSize: msg['file_size'] == null + ? null + : int.tryParse(msg['file_size'].toString()), + ); + //print('Ошибка дешифровки сообщения: $e'); + } } - if (cached.isNotEmpty) { + + if (localMessagesMap.isNotEmpty) { if (!mounted) return; setState(() { - messages = loadedLocalMessages; + messages = localMessagesMap.values.toList(); _isKeyLoading = false; }); } @@ -1468,11 +2779,13 @@ class _ChatScreenState extends State with RouteAware { } final history = await apiService.getChatHistory(widget.contact.id); - print('[DEBUG] История с сервера загружена: ${history.length} сообщений'); - print(history); + print('[DEBUG] Загружена история из API: ${history.length}'); + final alreadyReadIncomingMessageIds = {}; List loadedMessages = []; + for (var msg in history) { + print(msg); final msgId = int.tryParse(msg['id']?.toString() ?? ''); if (msgId != null && msg['sender_id'] != myId && @@ -1503,13 +2816,16 @@ class _ChatScreenState extends State with RouteAware { } } - Uint8List? decryptedImageBytes; - // Lazy load images later to avoid downloading all at once + // КРИТИЧЕСКИЙ ФИКС: Ищем, есть ли это сообщение уже в локальном кэше + File? existingLocalFile; + if (msgId != null && localMessagesMap.containsKey(msgId)) { + existingLocalFile = localMessagesMap[msgId]?.localFile; + } loadedMessages.insert( 0, MessageModel( - id: int.tryParse(msg['id']?.toString() ?? ''), + id: msgId, text: decrypted, isMe: msg['sender_id'] == myId, senderId: msg['sender_id'], @@ -1526,25 +2842,23 @@ class _ChatScreenState extends State with RouteAware { editedAt: msg['edited_at'] != null ? DateTime.tryParse(msg['edited_at'].toString())?.add(offset) : null, - messageType: msg['message_type'] == 'image' - ? MessageType.image - : MessageType.text, + messageType: _parseMessageTypeString(msg['message_type']), fileId: msg['file_id']?.toString(), encryptedFileKey: msg['encrypted_key']?.toString(), - localFileBytes: cachedImages[int.tryParse(msg['id']?.toString() ?? '')] ?? decryptedImageBytes, + fileName: msg['file_name']?.toString(), + fileSize: msg['file_size'] == null + ? null + : int.tryParse(msg['file_size'].toString()), + // СОХРАНЯЕМ ФАЙЛ: Если он уже был скачан, мы не даем ему стать null! + localFile: existingLocalFile, ), ); } + try { print('[DEBUG] Начинаем очищение и сохранение истории в локальную БД'); - //await _localDbService.deleteChatHistory(widget.contact.id, myId); await _localDbService.saveMessages(loadedMessages); - print('[DEBUG] История успешно сохранена в локальную БД'); - - // Восстанавливаем кэшированные изображения - for (var entry in cachedImages.entries) { - await _localDbService.updateMessageLocalFileBytes(entry.key, entry.value); - } + print('[DEBUG] Сообщения сохранени в локальную бд'); } catch (e) { print("[ERROR] Ошибка сохранения истории в локальную базу: $e"); } @@ -1555,7 +2869,7 @@ class _ChatScreenState extends State with RouteAware { _isKeyLoading = false; }); - // Отправляем read_receipt для сообщений собеседника, которые уже на экране. + // Отправка read_receipt... for (final m in loadedMessages) { if (m.isMe) continue; final id = m.id; @@ -1572,6 +2886,270 @@ class _ChatScreenState extends State with RouteAware { } } + final Map>> _activeDownloads = {}; + + Future _stopFileLoading(MessageModel message) async { + if (message.fileId == null) return; + + final subscription = _activeDownloads.remove(message.fileId!); + if (subscription != null) { + await subscription.cancel(); + debugPrint("Загрузка файла ${message.fileId} отменена пользователем."); + + if (message.localFile != null && message.localFile!.existsSync()) { + try { + await message.localFile!.delete(); + debugPrint( + "Локальный файл успешно удален с диска: ${message.fileId}", + ); + } catch (e) { + debugPrint("Ошибка при физическом удалении файла с диска: $e"); + } + } + } + + if (mounted) { + setState(() { + _messageProgressNotifiers[message.fileId!]?.value = null; + }); + } + } + + int _findMessageIndex(MessageModel message) { + return messages.indexWhere((m) { + if (message.id != null && m.id == message.id) return true; + if (message.tempId != null && m.tempId == message.tempId) return true; + if (message.fileId != null && m.fileId == message.fileId) return true; + return false; + }); + } + + Future _fetchFileSizeIfNeeded(MessageModel message) async { + if (message.fileId == null) return; + + try { + debugPrint("Фоновый запрос размера для файла: ${message.fileId}"); + final (remoteSize, filename) = await apiService.getRemoteFileSizeAndName( + message.fileId!, + ); + + if (remoteSize != null && remoteSize > 0 && mounted) { + if (message.fileSize != null && message.fileSize! > 0) { + if (message.fileSize != remoteSize) { + debugPrint( + "Размер файла на сервере (${remoteSize} байт) отличается от локального (${message.fileSize} байт). Локальный файл признан недействительным.", + ); + if (message.localFile != null) { + message.localFile!.delete().catchError((e) { + debugPrint( + "Ошибка удаления недействительного локального файла: $e", + ); + }); + } + } + } + print( + "Получен размер файла из сети: $remoteSize байт. Обновляем модель сообщения.", + ); + setState(() { + final index = _findMessageIndex(message); + if (index != -1) { + messages[index] = messages[index].copyWith( + fileSize: remoteSize, + fileName: filename, + ); + } + }); + // Опционально: сохраняем в локальную БД, чтобы не дергать сеть в следующий раз + // await LocalDbService.updateMessageFileSize(message.id, remoteSize); + } + } catch (e) { + debugPrint("Ошибка фонового получения размера файла: $e"); + } + } + + Future _ensureFileDecrypted( + MessageModel message, { + bool dontLoad = false, + }) async { + MessageModel msg = message; + if (_activeDownloads.containsKey(msg.fileId)) return; + if (msg.fileId == null || _chatSharedSecret == null) return; + + final directory = await getApplicationDocumentsDirectory(); + final decFile = File('${directory.path}/dec_${msg.fileId}'); + final sharedPrefs = await SharedPreferences.getInstance(); + final String sizeKey = 'valid_dec_size_${msg.fileId}'; + + // --- НАЧАЛО ИСПРАВЛЕННОГО БЛОКА ВАЛИДАЦИИ РАЗМЕРА --- + if (await decFile.exists()) { + final localLength = await decFile.length(); + // Проверяем, есть ли у нас сохраненный эталонный размер именно ДЛЯ РАСШИФРОВАННОГО файла + final int? expectedDecryptedSize = sharedPrefs.getInt(sizeKey); + + if (expectedDecryptedSize != null) { + if (localLength != expectedDecryptedSize) { + debugPrint( + "Размер локального файла ($localLength байт) не совпадает с сохраненным эталоном ($expectedDecryptedSize байт). Файл поврежден. Удаляем.", + ); + await decFile.delete().catchError( + (e) => debugPrint("Ошибка удаления: $e"), + ); + await sharedPrefs.remove(sizeKey); + } else { + debugPrint( + "Локальный файл успешно прошел валидацию по сохраненному размеру.", + ); + if (mounted) { + setState(() { + final index = _findMessageIndex(msg); + if (index != -1) { + messages[index] = messages[index].copyWith(localFile: decFile); + } + }); + } + return; + } + } else { + await decFile.delete().catchError( + (e) => debugPrint("Удаление пустого файла: $e"), + ); + } + } + // --- КОНЕЦ БЛОКА ВАЛИДАЦИИ --- + + if (dontLoad) return; + + debugPrint("=== ОТЛАДКА СКАЧИВАНИЯ ==="); + debugPrint("ID файла: ${msg.fileId}"); + debugPrint("Ключ файла (Base64): ${msg.encryptedFileKey}"); + debugPrint("Общий ключ чата готов?: ${_chatSharedSecret != null}"); + + // Получаем или инициализируем Notifier прогресса для этого файла + final bool createdNewNotifier = + _messageProgressNotifiers[msg.fileId!] == null; + _messageProgressNotifiers[msg.fileId!] ??= ValueNotifier(0.0); + if (createdNewNotifier && mounted) { + setState(() {}); + } + _messageProgressNotifiers[msg.fileId!]!.value = 0.0; + + // Если размера файла в модели всё ещё нет, запрашиваем его у сервера через HEAD-запрос + if (msg.fileSize == null || msg.fileSize == 0) { + debugPrint("Размер файла в модели пуст. Делаем HEAD запрос..."); + final (remoteSize, filename) = await apiService.getRemoteFileSizeAndName( + msg.fileId!, + ); + if (remoteSize != null && remoteSize > 0) { + debugPrint("Успешно получен размер файла из сети: $remoteSize байт"); + + if (mounted) { + setState(() { + final index = _findMessageIndex(msg); + if (index != -1) { + // Берем элемент ИЗ МАССИВА сообщений (там данные актуальнее) + messages[index] = messages[index].copyWith( + fileSize: remoteSize, + fileName: filename, + ); + // Обновляем локальную переменную msg для дальнейшей корректной работы + msg = messages[index]; + } else { + msg = msg.copyWith(fileSize: remoteSize, fileName: filename); + } + }); + } + } + } + + final response = await apiService.downloadFileAsStream(msg.fileId!); + final networkStream = response.$1; + final fileName = response.$2; + + Stream> decryptedStream = _cryptoService.decryptFileStream( + networkStream, + _chatSharedSecret!, + msg.encryptedFileKey!, + totalBytes: msg.fileSize, + onProgress: (received, total) { + if (total != -1) { + double progress = received / total; + if (progress > 1.0) progress = 1.0; + _messageProgressNotifiers[msg.fileId!]?.value = progress; + } + }, + ); + + final iosink = decFile.openWrite(); + final Completer downloadCompleter = Completer(); + + final subscription = decryptedStream.listen( + (chunk) { + iosink.add(chunk); + }, + onError: (error) async { + debugPrint("Ошибка внутри криптострима: $error"); + await iosink.close(); + if (!downloadCompleter.isCompleted) downloadCompleter.complete(); + + await decFile.delete(); + }, + onDone: () async { + await iosink.close(); + + // --- СОХРАНЕНИЕ ТЕКУЩЕГО РАЗМЕРА ПОСЛЕ УСПЕШНОЙ ЗАГРУЗКИ --- + final finalLocalLength = await decFile.length(); + if (finalLocalLength > 0) { + // Запоминаем, сколько байт весит ЧИСТЫЙ расшифрованный файл + await sharedPrefs.setInt(sizeKey, finalLocalLength); + debugPrint( + "Файл успешно скачан и расшифрован. Сохранен валидный размер: $finalLocalLength байт.", + ); + } + + if (mounted) { + setState(() { + final updatedMsg = msg.copyWith( + localFile: decFile, + fileName: fileName, + ); + final index = _findMessageIndex(msg); + if (index != -1) { + messages[index] = updatedMsg; + } + }); + } + + try { + _activeDownloads.remove(msg.fileId)?.cancel(); + if (mounted) { + setState(() { + _messageProgressNotifiers[msg.fileId!]?.value = null; + }); + } + } catch (e) { + debugPrint("Ошибка при очистке ресурсов загрузки: $e"); + } + if (!downloadCompleter.isCompleted) downloadCompleter.complete(); + }, + cancelOnError: true, + ); + + _activeDownloads[msg.fileId!] = subscription; + + try { + await downloadCompleter.future; + } catch (e) { + debugPrint("Загрузка прервана или завершилась с ошибкой: $e"); + if (await decFile.exists()) { + await decFile.delete().catchError( + (e) => debugPrint("Ошибка очистки файла: $e"), + ); + } + await sharedPrefs.remove(sizeKey); // Чистим ключ при ошибке + } + } + Future _updateScrollButtonVisibility() async { if (!mounted) return; final shouldShow = @@ -1614,104 +3192,164 @@ class _ChatScreenState extends State with RouteAware { ); } - Future _loadImageBytesForMessage(MessageModel msg) async { - if (msg.localFileBytes != null) return msg.localFileBytes; - if (msg.fileId == null || msg.encryptedFileKey == null) return null; + void _openFullScreenMedia(MessageModel msg) async { + print('Открытие медиа'); + if (msg.fileId == null) return; - final myPrivKey = await _cryptoService.getPrivateKey(); - if (myPrivKey == null) return null; - final sharedSecret = await _cryptoService.deriveSharedSecret( - myPrivKey, - _currentContact.publicKey!, - ); - final bytes = await _downloadAndDecryptImage( - msg.fileId!, - msg.encryptedFileKey!, - sharedSecret, - ); - // Cache the downloaded bytes - if (bytes != null && msg.id != null) { - try { - await _localDbService.updateMessageLocalFileBytes(msg.id!, bytes); - // Update in-memory message - setState(() { - final idx = messages.indexWhere((m) => m.id == msg.id); - if (idx != -1) { - messages[idx] = messages[idx].copyWith(localFileBytes: bytes); - } - }); - } catch (e) { - print('Error caching image bytes: $e'); - } + // Получаем доступ к папке документов приложения + final directory = await getApplicationDocumentsDirectory(); + + final decPath = '${directory.path}/dec_${msg.fileId}'; + + final decFile = File(decPath); + + // 1. ПРОВЕРКА КЭША: если расшифрованный файл уже есть, открываем мгновенно + if (await decFile.exists() && await decFile.length() > 0) { + _navigateToViewer(decPath, msg); + return; } - return bytes; - } - Future _openFullScreenImage(MessageModel msg) async { - final bytes = await _loadImageBytesForMessage(msg); - if (bytes == null) { - if (!mounted) return; + // Проверяем наличие ключей перед началом долгого процесса + if (_chatSharedSecret == null || msg.encryptedFileKey == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Не удалось открыть изображение.'), - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), - ), + const SnackBar(content: Text("Ошибка: Ключи шифрования недоступны")), ); return; } - if (!mounted) return; - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => _FullScreenImageScreen(imageBytes: bytes), + + // Показываем индикатор загрузки (диалог или крутилку) + _showLoadingDialog(); + + try { + _ensureFileDecrypted(msg); + final decFile = File(decPath); + + if (await decFile.exists() && await decFile.length() > 0) { + _navigateToViewer(decPath, msg); + return; + } + } catch (e) { + debugPrint('Ошибка при обработке и дешифрации файла: $e'); + } + + // Если что-то пошло не так (ошибка сети, ошибка дешифрации) + if (mounted) { + // Закрываем _showLoadingDialog(), если он все еще открыт + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.of(context, rootNavigator: true).pop(); + }); + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text("Не удалось загрузить или расшифровать файл"), + ), + ); + } + } + + void _showLoadingDialog() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const Center( + child: Card( + child: Padding( + padding: EdgeInsets.all(20.0), + child: CircularProgressIndicator(), + ), + ), ), ); } - Future _saveImageToGallery(MessageModel msg) async { - final bytes = await _loadImageBytesForMessage(msg); - if (bytes == null) { - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Не удалось получить изображение для сохранения.'), - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), + void _navigateToViewer(String path, MessageModel msg) { + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => MediaViewer( + items: [ + MediaItem( + path: path, + isVideo: + msg.messageType == MessageType.video || + msg.messageType == 'video', + ), + ], + ), ), ); - return; - } + }); + } + Future _saveMediaToGallery(MessageModel msg) async { + final originalFile = msg.localFile; + if (originalFile == null || !originalFile.existsSync()) return; + + File? tempFile; try { - await Gal.putImageBytes(bytes); + // 1. Проверка доступности файла + // Пытаемся открыть файл на чтение. Если файл занят, это выбросит ошибку, + // и мы подождем перед тем, как копировать. + bool isFileReady = false; + int attempts = 0; + while (!isFileReady && attempts < 5) { + try { + final raf = await originalFile.open(mode: FileMode.read); + await raf.close(); + isFileReady = true; + } catch (e) { + await Future.delayed(const Duration(milliseconds: 500)); + attempts++; + } + } + + // 2. Копирование с правильным именем + String ext = p.extension(msg.fileName ?? ''); + if (ext.isEmpty) + ext = (msg.messageType == MessageType.video) ? '.mp4' : '.jpg'; + final String tempName = + 'save_${DateTime.now().millisecondsSinceEpoch}$ext'; + final Directory tempDir = await getTemporaryDirectory(); + tempFile = await originalFile.copy(p.join(tempDir.path, tempName)); + + // 3. Сохранение + if (msg.messageType == MessageType.video || + msg.messageType == MessageType.videoNote) { + await Gal.putVideo(tempFile.path); + } else { + await Gal.putImage(tempFile.path); + } + if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Изображение сохранено в галерею.'), - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Сохранено в галерею'))); } catch (e) { - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Не удалось сохранить изображение: $e'), - behavior: SnackBarBehavior.floating, - margin: const EdgeInsets.only(bottom: 80.0 + 10.0, left: 10.0, right: 10.0), - ), - ); + debugPrint("Ошибка: $e"); + // Если ошибка "битый файл", возможно, Gal еще держит временный файл + } finally { + // ВАЖНО: Удаляем только если файл существует + if (tempFile != null && await tempFile.exists()) { + try { + await tempFile.delete(); + } catch (_) {} + } } } Future _downloadAndDecryptImage( String fileId, String encryptedFileKey, - SecretKey sharedSecret, - ) async { + SecretKey sharedSecret, { + void Function(int received, int total)? onProgress, + }) async { try { print('DEBUG downloadMedia(fileId=$fileId)'); - final bytes = await apiService.downloadMedia(fileId); + final bytes = await apiService.downloadMedia( + fileId, + onProgress: onProgress, + ); if (bytes == null) { print('DEBUG downloadMedia returned null for fileId=$fileId'); return null; @@ -1719,7 +3357,7 @@ class _ChatScreenState extends State with RouteAware { print( 'DEBUG downloadMedia bytes length=${bytes.length} for fileId=$fileId', ); - final result = await _cryptoService.decryptImage( + final result = await _cryptoService.decryptMedia( bytes, encryptedFileKey, sharedSecret, @@ -1748,24 +3386,30 @@ class _ChatScreenState extends State with RouteAware { return encryptedReplyText; } } -} -class _FullScreenImageScreen extends StatelessWidget { - final Uint8List imageBytes; + Widget _buildPreviewIcon() { + switch (_pendingMessageType) { + case MessageType.image: + return _previewBytes != null + ? Image.memory(_previewBytes!, fit: BoxFit.cover) + : Container( + color: Colors.grey.withOpacity(0.2), + child: const Icon(Icons.image, color: Colors.grey), + ); - const _FullScreenImageScreen({required this.imageBytes}); + case MessageType.video: + return Container( + color: Colors.black, + child: const Icon(Icons.videocam, color: Colors.white), + ); - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.black, - appBar: AppBar( - backgroundColor: Colors.transparent, - elevation: 0, - iconTheme: const IconThemeData(color: Colors.white), - ), - body: Center(child: InteractiveViewer(child: Image.memory(imageBytes))), - ); + case MessageType.file: + default: + return Container( + color: Colors.blue.withOpacity(0.1), + child: const Icon(Icons.insert_drive_file, color: Colors.blue), + ); + } } } @@ -1838,3 +3482,45 @@ class _TypingIndicatorState extends State ); } } + +typedef _OnWidgetSizeChange = void Function(Size size); + +class _MeasureSize extends SingleChildRenderObjectWidget { + final _OnWidgetSizeChange onChange; + + const _MeasureSize({super.key, required super.child, required this.onChange}); + + @override + RenderObject createRenderObject(BuildContext context) { + return _MeasureSizeRenderObject(onChange: onChange); + } + + @override + void updateRenderObject( + BuildContext context, + _MeasureSizeRenderObject renderObject, + ) { + renderObject.onChange = onChange; + } +} + +class _MeasureSizeRenderObject extends RenderProxyBox { + _OnWidgetSizeChange onChange; + Size? _oldSize; + + _MeasureSizeRenderObject({required this.onChange, RenderBox? child}) + : super(child); + + @override + void performLayout() { + super.performLayout(); + + final newSize = size; + if (_oldSize != newSize) { + _oldSize = newSize; + WidgetsBinding.instance.addPostFrameCallback((_) { + onChange(newSize); + }); + } + } +} diff --git a/lib/presentation/screens/contacts_screen.dart b/lib/presentation/screens/contacts_screen.dart index a0540d0..567fd21 100644 --- a/lib/presentation/screens/contacts_screen.dart +++ b/lib/presentation/screens/contacts_screen.dart @@ -1,6 +1,6 @@ import 'dart:convert'; import 'package:chepuhagram/core/constants.dart'; -import 'package:chepuhagram/domain/services/aPI_service.dart'; +import 'package:chepuhagram/domain/services/api_service.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../widgets/contact_tile.dart'; @@ -44,6 +44,8 @@ class _ContactsScreenState extends State with RouteAware { CancelToken? _cancelToken = CancelToken(); String? _latestApkUrl; bool _showUpdateBanner = false; + bool _contactsLoaded = false; + Timer? _contactLoadTimer; @override void initState() { @@ -61,26 +63,38 @@ class _ContactsScreenState extends State with RouteAware { 'Setting current user ID in ContactProvider: ${authProvider.currentUserId}', ); contactProvider.setCurrentUserId(authProvider.currentUserId); - _initContacts(); + _startContactsLoadTimer(); }); - WidgetsBinding.instance.addPostFrameCallback((_) { - _checkAppUpdate(); + } + + Future _startContactsLoadTimer() async { + if (_contactLoadTimer != null && _contactLoadTimer!.isActive) return; + _contactLoadTimer = Timer(const Duration(seconds: 2), () { + _initContacts(); }); } Future _initContacts() async { + if (_contactsLoaded) return; // Предотвращаем повторную загрузку final contactProvider = context.read(); // Ждем завершения загрузки контактов await contactProvider.loadContacts(); print('Contacts loaded, checking targetChatId: ${widget.targetChatId}'); + WidgetsBinding.instance.addPostFrameCallback((_) { + _checkAppUpdate(); + }); + // Дальнейшая логика выполнится только после того, как loadContacts завершится if (widget.targetChatId != null) { _navigateToTargetChat(); } else { _checkSavedNotificationTarget(); } + _contactLoadTimer?.cancel(); + _contactLoadTimer = null; + _contactsLoaded = true; } @override @@ -290,6 +304,81 @@ class _ContactsScreenState extends State with RouteAware { contactProvider.updateContact(userId); } } + if (data['type'] == 'user_online') { + final userId = int.tryParse(data['user_id']?.toString() ?? ''); + if (userId != null) { + final contactProvider = context.read(); + contactProvider.updateContactOnlineStatus(userId, true); + } + } + if (data['type'] == 'user_offline') { + final userId = int.tryParse(data['user_id']?.toString() ?? ''); + if (userId != null) { + final contactProvider = context.read(); + contactProvider.updateContactOnlineStatus(userId, false); + } + } + if (data['type'] == 'message_edited') { + final messageId = int.tryParse(data['message_id']?.toString() ?? ''); + final senderId = int.tryParse(data['sender_id']?.toString() ?? ''); + if (messageId != null && senderId != null) { + final contactProvider = context.read(); + final contact = contactProvider.contacts + .where((c) => c.id == senderId) + .firstOrNull; + + if (contact != null) { + final editedAt = DateTime.tryParse( + data['edited_at']?.toString() ?? '', + ); + + // Дефолтные значения на случай ошибки расшифровки + String lastMessageText = contact.lastMessage ?? ''; + bool isDecrypted = false; + + final myPrivKey = await CryptoService().getPrivateKey(); + if (myPrivKey != null && contact.publicKey != null) { + try { + final sharedSecret = await CryptoService().deriveSharedSecret( + myPrivKey, + contact.publicKey!, + ); + lastMessageText = await CryptoService().decryptMessage( + data['content']?.toString() ?? '', + sharedSecret, + ); + isDecrypted = true; + } catch (e) { + print('Error decrypting edited message for contacts list: $e'); + } + } + + // Единая точка обновления состояния + await contactProvider.updateContactLastMessage( + contact.id, + lastMessage: lastMessageText, + lastMessageTime: editedAt, + isLastMsgDecrypted: isDecrypted, + lastMessageId: messageId, + isEdited: true, + ); + } + } + } + + if (data['type'] == 'message_deleted') { + final messageId = int.tryParse(data['message_id']?.toString() ?? ''); + if (messageId != null) { + final contactProvider = context.read(); + final contactIndex = contactProvider.contacts.indexWhere( + (c) => c.lastMessageId == messageId, + ); + if (contactIndex != -1) { + final contactId = contactProvider.contacts[contactIndex].id; + await contactProvider.refreshContactLastMessage(contactId); + } + } + } } } @@ -391,8 +480,19 @@ class _ContactsScreenState extends State with RouteAware { ); if (message.data['type'] == 'enc_message') { + print('Received private message FCM, updating contact $senderId'); final contactProvider = context.read(); - contactProvider.loadContacts(); + contactProvider.updateContact( + senderId, + lastMessage: decryptedText, + lastMessageTime: DateTime.tryParse( + message.data['timestamp'] ?? DateTime.now().toIso8601String(), + ), + isLastMsgDecrypted: true, + unreadCount: message.data['unread_count'] != null + ? int.tryParse(message.data['unread_count'].toString()) ?? 1 + : null, + ); } } catch (e) { print('Error processing foreground FCM message: $e'); @@ -401,7 +501,13 @@ class _ContactsScreenState extends State with RouteAware { @override Widget build(BuildContext context) { - final double fabBottomPadding = _showUpdateBanner ? 120.0 : 16.0; + double bannerHeight = 0.0; + if (_showUpdateBanner) { + bannerHeight = _isDownloading ? 152.0 : 96.0; + } + final double fabBottomPadding = _showUpdateBanner + ? (bannerHeight + 20.0) + : 16.0; return Scaffold( appBar: AppBar( title: Text( @@ -420,7 +526,15 @@ class _ContactsScreenState extends State with RouteAware { return const Center(child: CircularProgressIndicator()); } if (contactProvider.error != null) { - return Center(child: Text('Error: ${contactProvider.error}')); + return Center( + child: Text( + '${contactProvider.error?.replaceAll('Exception: ', '')}', + style: TextStyle( + color: Theme.of(context).colorScheme.error, + ), + textAlign: TextAlign.center, + ), + ); } return ListView.separated( itemCount: contactProvider.contacts.length, @@ -459,7 +573,7 @@ class _ContactsScreenState extends State with RouteAware { ], ), floatingActionButton: AnimatedPadding( - duration: const Duration(milliseconds: 300), + duration: const Duration(milliseconds: 100), curve: Curves.easeInOut, padding: EdgeInsets.only(bottom: fabBottomPadding), child: FloatingActionButton( diff --git a/lib/presentation/screens/forward_contact_picker_screen.dart b/lib/presentation/screens/forward_contact_picker_screen.dart new file mode 100644 index 0000000..95cd9ed --- /dev/null +++ b/lib/presentation/screens/forward_contact_picker_screen.dart @@ -0,0 +1,300 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import '/core/constants.dart'; +import '/data/models/message_model.dart'; +import '/data/models/contact_model.dart'; +import '/logic/contact_provider.dart'; +import '/domain/services/api_service.dart'; + +class ForwardContactPickerScreen extends StatefulWidget { + final MessageModel message; + + const ForwardContactPickerScreen({ + super.key, + required this.message, + }); + + @override + State createState() => _ForwardContactPickerScreenState(); +} + +class _ForwardContactPickerScreenState extends State { + Contact? _selectedContact; + bool _isInitLoading = true; + SharedPreferences? _prefs; + String? token; + + @override + void initState() { + super.initState(); + _loadActiveChats(); + } + + Future _loadActiveChats() async { + try { + final contactProvider = context.read(); + await contactProvider.loadContacts(); + + final apiService = ApiService(); + final accessToken = await apiService.getAccessToken(); + final shared = await SharedPreferences.getInstance(); + + if (mounted) { + setState(() { + _prefs = shared; + token = accessToken; + }); + } + } catch (e) { + debugPrint("Ошибка при загрузке данных для пересылки: $e"); + } finally { + if (mounted) { + setState(() { + _isInitLoading = false; + }); + } + } + } + + String _getDisplayName(Contact contact) { + if (_prefs == null) return contact.name; + final id = contact.id; + final savedName = _prefs!.getString('firstname_$id'); + if (savedName != null && savedName.isNotEmpty) { + return savedName; + } + return contact.name; + } + + String _formatTime(DateTime? time) { + if (time == null) return ''; + final localTime = time.toLocal(); + final hour = localTime.hour.toString().padLeft(2, '0'); + final minute = localTime.minute.toString().padLeft(2, '0'); + return '$hour:$minute'; + } + + @override + Widget build(BuildContext context) { + final contactProvider = context.watch(); + final contacts = contactProvider.contacts; + final isLoading = _isInitLoading || contactProvider.isLoading; + final primaryColor = Theme.of(context).colorScheme.primary; + + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_rounded), + onPressed: () => Navigator.of(context).pop(), + ), + title: const Text( + 'Переслать...', + style: TextStyle(fontWeight: FontWeight.w600), + ), + actions: [ + AnimatedOpacity( + duration: const Duration(milliseconds: 200), + opacity: _selectedContact != null ? 1.0 : 0.4, + child: TextButton( + onPressed: _selectedContact != null + ? () => Navigator.of(context).pop(_selectedContact) + : null, + child: const Text( + 'Продолжить', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ), + const SizedBox(width: 8), + ], + ), + body: () { + if (isLoading) { + return const Center(child: CircularProgressIndicator()); + } + + if (contactProvider.error != null) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + 'Ошибка: ${contactProvider.error}', + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.grey), + ), + ), + ); + } + + if (contacts.isEmpty) { + return const Center( + child: Text( + 'Нет активных чатов для пересылки.', + style: TextStyle(color: Colors.grey, fontSize: 15), + ), + ); + } + + return ListView.builder( + itemCount: contacts.length, + itemBuilder: (context, index) { + final contact = contacts[index]; + final isSelected = _selectedContact?.id == contact.id; + + // Логика формирования текста сообщения (1-в-1 как в твоем ContactTile) + final bool isDecrypted = contact.isLastMsgDecrypted ?? false; + final String subtitleText = isDecrypted + ? (contact.lastMessage == null + ? "Нет сообщений" + : "${contact.lastMessageType != null ? MessageModel.getMediaPreview(contact.lastMessageType!) : ''} ${contact.lastMessage}".trim()) + : (contact.lastMessage != null + ? "Ожидание дешифровки..." + : "Нет сообщений"); + + // Логика формирования URL аватарки + final avatarUrl = contact.effectiveAvatarUrl; + final bool hasAvatar = avatarUrl != null && avatarUrl.isNotEmpty; + + return InkWell( + onTap: () { + setState(() { + if (isSelected) { + _selectedContact = null; + } else { + _selectedContact = contact; + } + }); + }, + child: Container( + color: isSelected ? primaryColor.withOpacity(0.08) : Colors.transparent, + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + + // 1. АВАТАРКА + leading: Stack( + children: [ + if (hasAvatar) + CircleAvatar( + radius: 24, + backgroundColor: Colors.grey[200], + child: ClipOval( + child: CachedNetworkImage( + imageUrl: avatarUrl, + width: 48, + height: 48, + fit: BoxFit.cover, + httpHeaders: token != null ? {'Authorization': 'Bearer $token'} : null, + placeholder: (context, url) => const CircularProgressIndicator(strokeWidth: 2), + errorWidget: (context, url, error) => CircleAvatar( + radius: 24, + backgroundColor: primaryColor.withOpacity(0.1), + child: Text( + _getDisplayName(contact).isNotEmpty ? _getDisplayName(contact)[0].toUpperCase() : '?', + style: TextStyle(color: primaryColor, fontWeight: FontWeight.bold), + ), + ), + ), + ), + ) + else + CircleAvatar( + radius: 24, + backgroundColor: primaryColor.withOpacity(0.1), + child: Text( + _getDisplayName(contact).isNotEmpty ? _getDisplayName(contact)[0].toUpperCase() : '?', + style: TextStyle(color: primaryColor, fontWeight: FontWeight.bold), + ), + ), + + if (contact.isOnline == true) + Positioned( + right: 0, + bottom: 0, + child: Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: Colors.green, + shape: BoxShape.circle, + border: Border.all(color: Theme.of(context).scaffoldBackgroundColor, width: 2), + ), + ), + ), + ], + ), + + // 2. ИМЯ + title: Text( + _getDisplayName(contact), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 16), + ), + + // 3. ПОСЛЕДНЕЕ СООБЩЕНИЕ + subtitle: Text( + subtitleText, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(color: Colors.grey), + ), + + // 4. ПРАВАЯ ЧАСТЬ (Анимация переключения Время <-> Галочка) + trailing: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: (Widget child, Animation animation) { + return ScaleTransition(scale: animation, child: child); + }, + child: isSelected + ? Container( + key: const ValueKey('checkmark'), + width: 24, + height: 24, + decoration: BoxDecoration( + color: primaryColor, + shape: BoxShape.circle, + ), + child: const Icon(Icons.check_rounded, color: Colors.white, size: 16), + ) + : Column( + key: const ValueKey('time_and_badge'), + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + _formatTime(contact.lastMessageTime), + style: const TextStyle(color: Colors.grey, fontSize: 12), + ), + if (contact.unreadCount > 0) ...[ + const SizedBox(height: 4), + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: primaryColor.withAlpha((0.5 * 255).round()), + shape: BoxShape.circle, + ), + child: Text( + '${contact.unreadCount}', + style: const TextStyle(color: Colors.white, fontSize: 10), + ), + ), + ], + ], + ), + ), + ), + ), + ); + }, + ); + }(), + ); + } +} \ No newline at end of file diff --git a/lib/presentation/screens/media_preview_screen.dart b/lib/presentation/screens/media_preview_screen.dart new file mode 100644 index 0000000..8fccb04 --- /dev/null +++ b/lib/presentation/screens/media_preview_screen.dart @@ -0,0 +1,235 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; +import 'package:flutter/services.dart'; +import 'dart:math'; +import 'package:open_filex/open_filex.dart'; + +class MediaPreviewScreen extends StatefulWidget { + final String path; + final bool isVideo; + + const MediaPreviewScreen({ + super.key, + required this.path, + required this.isVideo, + }); + + @override + State createState() => _MediaPreviewScreenState(); +} + +class _MediaPreviewScreenState extends State { + VideoPlayerController? _videoController; + bool _isPlaying = true; + String? _videoInitError; + + @override + void initState() { + super.initState(); + + if (widget.isVideo) { + _videoController = VideoPlayerController.file(File(widget.path)) + ..initialize() + .then((_) { + _videoInitError = null; + if (!mounted) return; + setState(() {}); + _videoController!.setLooping(false); + _videoController!.play(); + }) + .catchError((e) { + _videoInitError = e.toString(); + _videoController?.dispose().catchError((_) {}); + _videoController = null; + if (mounted) setState(() {}); + }); + + _videoController!.addListener(() { + if (mounted) setState(() {}); + }); + } + } + + @override + void dispose() { + _videoController?.dispose(); + super.dispose(); + } + + String _formatDuration(Duration d) { + String two(int n) => n.toString().padLeft(2, '0'); + final m = two(d.inMinutes.remainder(60)); + final s = two(d.inSeconds.remainder(60)); + return "$m:$s"; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + appBar: null, + body: Stack( + children: [ + // MEDIA + Center( + child: widget.isVideo + ? (_videoInitError != null) + ? _buildVideoInitErrorFallback() + : (_videoController != null && + _videoController!.value.isInitialized) + ? Stack( + alignment: Alignment.center, + children: [ + AspectRatio( + aspectRatio: _videoController!.value.aspectRatio, + child: VideoPlayer(_videoController!), + ), + + // overlay controls + Positioned( + bottom: 40, + left: 16, + right: 16, + child: _buildVideoControls(), + ), + ], + ) + : const CircularProgressIndicator() + : Image.file(File(widget.path)), + ), + + // BOTTOM ACTIONS (как Telegram) + Positioned( + bottom: 40, + left: 16, + right: 16, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // переснять + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white10, + ), + onPressed: () { + Navigator.pop(context, false); + }, + icon: const Icon(Icons.refresh), + label: const Text("Переснять"), + ), + + // отправить + ElevatedButton.icon( + onPressed: () { + WidgetsBinding.instance.addPostFrameCallback((_) { + Navigator.pop(context, true); + }); + }, + icon: const Icon(Icons.send), + label: const Text("Отправить"), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildVideoControls() { + final c = _videoController!; + final duration = c.value.duration; + final position = c.value.position; + + final posMs = position.inMilliseconds.toDouble(); + final maxMs = duration.inMilliseconds + .toDouble() + .clamp(1, double.infinity) + .toDouble(); + + return Container( + child: Row( + children: [ + // ▶️ / ⏸ слева + IconButton( + padding: EdgeInsets.zero, + constraints: const BoxConstraints(), + icon: Icon( + c.value.isPlaying ? Icons.pause : Icons.play_arrow, + color: Colors.white, + size: 26, + ), + onPressed: () { + setState(() { + if (c.value.isPlaying) { + c.pause(); + _isPlaying = false; + } else { + c.play(); + _isPlaying = true; + } + }); + }, + ), + + Expanded( + child: SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 2, // ТОНКИЙ как в Telegram + activeTrackColor: Colors.white, + inactiveTrackColor: Colors.white24, + thumbColor: Colors.white, + overlayColor: Colors.transparent, + thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 5), + ), + child: Slider( + value: posMs.clamp(0, maxMs).toDouble(), + min: 0, + max: maxMs, + onChanged: (v) { + c.seekTo(Duration(milliseconds: v.toInt())); + }, + ), + ), + ), + + const SizedBox(width: 8), + + Text( + "${_formatDuration(position)} / ${_formatDuration(duration)}", + style: const TextStyle(color: Colors.white, fontSize: 12), + ), + ], + ), + ); + } + + Widget _buildVideoInitErrorFallback() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.play_disabled, color: Colors.white70, size: 48), + const SizedBox(height: 10), + const Text( + 'Видео РЅРµ воспроизводится РЅР° этом устройстве', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white70), + ), + const SizedBox(height: 10), + OutlinedButton.icon( + onPressed: () async { + try { + await OpenFilex.open(widget.path); + } catch (_) {} + }, + icon: const Icon(Icons.open_in_new, color: Colors.white70), + label: const Text( + 'Открыть внешним плеером', + style: TextStyle(color: Colors.white70), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/screens/media_viewer_screen.dart b/lib/presentation/screens/media_viewer_screen.dart new file mode 100644 index 0000000..7545002 --- /dev/null +++ b/lib/presentation/screens/media_viewer_screen.dart @@ -0,0 +1,330 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:video_player/video_player.dart'; +import 'package:open_filex/open_filex.dart'; + +class MediaItem { + final String path; + final bool isVideo; + + MediaItem({ + required this.path, + required this.isVideo, + }); +} + +class MediaViewer extends StatefulWidget { + final List items; + final int initialIndex; + + const MediaViewer({ + super.key, + required this.items, + this.initialIndex = 0, + }); + + @override + State createState() => _MediaViewerState(); +} + +class _MediaViewerState extends State { + late PageController _pageController; + VideoPlayerController? _videoController; + String? _videoInitError; + + int _index = 0; + bool _uiVisible = true; + bool _isLandscape = false; + + @override + void initState() { + super.initState(); + + _index = widget.initialIndex; + _pageController = PageController(initialPage: _index); + + // 1. Скрываем строку состояния и панель навигации при входе в плеер + _hideSystemUI(); + + _initVideoIfNeeded(_index); + } + + Future _initVideoIfNeeded(int index) async { + _videoController?.removeListener(_videoListener); + _videoController?.dispose(); + _videoController = null; + _videoInitError = null; + + final item = widget.items[index]; + + if (!item.isVideo) return; + + final controller = VideoPlayerController.file(File(item.path)); + _videoController = controller; + + try { + await controller.initialize(); + _videoController!.addListener(_videoListener); + controller.setLooping(false); + controller.play(); + _videoInitError = null; + } catch (e) { + _videoInitError = e.toString(); + _videoController?.removeListener(_videoListener); + await _videoController?.dispose().catchError((_) {}); + _videoController = null; + } finally { + if (mounted) setState(() {}); + } + } + + void _videoListener() { + if (mounted) { + setState(() {}); + } + } + + // Метод скрытия системного UI (Status bar и Navigation bar) + void _hideSystemUI() { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); + } + + // Метод показа системного UI при выходе из полноэкранного режима + void _showSystemUI() { + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, + overlays: SystemUiOverlay.values, // Возвращает статус-бар и нижний бар + ); + } + + void _toggleOrientation() { + setState(() { + _isLandscape = !_isLandscape; + }); + + if (_isLandscape) { + SystemChrome.setPreferredOrientations([ + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); + } else { + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + ]); + } + } + + @override + void dispose() { + _videoController?.removeListener(_videoListener); + _videoController?.dispose(); + _pageController.dispose(); + + // 2. Обязательно возвращаем системный UI и портретный режим при выходе + _showSystemUI(); + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + ]); + super.dispose(); + } + + void _toggleUI() { + setState(() => _uiVisible = !_uiVisible); + } + + String _format(Duration d) { + String two(int n) => n.toString().padLeft(2, '0'); + return "${two(d.inMinutes.remainder(60))}:${two(d.inSeconds.remainder(60))}"; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + // SafeArea гарантирует, что даже если системные бары скрыты/показаны, + // интерактивные элементы интерфейса (кнопки закрытия, плеер) + // никогда не уйдут под физические вырезы экрана (челку, скругления) + body: SafeArea( + child: GestureDetector( + onTap: _toggleUI, + behavior: HitTestBehavior.opaque, + child: Stack( + children: [ + // MEDIA PAGES (Контент растягивается на весь экран) + Positioned.fill( + child: PageView.builder( + controller: _pageController, + onPageChanged: (i) async { + setState(() => _index = i); + await _initVideoIfNeeded(i); + }, + itemCount: widget.items.length, + itemBuilder: (context, i) { + final item = widget.items[i]; + + if (item.isVideo) { + if (_videoInitError != null) { + return _buildVideoInitErrorFallback(item.path); + } + + if (_videoController == null || + !_videoController!.value.isInitialized) { + return const Center( + child: CircularProgressIndicator(color: Colors.white), + ); + } + + return Center( + child: AspectRatio( + aspectRatio: _videoController!.value.aspectRatio, + child: VideoPlayer(_videoController!), + ), + ); + } + + return Center( + child: InteractiveViewer( + maxScale: 4.0, + child: Image.file( + File(item.path), + fit: BoxFit.contain, + ), + ), + ); + }, + ), + ), + + // TOP BAR (Кнопки управления сверху) + if (_uiVisible) + Positioned( + top: 10, // Маленький фиксированный отступ, т.к. SafeArea уже защищает сверху + left: 16, + right: 16, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon(Icons.close, color: Colors.white, size: 28), + onPressed: () => Navigator.pop(context), + ), + IconButton( + icon: Icon( + Icons.screen_rotation, + color: Colors.white, + size: 26, + ), + onPressed: _toggleOrientation, + ), + ], + ), + ), + + // VIDEO CONTROLS (Нижняя панель управления видео) + if (_uiVisible && + widget.items[_index].isVideo && + _videoController != null && + _videoController!.value.isInitialized) + Positioned( + bottom: 10, // Прижато к низу безопасной зоны SafeArea + left: 16, + right: 16, + child: _buildVideoControls(), + ), + ], + ), + ), + ), + ); + } + + Widget _buildVideoControls() { + final c = _videoController!; + final pos = c.value.position; + final dur = c.value.duration; + + final posMs = pos.inMilliseconds.toDouble(); + final maxMs = dur.inMilliseconds.toDouble().clamp(1, double.infinity).toDouble(); + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(30), + ), + child: Row( + children: [ + IconButton( + icon: Icon( + c.value.isPlaying ? Icons.pause : Icons.play_arrow, + color: Colors.white, + size: 28, + ), + onPressed: () { + setState(() { + c.value.isPlaying ? c.pause() : c.play(); + }); + }, + ), + Expanded( + child: SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 4, + activeTrackColor: Colors.white60, + inactiveTrackColor: Colors.white30, + thumbColor: Colors.white, + thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6), + overlayColor: Colors.transparent, + ), + child: Slider( + value: posMs.clamp(0, maxMs), + min: 0, + max: maxMs, + onChanged: (v) { + c.seekTo(Duration(milliseconds: v.toInt())); + }, + ), + ), + ), + const SizedBox(width: 8), + Text( + "${_format(pos)} / ${_format(dur)}", + style: const TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.bold), + ), + const SizedBox(width: 8), + ], + ), + ); + } + + Widget _buildVideoInitErrorFallback(String path) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.play_disabled, color: Colors.white70, size: 56), + const SizedBox(height: 10), + const Text( + 'Видео РЅРµ воспроизводится РЅР° этом устройстве', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white70), + ), + const SizedBox(height: 10), + OutlinedButton.icon( + onPressed: () async { + try { + await OpenFilex.open(path); + } catch (_) {} + }, + icon: const Icon(Icons.open_in_new, color: Colors.white70), + label: const Text( + 'Открыть внешним плеером', + style: TextStyle(color: Colors.white70), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/privacy_settings_screen.dart b/lib/presentation/screens/privacy_settings_screen.dart index 7b15e85..a8bc354 100644 --- a/lib/presentation/screens/privacy_settings_screen.dart +++ b/lib/presentation/screens/privacy_settings_screen.dart @@ -14,14 +14,12 @@ class _PrivacySettingsScreenState extends State { static const _showPhoneKey = 'privacy_show_phone'; static const _showAvatarKey = 'privacy_show_avatar'; static const _showAboutKey = 'privacy_show_about'; - static const _showUsernameKey = 'privacy_show_username'; static const _showLastOnlineKey = 'privacy_show_last_online'; bool _showEmail = true; bool _showPhone = true; bool _showAvatar = true; bool _showAbout = true; - bool _showUsername = true; bool _showLastOnline = true; bool _isSaving = false; @@ -39,7 +37,6 @@ class _PrivacySettingsScreenState extends State { _showPhone = prefs.getBool(_showPhoneKey) ?? true; _showAvatar = prefs.getBool(_showAvatarKey) ?? true; _showAbout = prefs.getBool(_showAboutKey) ?? true; - _showUsername = prefs.getBool(_showUsernameKey) ?? true; _showLastOnline = prefs.getBool(_showLastOnlineKey) ?? true; }); } @@ -53,7 +50,6 @@ class _PrivacySettingsScreenState extends State { _showPhone = data['show_phone'] ?? true; _showAvatar = data['show_avatar'] ?? true; _showAbout = data['show_about'] ?? true; - _showUsername = data['show_username'] ?? true; _showLastOnline = data['show_last_online'] ?? true; }); // Сохраняем локально для быстрого доступа @@ -61,7 +57,6 @@ class _PrivacySettingsScreenState extends State { await _savePreference(_showPhoneKey, _showPhone); await _savePreference(_showAvatarKey, _showAvatar); await _savePreference(_showAboutKey, _showAbout); - await _savePreference(_showUsernameKey, _showUsername); await _savePreference(_showLastOnlineKey, _showLastOnline); } catch (e) { // Если не удалось загрузить с сервера, используем локальные настройки @@ -86,7 +81,6 @@ class _PrivacySettingsScreenState extends State { showPhone: _showPhone, showAvatar: _showAvatar, showAbout: _showAbout, - showUsername: _showUsername, showLastOnline: _showLastOnline, ); @@ -96,7 +90,6 @@ class _PrivacySettingsScreenState extends State { await _savePreference(_showPhoneKey, _showPhone); await _savePreference(_showAvatarKey, _showAvatar); await _savePreference(_showAboutKey, _showAbout); - await _savePreference(_showUsernameKey, _showUsername); await _savePreference(_showLastOnlineKey, _showLastOnline); if (mounted) { @@ -150,13 +143,6 @@ class _PrivacySettingsScreenState extends State { children: [ const Text('Настройки видимости', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), const SizedBox(height: 12), - SwitchListTile( - title: const Text('Показывать имя пользователя (@username)'), - value: _showUsername, - onChanged: (value) { - setState(() => _showUsername = value); - }, - ), SwitchListTile( title: const Text('Показывать почту другим'), value: _showEmail, diff --git a/lib/presentation/screens/user_profile_screen.dart b/lib/presentation/screens/user_profile_screen.dart index b2447fc..da63dd2 100644 --- a/lib/presentation/screens/user_profile_screen.dart +++ b/lib/presentation/screens/user_profile_screen.dart @@ -54,6 +54,8 @@ class _UserProfileScreenState extends State { } Future _loadUserData() async { + _error = null; + _isLoading = true; try { final api = ApiService(); final data = await api.getUserById(widget.userId); @@ -74,10 +76,18 @@ class _UserProfileScreenState extends State { } catch (e) { if (mounted) { setState(() { - _error = e.toString().replaceAll('Exception: ', ''); + if (e.toString().contains('SocketFailed')) { + _error = + 'Ошибка соединения с сервером. Проверьте интернет соединение.'; + } else { + _error = e.toString().replaceAll('Exception: ', ''); + } _isLoading = false; }); } + Future.delayed(Duration(seconds: 2), () { + _loadUserData(); + }); } } @@ -195,7 +205,8 @@ class _UserProfileScreenState extends State { style: TextStyle(fontSize: 12, color: Colors.greenAccent), textAlign: TextAlign.center, ) - else if (DateTime.tryParse(_userData!['last_online']) != null) + else if (_userData!['last_online'] != null && + DateTime.tryParse(_userData!['last_online']) != null) Text( 'Был(а) в сети ${_formatLastOnline(DateTime.tryParse(_userData!['last_online'])!.add(offset != null ? offset! : Duration.zero))}', style: const TextStyle( @@ -365,6 +376,9 @@ class _UserProfileScreenState extends State { return '${difference.inHours} час${_pluralize(difference.inHours, "", "а", "ов")} назад'; } else if (difference.inDays < 7) { return '${difference.inDays} ${_pluralize(difference.inDays, "день", "дня", "дней")} назад'; + } else if (difference.inDays < 30) { + final weeks = (difference.inDays / 7).floor(); + return '$weeks ${_pluralize(weeks, "неделю", "недели", "недель")} назад'; } else { return 'давно'; } diff --git a/lib/presentation/widgets/contact_tile.dart b/lib/presentation/widgets/contact_tile.dart index 946129e..d01b371 100644 --- a/lib/presentation/widgets/contact_tile.dart +++ b/lib/presentation/widgets/contact_tile.dart @@ -1,13 +1,15 @@ +import 'package:chepuhagram/domain/services/aPI_service.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '/data/models/contact_model.dart'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:chepuhagram/data/models/message_model.dart'; class ContactTile extends StatefulWidget { final Contact contact; final VoidCallback? onTap; - const ContactTile({super.key, required this.contact, this.onTap}); + ContactTile({super.key, required this.contact, this.onTap}); @override State createState() => _ContactTileState(); @@ -15,24 +17,22 @@ class ContactTile extends StatefulWidget { class _ContactTileState extends State { SharedPreferences? _prefs; - - - Duration? offset; - + String? token; @override void initState() { super.initState(); - DateTime now = DateTime.now(); - offset = now.timeZoneOffset; _initPrefs(); } Future _initPrefs() async { + final apiService = ApiService(); + final accessToken = await apiService.getAccessToken(); final shared = await SharedPreferences.getInstance(); if (mounted) { setState(() { _prefs = shared; + token = accessToken; }); } } @@ -59,8 +59,8 @@ class _ContactTileState extends State { @override Widget build(BuildContext context) { final primary = Theme.of(context).colorScheme.primary; + final username = widget.contact.username; // - final username = widget.contact.username; final initials = (displayName.isNotEmpty ? displayName @@ -70,60 +70,108 @@ class _ContactTileState extends State { .where((p) => p.isNotEmpty) .take(2) .map((p) => p[0].toUpperCase()) - .join(); - + .join(); // + debugPrint( + '=== CONTACT DEBUG: ${widget.contact.name} -> URL: ${widget.contact.effectiveAvatarUrl}', + ); return ListTile( - onTap: widget.onTap, - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), - leading: CircleAvatar( - radius: 28, - backgroundColor: primary.withAlpha((0.1 * 255).round()), - backgroundImage: widget.contact.effectiveAvatarUrl != null - ? CachedNetworkImageProvider(widget.contact.effectiveAvatarUrl!) - : null, - child: widget.contact.effectiveAvatarUrl == null - ? Text( - initials, - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, + onTap: widget.onTap, // + contentPadding: EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), // + // Переписываем ведущий виджет (аватарку) + leading: SizedBox( + width: 56, // Соответствует радиусу 28 * 2 + height: 56, + child: + widget.contact.effectiveAvatarUrl != + null // + ? CachedNetworkImage( + imageUrl: widget.contact.effectiveAvatarUrl!, // + // Передаем токен для FastAPI, чтобы сервер разрешил скачивание файла + httpHeaders: { + if (token != null) 'Authorization': 'Bearer $token', + }, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + // Пока картинка качается — показываем цветной круг с инициалами + placeholder: (context, url) => CircleAvatar( + radius: 28, + backgroundColor: primary.withAlpha((0.1 * 255).round()), + child: Text( + initials, + style: TextStyle( + color: primary, + fontWeight: FontWeight.bold, + ), + ), + ), + // Ошибка 401, 404 или упал интернет? Без паники, плавно вернем инициалы + errorWidget: (context, url, error) => CircleAvatar( + radius: 28, + backgroundColor: primary.withAlpha((0.1 * 255).round()), + child: Text( + initials, + style: TextStyle( + color: primary, + fontWeight: FontWeight.bold, + ), + ), ), ) - : null, + : CircleAvatar( + radius: 28, + backgroundColor: primary.withAlpha((0.1 * 255).round()), // + child: Text( + initials, + style: TextStyle(color: primary, fontWeight: FontWeight.bold), + ), + ), ), + title: Text( - displayName, - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + displayName, // + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), // ), subtitle: Text( widget.contact.isLastMsgDecrypted - ? widget.contact.lastMessage ?? "Нет сообщений" + ? widget.contact.lastMessage == null + ? "Нет сообщений" + : "${widget.contact.lastMessageType != null ? MessageModel.getMediaPreview(widget.contact.lastMessageType!) : ''} ${widget.contact.lastMessage}" : (widget.contact.lastMessage != null ? "Ожидание дешифровки..." : "Нет сообщений"), maxLines: 1, overflow: TextOverflow.ellipsis, - style: const TextStyle(color: Colors.grey), + style: TextStyle(color: Colors.grey), // ), trailing: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - _formatTime(widget.contact.lastMessageTime), - style: const TextStyle(color: Colors.grey, fontSize: 12), + _formatTime(widget.contact.lastMessageTime), // + style: TextStyle(color: Colors.grey, fontSize: 12), // ), - const SizedBox(height: 4), - if (widget.contact.unreadCount > 0) + SizedBox(height: 4), // + if (widget.contact.unreadCount > 0) // Container( - padding: const EdgeInsets.all(6), + padding: EdgeInsets.all(6), // decoration: BoxDecoration( - color: primary.withAlpha((0.5 * 255).round()), - shape: BoxShape.circle, + color: primary.withAlpha((0.5 * 255).round()), // + shape: BoxShape.circle, // ), child: Text( - '${widget.contact.unreadCount}', - style: const TextStyle(color: Colors.white, fontSize: 10), + '${widget.contact.unreadCount}', // + style: TextStyle(color: Colors.white, fontSize: 10), // ), ), ], @@ -133,7 +181,6 @@ class _ContactTileState extends State { String _formatTime(DateTime? time) { if (time == null) return ""; - time = time.add(offset!); return "${time.hour}:${time.minute.toString().padLeft(2, '0')}"; } } diff --git a/lib/presentation/widgets/message_bubble.dart b/lib/presentation/widgets/message_bubble.dart index 7fd1b66..d06ca46 100644 --- a/lib/presentation/widgets/message_bubble.dart +++ b/lib/presentation/widgets/message_bubble.dart @@ -3,16 +3,30 @@ import '/data/models/message_model.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:provider/provider.dart'; -import 'dart:typed_data'; import '/core/theme_manager.dart'; -import '/core/constants.dart'; +import 'dart:math'; +import 'dart:io'; +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:video_thumbnail/video_thumbnail.dart'; +import 'package:path_provider/path_provider.dart'; +import 'dart:ui' as ui; +import 'dart:math' as math; +import 'package:video_player/video_player.dart'; +import 'package:audioplayers/audioplayers.dart'; class MessageBubble extends StatefulWidget { final MessageModel message; final VoidCallback? onTap; final VoidCallback? onReplyTap; final VoidCallback? onImageTap; - final Future Function(MessageModel)? onImageNeeded; + + final Future? Function(MessageModel)? onDownloadRequested; + final Future? Function(MessageModel)? onDownloadRequestedWithoutLoad; + final Future? Function(MessageModel)? onDownloadStoped; + final bool autoLoadMedia; + final ValueListenable? downloadProgress; const MessageBubble({ super.key, @@ -20,7 +34,11 @@ class MessageBubble extends StatefulWidget { this.onTap, this.onReplyTap, this.onImageTap, - this.onImageNeeded, + this.onDownloadRequested, + this.onDownloadRequestedWithoutLoad, + this.onDownloadStoped, + this.autoLoadMedia = true, + this.downloadProgress, }); @override @@ -28,40 +46,422 @@ class MessageBubble extends StatefulWidget { } class _MessageBubbleState extends State { - Uint8List? _imageBytes; + bool _isMediaLoading = false; + bool _requiresManualLoad = false; + int _calculatedFileSize = 0; + final int _autoDownloadLimit = 20 * 1024 * 1024; // 20 MB + int minHeight = 0; + int minWidth = 0; + + ValueListenable? _downloadProgressNotifier; + Future? _delayFuture; + + final MediaCacheManager _mediaCache = MediaCacheManager(); + + bool get _isDownloading { + return widget.message.localFile == null && + (_isMediaLoading || widget.downloadProgress?.value != null); + } + + String get _messageKeyId => + (widget.message.id ?? widget.message.tempId ?? widget.message.hashCode) + .toString(); @override void initState() { super.initState(); - if (widget.message.localFileBytes == null && - widget.message.messageType == MessageType.image && - widget.onImageNeeded != null) { - _loadImage(); + _syncDownloadProgressListener(); + _resolveFileSize(); + _generateVideoThumbnail(); + + final isMedia = + widget.message.messageType == MessageType.image || + widget.message.messageType == MessageType.video || + widget.message.messageType == MessageType.file || + widget.message.messageType == MessageType.videoNote || + widget.message.messageType == MessageType.voiceNote; + + if (isMedia) { + final type = widget.message.messageType; + final bool isNote = + type == MessageType.voiceNote || type == MessageType.videoNote; + + if (isNote) { + _requiresManualLoad = false; + } else if (_calculatedFileSize > 0) { + _requiresManualLoad = + !widget.autoLoadMedia || _calculatedFileSize > _autoDownloadLimit; + } else { + _requiresManualLoad = true; + } + + if (widget.message.localFile == null) { + widget.onDownloadRequestedWithoutLoad?.call(widget.message); + + if (!_requiresManualLoad) { + _checkAutoDownload(); + } else if (isNote) { + _startDownload(); + } + } + } + + if (widget.message.messageType == MessageType.videoNote) { + setState(() { + minHeight = 160; + minWidth = 160; + }); } } - Future _loadImage() async { - final bytes = await widget.onImageNeeded!(widget.message); - if (mounted) { + Future getImageDimensions(File imageFile) async { + final bytes = await imageFile.readAsBytes(); + final codec = await ui.instantiateImageCodec(bytes); + final frameInfo = await codec.getNextFrame(); + return frameInfo.image; + } + + Future _generateVideoThumbnail() async { + if (widget.message.messageType != MessageType.video) { + return; + } + _delayFuture = Future.delayed(const Duration(milliseconds: 200)).then(( + _, + ) async { + if (!mounted) return; + + if (widget.message.messageType != MessageType.video || + widget.message.localFile == null) { + return; + } + + if (_mediaCache.getDimensions(_messageKeyId) != null && + _mediaCache.getThumbnailPath(_messageKeyId) != null) { + return; + } + try { + final double timestamp = DateTime.now().millisecondsSinceEpoch + .toDouble(); + final targetDirectory = Directory( + '${Directory.systemTemp.path}/thumbs/$timestamp', + ); + + if (!await targetDirectory.exists()) { + await targetDirectory.create(recursive: true); + } + final String? thumb = await VideoThumbnail.thumbnailFile( + video: widget.message.localFile!.path, + thumbnailPath: targetDirectory.path, + imageFormat: ImageFormat.JPEG, + maxWidth: 400, + quality: 75, + ); + if (thumb == null) { + debugPrint('Не удалось сгенерировать превью для видео'); + return; + } + File file = File(thumb); + ui.Image img = await getImageDimensions(file); + _mediaCache.saveDimensions(_messageKeyId, img.width, img.height); + _mediaCache.saveThumbnailPath(_messageKeyId, thumb); + if (mounted) { + setState(() { + minHeight = img.height; + minWidth = img.width; + }); + } + } catch (e) { + debugPrint('Ошибка генерации превью видео: $e'); + } + }); + } + + @override + void didUpdateWidget(covariant MessageBubble oldWidget) { + super.didUpdateWidget(oldWidget); + _syncDownloadProgressListener(); + + print( + "MessageBubble: didUpdateWidget called for message id ${widget.message.id}", + ); + final bool fileExistsNow = + widget.message.localFile != null && + widget.message.localFile!.existsSync(); + + final bool _lastKnownFileExists = + oldWidget.message.localFile != null && + oldWidget.message.localFile!.existsSync(); + + // Флаг удаления: файл был (мы это помним), а сейчас его нет + final bool becameNull = !fileExistsNow && _lastKnownFileExists; + // Флаг появления: файла не было (мы это помнили), а сейчас он есть + final bool becameReady = fileExistsNow && !_lastKnownFileExists; + print( + "ID ${widget.message.id}: fileExistsNow=$fileExistsNow, lastKnown=$_lastKnownFileExists, becameNull=$becameNull", + ); + // Сценарий А: Файл есть в модели И физически существует на диске + if (widget.message.localFile != null && fileExistsNow) { + if (_requiresManualLoad || _isMediaLoading || becameReady) { + setState(() { + _requiresManualLoad = false; + _isMediaLoading = false; + }); + } + + if (becameReady) { + _resolveFileSize(); + _generateVideoThumbnail(); + } + return; + } + + // Сценарий Б: Файл был удален физически с диска (или ссылка стала null) + if (becameNull) { + print("ОБНАРУЖЕНО УДАЛЕНИЕ ФАЙЛА ДЛЯ ${widget.message.id}"); + setState(() { - _imageBytes = bytes; + _isMediaLoading = false; + _requiresManualLoad = true; + }); + + _resolveFileSize(); + return; + } + + if (fileExistsNow && !_lastKnownFileExists) { + setState(() { + _isMediaLoading = false; + }); + _resolveFileSize(); + } + + // Сценарий В: Файла нет (и не было), проверяем изменение остальных параметров (текст, статус и т.д.) + final bool fileChanged = + widget.message.localFile != oldWidget.message.localFile; + final bool sizeChanged = + widget.message.fileSize != oldWidget.message.fileSize; + final bool statusChanged = + widget.message.status != oldWidget.message.status; + final bool textChanged = widget.message.text != oldWidget.message.text; + final bool fileIdChanged = widget.message.fileId != oldWidget.message.fileId; + final bool fileNameChanged = + widget.message.fileName != oldWidget.message.fileName; + + if (statusChanged || textChanged || fileChanged || fileIdChanged || fileNameChanged) { + setState(() {}); + } + if (fileChanged || sizeChanged || statusChanged || fileIdChanged || fileNameChanged) { + _resolveFileSize(); + } + + // Ниже идет ваш стандартный код для автозагрузки медиа (isMedia && sizeChanged)... + final isMedia = + widget.message.messageType == MessageType.image || + widget.message.messageType == MessageType.video || + widget.message.messageType == MessageType.file || + widget.message.messageType == MessageType.videoNote || + widget.message.messageType == MessageType.voiceNote; + + if (isMedia && sizeChanged) { + final oldSize = oldWidget.message.fileSize ?? 0; + final newSize = widget.message.fileSize ?? 0; + final type = widget.message.messageType; + final bool isNote = + type == MessageType.voiceNote || type == MessageType.videoNote; + + if (oldSize == 0 && newSize > 0) { + setState(() { + _requiresManualLoad = isNote + ? false + : !widget.autoLoadMedia || newSize > _autoDownloadLimit; + }); + + if (widget.message.localFile == null) { + widget.onDownloadRequestedWithoutLoad?.call(widget.message); + } + if (!_requiresManualLoad && widget.message.localFile == null) { + _startDownload(); + _generateVideoThumbnail(); + } else if (widget.message.localFile == null && isNote) { + _startDownload(); + } + } + } + } + + void _resolveFileSize() { + if (widget.message.fileSize != null && widget.message.fileSize! > 0) { + _calculatedFileSize = widget.message.fileSize!; + } else if (widget.message.localFile != null && + widget.message.localFile!.existsSync()) { + _calculatedFileSize = widget.message.localFile!.lengthSync(); + } else { + _calculatedFileSize = 0; + } + if (mounted) setState(() {}); + } + + void _syncDownloadProgressListener() { + if (_downloadProgressNotifier == widget.downloadProgress) return; + _downloadProgressNotifier?.removeListener(_onDownloadProgressUpdated); + _downloadProgressNotifier = widget.downloadProgress; + _downloadProgressNotifier?.addListener(_onDownloadProgressUpdated); + + if (_downloadProgressNotifier?.value == null && + _isMediaLoading && + mounted) { + setState(() { + _isMediaLoading = false; + }); + } + } + + void _onDownloadProgressUpdated() { + if (_downloadProgressNotifier?.value == null && + _isMediaLoading && + mounted) { + setState(() { + _isMediaLoading = false; }); } } + @override + void dispose() { + _downloadProgressNotifier?.removeListener(_onDownloadProgressUpdated); + super.dispose(); + } + + Future _handleDownload() async { + if (widget.message.localFile != null) return; + if (_isMediaLoading) return; + if (!mounted) return; + + setState(() => _isMediaLoading = true); + + try { + await widget.onDownloadRequested?.call(widget.message); + if (widget.message.messageType == MessageType.image && + widget.message.localFile != null) { + ui.Image img = await getImageDimensions(widget.message.localFile!); + if (mounted) { + setState(() { + minHeight = img.height; + minWidth = img.width; + }); + } + } + } catch (e) { + debugPrint('Download error: $e'); + } finally { + if (mounted) { + setState(() => _isMediaLoading = false); + } + } + } + + Future _handleStopDownload() async { + if (!_isMediaLoading) return; + + if (mounted) { + setState(() => _isMediaLoading = false); + } + try { + await widget.onDownloadStoped?.call(widget.message); + } catch (e) { + debugPrint('Download stop error: $e'); + } + } + + void _checkAutoDownload() { + if (widget.message.localFile != null) return; + _resolveFileSize(); + widget.onDownloadRequestedWithoutLoad?.call(widget.message); + + final type = widget.message.messageType; + final isVoiceOrVideoNote = + type == MessageType.voiceNote || type == MessageType.videoNote; + + if (_calculatedFileSize == 0 && !isVoiceOrVideoNote) { + return; + } + + if (widget.message.localFile == null && widget.message.fileId != null) { + if (isVoiceOrVideoNote || _calculatedFileSize <= _autoDownloadLimit) { + _startDownload(); + } + } + } + + Future _startDownload() async { + if (widget.message.localFile != null) { + if (mounted) { + setState(() { + _isMediaLoading = false; + }); + } + return; + } + if (_isMediaLoading || widget.message.localFile != null) return; + setState(() => _isMediaLoading = true); + try { + await widget.onDownloadRequested?.call(widget.message); + } catch (e) { + debugPrint("Ошибка при скачивании медиа: $e"); + } finally { + if (mounted) { + setState(() { + _isMediaLoading = false; + }); + } + } + } + + void _openFile() async { + if (widget.message.localFile != null) { + debugPrint("Открываем файл: ${widget.message.localFile!.path}"); + final directory = await getApplicationDocumentsDirectory(); + + final decPath = '${directory.path}/${widget.message.fileName ?? 'file'}'; + widget.message.localFile! + .copy(decPath) + .then((copiedFile) { + OpenFilex.open(copiedFile.path) + .then((result) { + debugPrint("Результат открытия файла: ${result.type}"); + if (result.type != ResultType.done) { + debugPrint("Ошибка при открытии файла: ${result.message}"); + } + }) + .catchError((e) { + debugPrint("Ошибка при открытии файла: $e"); + }); + }) + .catchError((e) { + debugPrint("Ошибка при копировании файла для открытия: $e"); + }); + } + } + + bool get _isDisplayableFileReady { + return widget.message.localFile != null && + widget.message.localFile!.existsSync(); + } + @override Widget build(BuildContext context) { final isMe = widget.message.isMe; - final themeProv = context.watch(); + final primaryTextColor = Colors.white; + final secondaryTextColor = Colors.white70; + final linkColor = const Color(0xFF81D4FA); + final bool canShowMedia = _isDisplayableFileReady; + return Align( - // Выравниваем вправо, если это мое сообщение, и влево — если чужое alignment: isMe ? Alignment.centerRight : Alignment.centerLeft, child: Material( color: Colors.transparent, child: InkWell( onTap: widget.onTap, - // На телефонах иногда удобнее/надежнее long-press (как в мессенджерах), - // поэтому поддерживаем оба жеста. onLongPress: widget.onTap, borderRadius: BorderRadius.only( topLeft: const Radius.circular(16), @@ -73,146 +473,322 @@ class _MessageBubbleState extends State { margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 14), constraints: BoxConstraints( - // Чтобы баббл не растягивался на весь экран, если текста мало - maxWidth: MediaQuery.of(context).size.width * 0.75, + maxWidth: MediaQuery.of(context).size.width * 0.7, ), decoration: BoxDecoration( - color: isMe - ? Theme.of(context).colorScheme.primaryFixedDim - : Colors.grey[300], + color: widget.message.messageType != MessageType.videoNote + ? isMe + ? Theme.of(context).colorScheme.brightness == + Brightness.dark + ? Theme.of(context).colorScheme.primaryContainer + : Theme.of(context).colorScheme.primary + : Colors.grey[800] + : Colors.transparent, borderRadius: BorderRadius.only( topLeft: const Radius.circular(16), topRight: const Radius.circular(16), - // Скругляем углы по-разному для "хвостика" сообщения bottomLeft: Radius.circular(isMe ? 16 : 0), bottomRight: Radius.circular(isMe ? 0 : 16), ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - if (widget.message.replyToText != null) ...[ - GestureDetector( - onTap: widget.onReplyTap, - behavior: HitTestBehavior.opaque, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - margin: const EdgeInsets.only(bottom: 4), - decoration: BoxDecoration( - color: (isMe ? Colors.white : Colors.black).withOpacity(0.1), - borderRadius: BorderRadius.circular(8), - border: Border( - left: BorderSide( - color: isMe ? Colors.black54 : Colors.black38, - width: 2, + child: IntrinsicWidth( + child: Column( + crossAxisAlignment: isMe + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + if (widget.message.replyToText != null) ...[ + _buildReplyWidget(isMe, secondaryTextColor), + ], + Align( + alignment: isMe + ? Alignment.centerRight + : Alignment.centerLeft, + child: _buildMessageBody( + primaryTextColor, + secondaryTextColor, + ), + ), + if (widget.message.messageType == MessageType.text || + widget.message.text.isNotEmpty) ...[ + const SizedBox(height: 4), + Align( + alignment: Alignment.centerLeft, + child: Linkify( + onOpen: (link) async { + final Uri url = Uri.parse(link.url); + if (!await launchUrl( + url, + mode: LaunchMode.externalApplication, + )) { + throw Exception('Could not launch $url'); + } + }, + text: widget.message.text, + style: TextStyle(color: primaryTextColor), + linkStyle: TextStyle( + color: linkColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + const SizedBox(height: 4), + _buildTimeAndStatusRow(isMe, secondaryTextColor), + ], + ), + ), + ), + ), + ), + ); + } + + Widget _buildMessageBody(Color primaryColor, Color secondaryColor) { + switch (widget.message.messageType) { + case MessageType.image: + return _buildImagePreview(primaryColor, secondaryColor); + case MessageType.video: + return _buildVideoPreview(primaryColor, secondaryColor); + case MessageType.file: + return _buildFileBubble(primaryColor, secondaryColor); + case MessageType.videoNote: + return _buildVideoNotePreview(primaryColor, secondaryColor); + case MessageType.voiceNote: + return _buildVoiceNoteBubble(primaryColor, secondaryColor); + default: + return const SizedBox.shrink(); + } + } + + Widget _buildImagePreview(Color textCol, Color subTextCol) { + _resolveFileSize(); + final bool isDownloaded = widget.message.localFile != null; + final bool isSending = widget.message.status == MessageStatus.sending; + final bool isEncrypting = widget.message.status == MessageStatus.encrypting; + final isTooLarge = _calculatedFileSize > _autoDownloadLimit; + final displaySize = formatBytes(_calculatedFileSize, 1); + + final double screenMaxWidth = MediaQuery.of(context).size.width * 0.6; + final double screenMaxHeight = MediaQuery.of(context).size.height * 0.4; + + final double calculatedMinWidth = minWidth > 0 + ? math.min(minWidth.toDouble(), screenMaxWidth) + : MediaQuery.of(context).size.width * 0.4; + + final double calculatedMinHeight = minHeight > 0 + ? math.min(minHeight.toDouble(), screenMaxHeight) + : MediaQuery.of(context).size.height * 0.25; + + return GestureDetector( + onTap: (_isDownloading || isSending || isEncrypting || !isDownloaded) + ? () { + if (_isMediaLoading || isSending || isEncrypting) { + _handleStopDownload(); + } else { + if (isDownloaded) { + widget.onImageTap?.call(); + } else if (!isSending && !isEncrypting) { + _handleDownload(); + } + } + } + : widget.onImageTap, + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Container( + color: Colors.black.withOpacity(0.05), + constraints: BoxConstraints( + minWidth: calculatedMinWidth, + maxWidth: screenMaxWidth, + minHeight: calculatedMinHeight, + maxHeight: screenMaxHeight, + ), + child: Stack( + fit: StackFit.loose, + alignment: Alignment.centerRight, + children: [ + if (isDownloaded) + Image.file(widget.message.localFile!, fit: BoxFit.cover) + else + _buildMediaPlaceholder( + Icons.image, + "Фото", + isTooLarge, + textCol, + subTextCol, + ), + if (!isDownloaded && + !_isDownloading && + !isSending && + !isEncrypting && + _calculatedFileSize > 0) + Positioned( + bottom: 8, + left: 8, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 6, + vertical: 3, + ), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.55), + borderRadius: BorderRadius.circular(10), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.arrow_downward_rounded, + color: Colors.white, + size: 12, + ), + const SizedBox(width: 3), + Text( + displaySize, + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.w500, ), ), + ], + ), + ), + ), + if (_isMediaLoading || isSending || isEncrypting) + Positioned.fill( + child: _buildProgressOverlay( + (isSending || isEncrypting), + isEncrypting, + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildVideoPreview(Color textCol, Color subTextCol) { + final bool isDownloaded = widget.message.localFile != null; + final bool isSending = widget.message.status == MessageStatus.sending; + final bool isEncrypting = widget.message.status == MessageStatus.encrypting; + final isTooLarge = _calculatedFileSize > _autoDownloadLimit; + final displaySize = formatBytes(_calculatedFileSize, 1); + final cachedSize = _mediaCache.getDimensions(_messageKeyId); + final cachedThumbPath = _mediaCache.getThumbnailPath(_messageKeyId); + + double finalWidth = 240.0; + double finalHeight = 160.0; + + if (cachedSize != null && cachedSize.width > 0 && cachedSize.height > 0) { + final double aspectRatio = cachedSize.width / cachedSize.height; + finalWidth = 250.0; + finalHeight = finalWidth / aspectRatio; + final double maxAllowedHeight = MediaQuery.of(context).size.height * 0.4; + final double minAllowedHeight = MediaQuery.of(context).size.height * 0.15; + finalHeight = finalHeight.clamp(minAllowedHeight, maxAllowedHeight); + } + + return GestureDetector( + onTap: () { + if (_isMediaLoading || isSending || isEncrypting) { + _handleStopDownload(); + } else { + if (isDownloaded) { + widget.onImageTap?.call(); + } else if (!_isDisplayableFileReady && !isSending && !isEncrypting) { + _handleDownload(); + } + } + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 4), + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Container( + width: finalWidth, + height: finalHeight, + color: Colors.black.withOpacity(0.1), + child: Stack( + alignment: Alignment.center, + fit: StackFit.expand, + children: [ + if (isDownloaded && !isSending && !isEncrypting) ...[ + if (cachedThumbPath != null) + Image.file(File(cachedThumbPath), fit: BoxFit.cover) + else + const SizedBox( + child: Center( + child: CircularProgressIndicator(color: Colors.white), + ), + ), + Icon( + Icons.play_circle_fill, + color: Colors.white.withOpacity(0.9), + size: 50, + ), + ] else ...[ + if (!_isDisplayableFileReady && + (isSending || isEncrypting) && + widget.message.localFile != null && + cachedThumbPath != null) + Image.file(File(cachedThumbPath), fit: BoxFit.cover) + else + _buildMediaPlaceholder( + Icons.videocam, + "Video", + isTooLarge, + textCol, + subTextCol, + ), + ], + if (!isDownloaded && + !_isDownloading && + !isSending && + !isEncrypting && + _calculatedFileSize > 0) + Positioned( + bottom: 8, + left: 8, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 6, + vertical: 3, + ), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.55), + borderRadius: BorderRadius.circular(10), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon( - Icons.reply, - size: 14, - color: isMe ? Colors.black54 : Colors.black54, + const Icon( + Icons.arrow_downward_rounded, + color: Colors.white, + size: 12, ), - const SizedBox(width: 4), - Expanded( - child: Text( - widget.message.replyToText!, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: isMe ? const Color.fromARGB(221, 21, 21, 21) : const Color.fromARGB(221, 21, 21, 21), - fontSize: 12, - fontStyle: FontStyle.italic, - ), + const SizedBox(width: 3), + Text( + displaySize, + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.w500, ), ), ], ), ), ), - ], - if (widget.message.messageType == MessageType.image) ...[ - GestureDetector( - onTap: widget.onImageTap, - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: (_imageBytes ?? widget.message.localFileBytes) != null - ? Image.memory( - _imageBytes ?? widget.message.localFileBytes!, - width: 200, - height: 200, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Container( - width: 200, - height: 200, - color: Colors.grey[300], - child: const Icon(Icons.broken_image, size: 50), - ); - }, - ) - : Container( - width: 200, - height: 200, - color: Colors.grey[300], - child: const Center( - child: CircularProgressIndicator(), - ), - ), + if (_isDownloading || isSending || isEncrypting) + Positioned.fill( + child: _buildProgressOverlay( + (isSending || isEncrypting), + isEncrypting, ), ), - if (widget.message.text.isNotEmpty) ...[ - const SizedBox(height: 8), - ], - ], - if (widget.message.messageType == MessageType.text || widget.message.text.isNotEmpty) ...[ - Linkify( - onOpen: (link) async { - final Uri url = Uri.parse(link.url); - if (!await launchUrl(url, mode: LaunchMode.externalApplication)) { - throw Exception('Could not launch $url'); - } - }, - text: widget.message.text, - style: TextStyle(color: isMe ? (themeProv.isLight ? Colors.black : Colors.black) : Colors.black), - linkStyle: TextStyle(color: const Color.fromARGB(255, 10, 87, 123), fontWeight: FontWeight.bold), - ), - ], - const SizedBox(height: 4), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - _formatTime(widget.message.createdAt), - style: TextStyle( - color: isMe ? Colors.black87 : Colors.black54, - fontSize: 10, - ), - ), - if (widget.message.editedAt != null) ...[ - const SizedBox(width: 6), - Text( - '(изменено)', - style: TextStyle( - color: isMe ? Colors.black54 : Colors.black54, - fontSize: 10, - fontStyle: FontStyle.italic, - ), - ), - ], - if (isMe) ...[ - const SizedBox(width: 6), - Icon( - _statusIcon(widget.message.status), - size: 12, - color: _statusColor(widget.message.status, isMe), - ), - ], - ], - ), ], ), ), @@ -221,35 +797,1324 @@ class _MessageBubbleState extends State { ); } - IconData _statusIcon(MessageStatus status) { - switch (status) { - case MessageStatus.sending: - return Icons.access_time; - case MessageStatus.sent: - return Icons.done; - case MessageStatus.delivered: - return Icons.done_all; - case MessageStatus.read: - return Icons.done_all; - case MessageStatus.failed: - return Icons.error; - } + Widget _buildMediaPlaceholder( + IconData icon, + String typeLabel, + bool isTooLarge, + Color textCol, + Color subTextCol, + ) { + _resolveFileSize(); + final displaySize = formatBytes(_calculatedFileSize, 1); + final sizeString = _calculatedFileSize > 0 + ? " ($displaySize)" + : " (Загрузка размера...)"; + + if (_isMediaLoading) return const SizedBox.shrink(); + return Container( + color: Colors.black.withOpacity(0.05), + padding: const EdgeInsets.all(12), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + isTooLarge ? Icons.download_for_offline : icon, + size: 42, + color: subTextCol, + ), + const SizedBox(height: 6), + Text( + isTooLarge + ? "Файл слишком большой$sizeString" + : "$typeLabel$sizeString", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12, + color: textCol, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 4), + Text( + "Нажмите для загрузки", + style: TextStyle( + fontSize: 10, + color: isTooLarge ? Colors.black54 : subTextCol, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ); } - Color _statusColor(MessageStatus status, bool isMe) { - switch (status) { - case MessageStatus.read: - return isMe ? Colors.blue : Colors.blue; - case MessageStatus.failed: - return Colors.red; - default: - return isMe ? Colors.white70 : Colors.black54; - } + Widget _buildProgressOverlay(bool isSending, bool isEncrypting) { + return GestureDetector( + onTap: () async => await _handleStopDownload(), + child: Container( + color: Colors.black.withOpacity(0.5), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (isSending) ...[ + widget.downloadProgress != null + ? ValueListenableBuilder( + valueListenable: widget.downloadProgress!, + builder: (context, value, _) { + final double currentProgress = value ?? 0.0; + return TweenAnimationBuilder( + tween: Tween(begin: 0.0, end: currentProgress), + duration: const Duration(milliseconds: 150), + builder: (context, val, _) { + return _buildCircularIndicator( + val, + isEncrypting ? "Шифрование" : "Отправка", + false, + _calculatedFileSize, + ); + }, + ); + }, + ) + : TweenAnimationBuilder( + tween: Tween(begin: 0.0, end: 0.0), + duration: const Duration(milliseconds: 150), + builder: (context, val, _) { + return _buildCircularIndicator( + val, + isEncrypting ? "Шифрование" : "Отправка", + false, + _calculatedFileSize, + ); + }, + ), + ] else ...[ + widget.downloadProgress != null + ? (widget.message.localFile == null + ? ValueListenableBuilder( + valueListenable: widget.downloadProgress!, + builder: (context, value, _) { + final bool isIndeterminate = value == null; + return TweenAnimationBuilder( + tween: Tween(begin: 0.0, end: value ?? 0.0), + duration: const Duration(milliseconds: 150), + builder: (context, val, _) { + return _buildCircularIndicator( + val, + "Загрузка", + isIndeterminate, + _calculatedFileSize, + ); + }, + ); + }, + ) + : const SizedBox()) + : const CircularProgressIndicator(color: Colors.white), + ], + ], + ), + ), + ), + ); } - String _formatTime(DateTime time) { - final hour = time.hour.toString().padLeft(2, '0'); - final minute = time.minute.toString().padLeft(2, '0'); - return '$hour:$minute'; + Widget _buildCircularIndicator( + double val, + String label, + bool isIndeterminate, + int totalBytes, + ) { + final currentBytes = (totalBytes * val).toInt(); + final String progressText = totalBytes > 0 + ? "${formatBytes(currentBytes, 1)} / ${formatBytes(totalBytes, 1)}" + : "Передача..."; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Stack( + alignment: Alignment.center, + children: [ + SizedBox( + width: 60, + height: 60, + child: CircularProgressIndicator( + value: isIndeterminate ? null : val, + strokeWidth: 4, + color: Colors.white, + backgroundColor: Colors.white24, + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!isIndeterminate) + Text( + "${(val * 100).toInt()}%", + style: const TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + Text( + label, + style: TextStyle( + color: Colors.white60, + fontSize: isIndeterminate ? 10 : 8, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ], + ), + const SizedBox(height: 10), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration( + color: Colors.black38, + borderRadius: BorderRadius.circular(6), + ), + child: Text( + progressText, + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ); + } + + Widget _buildFileBubble(Color textCol, Color subTextCol) { + _resolveFileSize(); + final bool isDownloaded = widget.message.localFile != null; + final bool isSending = widget.message.status == MessageStatus.sending; + final bool isEncrypting = widget.message.status == MessageStatus.encrypting; + final status = isEncrypting + ? 'Шифрование' + : isSending + ? 'Отправка' + : _isMediaLoading + ? 'Загрузка' + : ''; + final displaySize = formatBytes(_calculatedFileSize, 1); + return GestureDetector( + onTap: () { + if (widget.message.localFile != null) { + _openFile(); + } else { + _handleDownload(); + } + }, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.04), + borderRadius: BorderRadius.circular(12), + ), + constraints: BoxConstraints( + minWidth: MediaQuery.of(context).size.width * 0.6, + maxWidth: MediaQuery.of(context).size.width * 0.6, + ), + child: Row( + children: [ + Stack( + alignment: Alignment.center, + children: [ + Icon(Icons.insert_drive_file, size: 38, color: subTextCol), + if (!_isMediaLoading && + !isDownloaded && + !isSending && + !isEncrypting) + const Icon( + Icons.download_rounded, + size: 16, + color: Colors.white70, + ), + ], + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.message.fileName ?? 'Файл', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13, + color: textCol, + ), + ), + Row( + children: [ + Flexible( + child: Text( + displaySize, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 11, color: subTextCol), + ), + ), + const SizedBox(width: 6), + Flexible( + child: Align( + alignment: Alignment.centerRight, + child: Text( + status, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 11, color: subTextCol), + ), + ), + ), + ], + ), + if (_isMediaLoading || isSending || isEncrypting) + ValueListenableBuilder( + valueListenable: + widget.downloadProgress ?? + ValueNotifier(0.0), + builder: (context, value, _) { + // Если value null, принудительно показываем indeterminate (бесконечную полоску) + // или 0, чтобы пользователь видел, что что-то происходит + final progress = value ?? 0.0; + + return Padding( + padding: const EdgeInsets.only(top: 6), + child: LinearProgressIndicator( + value: progress > 0 + ? progress + : null, // null = бесконечная анимация, если прогресс еще не пришел + minHeight: 3, + backgroundColor: Colors.white24, + color: Colors.white70, + ), + ); + }, + ), + ], + ), + ), + if (!isDownloaded && + !_isMediaLoading && + !isSending && + !isEncrypting) + IconButton( + icon: const Icon(Icons.download_rounded, color: Colors.white70), + onPressed: _handleDownload, + ), + if (!isDownloaded && _isMediaLoading && !isSending && !isEncrypting) + IconButton( + icon: const Icon(Icons.cancel, color: Colors.white70), + onPressed: _handleStopDownload, + ), + ], + ), + ), + ); + } + + Widget _buildReplyWidget(bool isMe, Color subTextCol) { + final isMedia = + widget.message.messageType == MessageType.image || + widget.message.messageType == MessageType.video || + widget.message.messageType == MessageType.videoNote; + return GestureDetector( + onTap: widget.onReplyTap, + behavior: HitTestBehavior.opaque, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + margin: const EdgeInsets.only(bottom: 6), + decoration: BoxDecoration( + color: (isMedia + ? Colors.white24.withOpacity(0.5) + : isMe + ? Colors.white.withOpacity(0.1) + : Colors.black.withOpacity(0.1)), + borderRadius: BorderRadius.circular(8), + border: Border(left: BorderSide(color: subTextCol, width: 2)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.reply, size: 14, color: subTextCol), + const SizedBox(width: 4), + Expanded( + child: Text( + widget.message.replyToText!, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: subTextCol, + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ), + ], + ), + ), + ); + } + + Widget _buildVideoNotePreview( + Color primaryTextColor, + Color secondaryTextColor, + ) { + final file = widget.message.localFile; + final path = file?.path ?? ""; + final id = widget.message.id ?? widget.message.tempId ?? "no_id"; + final bool isDownloaded = file != null; + final bool isSending = widget.message.status == MessageStatus.sending; + final bool isEncrypting = widget.message.status == MessageStatus.encrypting; + + debugPrint( + '==> BUBBLE_VIDEO_RENDER: msgId=$id, status=${widget.message.status}, hasFile=${file != null}, path=$path', + ); + + return ValueListenableBuilder( + valueListenable: InlineVideoNotePlayer.activeVideoPathNotifier, + builder: (context, activePath, _) { + final bool isActive = activePath == path; + final double size = isActive ? 260 : 160; + + return GestureDetector( + onTap: (_isDownloading || isSending || isEncrypting || !isDownloaded) + ? () { + if (_isDownloading || isSending || isEncrypting) { + _handleStopDownload(); + } else { + if (!isDownloaded) { + _handleDownload(); + } + } + } + : widget.onTap, + child: Stack( + alignment: Alignment.center, + children: [ + // Плавное изменение размеров кружка при проигрывании + AnimatedContainer( + duration: const Duration(milliseconds: 250), + curve: Curves.fastOutSlowIn, + width: size, + height: size, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.black12, + ), + child: ClipOval( + child: isDownloaded + ? InlineVideoNotePlayer(videoPath: path) + : Container( + color: Colors.black54, + child: Icon( + Icons.play_arrow_rounded, + size: 48, + color: primaryTextColor, + ), + ), + ), + ), + + // Защита: Кнопка скачать поверх кружка выводится ТОЛЬКО если файла нет физически на диске + if (!isDownloaded && + !_isDownloading && + !isSending && + !isEncrypting) + ClipOval( + child: Container( + width: size, + height: size, + color: Colors.black.withOpacity(0.4), + child: const Icon( + Icons.arrow_downward_rounded, + color: Colors.white, + size: 36, + ), + ), + ), + + if (_isDownloading || isSending || isEncrypting) + SizedBox( + width: size, + height: size, + child: _buildProgressOverlay( + (isSending || isEncrypting), + isEncrypting, + ), + ), + ], + ), + ); + }, + ); + } + + Widget _buildVoiceNoteBubble(Color textCol, Color subTextCol) { + final String path = widget.message.localFile?.path ?? ''; + final bool isDownloaded = path.isNotEmpty && File(path).existsSync(); + + // Определяем статусы отправки на основе твоей модели данных MessageStatus + final bool isSendingNow = widget.message.status == MessageStatus.sending; + + // Если файл еще НЕ скачан локально, показываем заглушку загрузки + if (!isDownloaded) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + constraints: BoxConstraints( + minWidth: MediaQuery.of(context).size.width * 0.6, + maxWidth: MediaQuery.of(context).size.width * 0.6, + ), + child: Row( + children: [ + // Индикатор процесса или стрелочка скачивания + SizedBox( + width: 28, + height: 28, + child: _isMediaLoading + ? CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(textCol), + strokeWidth: 2.5, + ) + : Icon(Icons.download_rounded, color: textCol, size: 28), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Голосовое сообщение", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14, + color: textCol, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 2), + Text( + _isMediaLoading ? "Загрузка..." : "Нажмите для скачивания", + style: TextStyle(fontSize: 11, color: subTextCol), + ), + ], + ), + ), + ], + ), + ); + } + + // Если файл СКАЧАН, отдаем управление полноценному интерактивному плееру! + return Container( + padding: const EdgeInsets.all(4), + constraints: BoxConstraints( + minWidth: MediaQuery.of(context).size.width * 0.65, + maxWidth: MediaQuery.of(context).size.width * 0.65, + ), + child: Opacity( + opacity: isSendingNow ? 0.5 : 1.0, + child: AbsorbPointer( + // Блокируем клики только во время непосредственной отправки сообщения + absorbing: isSendingNow, + child: InlineVoiceNotePlayer( + key: ValueKey( + 'voice_note_${widget.message.fileId ?? widget.message.tempId}', + ), + audioPath: path, + ), + ), + ), + ); + } + + Widget _buildTimeAndStatusRow(bool isMe, Color secondaryTextColor) { + final timeStr = + "${widget.message.createdAt.hour.toString().padLeft(2, '0')}:${widget.message.createdAt.minute.toString().padLeft(2, '0')}"; + return Row( + mainAxisAlignment: isMe ? MainAxisAlignment.end : MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + timeStr, + style: TextStyle(color: secondaryTextColor, fontSize: 10), + ), + if (widget.message.editedAt != null) + Text( + " (изменено)", + style: TextStyle(color: secondaryTextColor, fontSize: 10, fontStyle: FontStyle.italic), + ), + if (isMe) ...[ + const SizedBox(width: 4), + Icon( + widget.message.status == MessageStatus.read + ? Icons.done_all + : Icons.done, + color: secondaryTextColor, + size: 14, + ), + ], + ], + ); + } + + String formatBytes(int bytes, int decimals) { + if (bytes <= 0) return "0 B"; + const suffixes = ["B", "KB", "MB", "GB", "TB"]; + var i = (log(bytes) / log(1024)).floor(); + return ((bytes / pow(1024, i)).toStringAsFixed(decimals)) + + " " + + suffixes[i]; + } +} + +class MediaCacheManager { + static final MediaCacheManager _instance = MediaCacheManager._internal(); + factory MediaCacheManager() => _instance; + MediaCacheManager._internal(); + + final Map _dimensionsCache = {}; + final Map _thumbnailPathCache = {}; + + void saveDimensions(String id, int width, int height) { + _dimensionsCache[id] = ui.Size(width.toDouble(), height.toDouble()); + } + + ui.Size? getDimensions(String id) => _dimensionsCache[id]; + + void saveThumbnailPath(String id, String path) { + _thumbnailPathCache[id] = path; + } + + String? getThumbnailPath(String id) => _thumbnailPathCache[id]; +} + +// ========================================== +// ВСТРОЕННЫЙ ПЛЕЕР ДЛЯ ВИДЕО-КРУЖКОВ +// ========================================== +class InlineVideoNotePlayer extends StatefulWidget { + final String videoPath; + const InlineVideoNotePlayer({super.key, required this.videoPath}); + + static final ValueNotifier activeVideoPathNotifier = + ValueNotifier(null); + + @override + State createState() => _InlineVideoNotePlayerState(); +} + +class _InlineVideoNotePlayerState extends State { + VideoPlayerController? _controller; + bool _isExpanded = false; + Future? _delayFuture; + String? _initError; + bool _isInitializing = false; + bool _wasPlaying = false; + + @override + void initState() { + super.initState(); + debugPrint(' --> PLAYER_STATE: initState() для пути: ${widget.videoPath}'); + WidgetsBinding.instance.addPostFrameCallback((_) { + _initVideoWithDelay(); + }); + InlineVideoNotePlayer.activeVideoPathNotifier.addListener( + _onActiveVideoChanged, + ); + } + + void _initVideoWithDelay() async { + if (widget.videoPath.isEmpty) return; + await Future.delayed(const Duration(milliseconds: 200)); + + // Извлекаем msgId из пути или передаем из MessageBubble. + // Если у тебя в InlineVideoNotePlayer есть доступ к msgId, лучше использовать его. + // Для примера вытащим цифры из хэша файла или сделаем случайный сдвиг: + final int stableSalt = + widget.videoPath.hashCode % 6; // Получим число от 0 до 5 + + // Каждое видео получит свой уникальный сдвиг: 0мс, 150мс, 300мс, 450мс и т.д. + final int delayMs = 150 * stableSalt; + + debugPrint( + '--> PLAYER_STATE: Планируем запуск плеера с задержкой $delayMs мс для ${widget.videoPath.split('/').last}', + ); + + _delayFuture = Future.delayed(Duration(milliseconds: delayMs)).then(( + _, + ) async { + // КРИТИЧЕСКИ ВАЖНО: проверяем, жив ли еще виджет на экране после паузы + if (!mounted) return; + _initVideo(); + }); + } + + @override + void dispose() { + debugPrint( + ' --> PLAYER_STATE: dispose() вызыван для пути: ${widget.videoPath}', + ); + + InlineVideoNotePlayer.activeVideoPathNotifier.removeListener( + _onActiveVideoChanged, + ); + _controller?.removeListener(_videoListener); + _controller?.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(covariant InlineVideoNotePlayer oldWidget) { + super.didUpdateWidget(oldWidget); + + debugPrint( + ' --> PLAYER_STATE: didUpdateWidget. Старый путь="${oldWidget.videoPath}", Новый путь="${widget.videoPath}"', + ); + + // 1. Если новый путь пустой, НЕ уничтожаем старый рабочий контроллер! + // Скорее всего, это временный лаг обновления состояния в ListView. + if (widget.videoPath.isEmpty && oldWidget.videoPath.isNotEmpty) { + debugPrint( + ' --> PLAYER_STATE: Новый путь пустой. Игнорируем сброс плеера.', + ); + return; + } + + // 2. Если пути формально отличаются, но плеер уже инициализирован и успешно играет, + // а разница лишь в динамическом префиксе дешифрованного файла (одно и то же видео) + if (oldWidget.videoPath != widget.videoPath) { + // Защита: Если старый файл существовал и новый существует, и они имеют одинаковый размер + // (или мы просто доверяем текущему плееру), не нужно дергать нативный контроллер. + if (_controller != null && _controller!.value.isInitialized) { + final oldFile = File(oldWidget.videoPath); + final newFile = File(widget.videoPath); + + if (oldFile.existsSync() && + newFile.existsSync() && + oldFile.lengthSync() == newFile.lengthSync()) { + debugPrint( + ' --> PLAYER_STATE: Пути разные, но файлы идентичны по размеру. Не пересоздаем.', + ); + return; + } + } + + debugPrint( + ' --> PLAYER_STATE: Путь изменился на валидный! Пересоздаем контроллер.', + ); + if (_controller != null) { + _controller!.removeListener(_videoListener); + final oldController = _controller!; + _controller = null; + oldController.dispose().catchError( + (e) => debugPrint('Error disposing vc: $e'), + ); + } + _initVideo(); + } + } + + void _initVideo() { + if (widget.videoPath.isEmpty) { + debugPrint(' --> PLAYER_INIT: Отмена инициализации. Путь пустой.'); + return; + } + + final file = File(widget.videoPath); + if (!file.existsSync()) { + debugPrint( + ' --> PLAYER_INIT: Отмена инициализации. Файла физически НЕТ на диске по пути: ${widget.videoPath}', + ); + return; + } + + debugPrint( + ' --> PLAYER_INIT: Начинаем VideoPlayerController.file(). Исходный файл существует.', + ); + + if (_isInitializing) return; + _isInitializing = true; + _initError = null; + + _controller = VideoPlayerController.file(file) + ..initialize() + .then((_) { + debugPrint( + ' --> PLAYER_INIT: СУПЕР! Контроллер успешно инициализирован для ${widget.videoPath}', + ); + _isInitializing = false; + _initError = null; + if (mounted) setState(() {}); + }) + .catchError((e) { + _isInitializing = false; + _initError = e.toString(); + final oldController = _controller; + _controller = null; + oldController?.removeListener(_videoListener); + oldController?.dispose().catchError((_) {}); + if (mounted) setState(() {}); + debugPrint( + ' --> PLAYER_INIT_ERROR: Фатальный сбой VideoPlayer: $e', + ); + }); + + _controller?.addListener(_videoListener); + } + + void _videoListener() { + if (!mounted || _controller == null) return; + + final isPlaying = _controller!.value.isPlaying; + final isInitialized = _controller!.value.isInitialized; + + if (isInitialized && _wasPlaying && !isPlaying) { + _isExpanded = false; + + if (InlineVideoNotePlayer.activeVideoPathNotifier.value == + widget.videoPath) { + InlineVideoNotePlayer.activeVideoPathNotifier.value = null; + } + } + + _wasPlaying = isPlaying; + + setState(() {}); + } + + void _onActiveVideoChanged() { + if (!mounted || _controller == null) return; + final activePath = InlineVideoNotePlayer.activeVideoPathNotifier.value; + + if (activePath != widget.videoPath) { + setState(() { + if (_controller!.value.isPlaying) { + _controller!.pause(); + } + _isExpanded = false; + }); + } + } + + void _togglePlay() { + if (_controller == null || !_controller!.value.isInitialized) return; + + setState(() { + if (_controller!.value.isPlaying) { + _controller!.pause(); + _isExpanded = false; + if (InlineVideoNotePlayer.activeVideoPathNotifier.value == + widget.videoPath) { + InlineVideoNotePlayer.activeVideoPathNotifier.value = null; + } + } else { + InlineVideoNotePlayer.activeVideoPathNotifier.value = widget.videoPath; + _controller!.play(); + _controller!.setLooping(true); + _isExpanded = true; + } + }); + } + + @override + Widget build(BuildContext context) { + final double size = _isExpanded ? 260.0 : 160.0; + final bool isInitialized = + _controller != null && _controller!.value.isInitialized; + final bool hasInitError = _initError != null; + + double progress = 0.0; + if (isInitialized) { + final duration = _controller!.value.duration.inMilliseconds; + final position = _controller!.value.position.inMilliseconds; + progress = duration > 0 ? (position / duration) : 0.0; + } + + return AnimatedContainer( + duration: const Duration(milliseconds: 180), + curve: Curves.easeOut, + width: size, + height: size, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors + .black12, // Даем легкую подложку вместо прозрачности, чтобы круг было видно + ), + child: ClipOval( + child: Stack( + alignment: Alignment.center, + children: [ + if (hasInitError) + _InlineVideoInitErrorFallback(videoPath: widget.videoPath) + else if (isInitialized) + GestureDetector( + onTap: _togglePlay, + child: SizedBox( + width: size, + height: size, + child: FittedBox( + fit: BoxFit.cover, + child: SizedBox( + width: _controller!.value.size.width, + height: _controller!.value.size.height, + child: VideoPlayer(_controller!), + ), + ), + ), + ) + else + // Красивый лоадер, пока файл скачивается или обрабатывается + const Center( + child: SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation(Colors.white70), + ), + ), + ), + + if (isInitialized && !hasInitError) + Positioned.fill( + child: IgnorePointer( + child: CustomPaint( + painter: CircleProgressPainter( + progress: progress, + progressColor: Colors.white, + backgroundColor: Colors.white30, + strokeWidth: 4.0, + ), + ), + ), + ), + + if (isInitialized && !_controller!.value.isPlaying && !hasInitError) + IgnorePointer( + child: Container( + color: Colors.black26, + alignment: Alignment.center, + child: const Icon( + Icons.play_arrow, + size: 40, + color: Colors.white, + ), + ), + ), + ], + ), + ), + ); + } +} + +class _InlineVideoInitErrorFallback extends StatelessWidget { + final String videoPath; + + const _InlineVideoInitErrorFallback({required this.videoPath}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.black12, + child: InkWell( + onTap: () async { + try { + await OpenFilex.open(videoPath); + } catch (e) { + debugPrint(' --> PLAYER_FALLBACK_ERROR: $e'); + } + }, + child: const Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.play_disabled, color: Colors.white70, size: 40), + SizedBox(height: 8), + Text( + 'Видео не воспроизводится\n Нажмите, чтобы открыть внешним плеером', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white70, fontSize: 12), + ), + ], + ), + ), + ), + ); + } +} + +class CircleProgressPainter extends CustomPainter { + final double progress; + final Color progressColor; + final Color backgroundColor; + final double strokeWidth; + + CircleProgressPainter({ + required this.progress, + required this.progressColor, + required this.backgroundColor, + required this.strokeWidth, + }); + + @override + void paint(Canvas canvas, Size size) { + final Offset center = Offset(size.width / 2, size.height / 2); + final double radius = (size.width - strokeWidth) / 2; + + final Paint backgroundPaint = Paint() + ..color = backgroundColor + ..style = PaintingStyle.stroke + ..strokeWidth = strokeWidth; + + canvas.drawCircle(center, radius, backgroundPaint); + + final Paint progressPaint = Paint() + ..color = progressColor + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeWidth = strokeWidth; + + double startAngle = -math.pi / 2; + double sweepAngle = 2 * math.pi * progress; + + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius), + startAngle, + sweepAngle, + false, + progressPaint, + ); + } + + @override + bool shouldRepaint(covariant CircleProgressPainter oldDelegate) { + return oldDelegate.progress != progress || + oldDelegate.progressColor != progressColor || + oldDelegate.backgroundColor != backgroundColor; + } +} + +// ========================================== +// ВСТРОЕННЫЙ ПЛЕЕР ДЛЯ ГОЛОСОВЫХ СООБЩЕНИЙ +// ========================================== +class InlineVoiceNotePlayer extends StatefulWidget { + final String audioPath; + const InlineVoiceNotePlayer({super.key, required this.audioPath}); + + @override + State createState() => _InlineVoiceNotePlayerState(); +} + +class _InlineVoiceNotePlayerState extends State { + final AudioPlayer _audioPlayer = AudioPlayer(); + bool _isPlaying = false; + bool _isInitializing = false; + Duration _duration = Duration.zero; + Duration _position = Duration.zero; + bool _sourceInitialized = false; + Timer? _fileWatchTimer; + + bool get _hasValidDuration => _duration.inMilliseconds > 0; + + @override + void initState() { + super.initState(); + _initAudioListeners(); + _checkAndSetupSource(); + _startFileAvailabilityPolling(); + } + + // Вынесем проверку в отдельный метод + void _checkAndSetupSource() { + if (widget.audioPath.isEmpty || _sourceInitialized || _isInitializing) + return; + + final file = File(widget.audioPath); + if (!file.existsSync()) { + debugPrint('[AUDIO] Файл пока отсутствует на диске, ждем обновления...'); + return; + } + + _isInitializing = true; + if (mounted) { + setState(() {}); + } + + _setupSource(widget.audioPath).whenComplete(() { + if (!mounted) { + _isInitializing = false; + return; + } + setState(() { + _isInitializing = false; + }); + }); + } + + void _startFileAvailabilityPolling() { + _fileWatchTimer?.cancel(); + if (widget.audioPath.isEmpty) return; + + final file = File(widget.audioPath); + if (file.existsSync()) { + if (!_sourceInitialized && !_isInitializing) { + _checkAndSetupSource(); + } + return; + } + + _fileWatchTimer = Timer.periodic(const Duration(milliseconds: 250), ( + timer, + ) { + if (!mounted) { + timer.cancel(); + return; + } + if (widget.audioPath.isEmpty) { + timer.cancel(); + return; + } + final file = File(widget.audioPath); + if (file.existsSync()) { + timer.cancel(); + if (mounted) { + setState(() {}); + _checkAndSetupSource(); + } + } + }); + } + + Future _setupSource(String path) async { + try { + await _audioPlayer.stop(); + await _audioPlayer.setSource(DeviceFileSource(path)); + + if (!mounted) return; + setState(() { + _sourceInitialized = true; + }); + + final d = await _audioPlayer.getDuration(); + if (!mounted) return; + if (d != null && d.inMilliseconds > 0) { + setState(() { + _duration = d; + }); + } + + debugPrint('[AUDIO] Источник успешно установлен для: $path'); + } catch (e) { + debugPrint('[AUDIO ERROR] Ошибка установки источника: $e'); + } + } + + @override + void didUpdateWidget(covariant InlineVoiceNotePlayer oldWidget) { + super.didUpdateWidget(oldWidget); + + final bool pathChanged = oldWidget.audioPath != widget.audioPath; + final bool fileJustAppeared = + widget.audioPath.isNotEmpty && + !_sourceInitialized && + File(widget.audioPath).existsSync(); + + if (pathChanged) { + _sourceInitialized = false; + _position = Duration.zero; + _duration = Duration.zero; + _fileWatchTimer?.cancel(); + } + + if (pathChanged || fileJustAppeared) { + debugPrint('[AUDIO_UPDATE] Реактивное обновление источника звука.'); + _checkAndSetupSource(); + _startFileAvailabilityPolling(); + if (_isFileAvailable && !_sourceInitialized && mounted) { + setState(() {}); + } + } + } + + void _initAudioListeners() { + _audioPlayer.onPlayerStateChanged.listen((state) { + if (mounted) { + setState(() { + _isPlaying = state == PlayerState.playing; + if (state == PlayerState.stopped || state == PlayerState.completed) { + _position = Duration.zero; + } + }); + } + }); + + _audioPlayer.onDurationChanged.listen((newDuration) { + // ЗАЩИТА ОТ ДЕРГАНИЯ: игнорируем пустые или некорректные ивенты от движка + if (mounted && newDuration.inMilliseconds > 0) { + setState(() { + _duration = newDuration; + }); + } + }); + + _audioPlayer.onPositionChanged.listen((newPosition) { + if (!mounted) return; + + // СЛЕПАЯ ЗОНА (150мс): сглаживаем рывок ползунка в самом начале воспроизведения + if (_isPlaying && newPosition.inMilliseconds < 150) return; + + setState(() { + if (_duration.inMilliseconds > 0 && newPosition > _duration) { + _position = _duration; + } else { + _position = newPosition; + } + }); + }); + } + + void _togglePlay() async { + // Блокируем клик, если файл физически еще не скачан + if (widget.audioPath.isEmpty || !File(widget.audioPath).existsSync()) + return; + + if (!_sourceInitialized) { + _checkAndSetupSource(); + } + + if (_isPlaying) { + await _audioPlayer.pause(); + } else { + await _audioPlayer.play(DeviceFileSource(widget.audioPath)); + } + } + + bool get _isFileAvailable => + widget.audioPath.isNotEmpty && File(widget.audioPath).existsSync(); + + @override + void dispose() { + _fileWatchTimer?.cancel(); + _audioPlayer.dispose(); + super.dispose(); + } + + String _formatDuration(Duration duration) { + final String minutes = duration.inMinutes.toString(); + final String seconds = (duration.inSeconds % 60).toString().padLeft(2, '0'); + return "$minutes:$seconds"; + } + + @override + Widget build(BuildContext context) { + final bool fileAvailable = _isFileAvailable; + final bool hasDuration = _hasValidDuration; + + final bool isReady = fileAvailable && _sourceInitialized && hasDuration; + final String statusText; + if (!fileAvailable) { + statusText = 'Загрузка...'; + } else if (!_sourceInitialized || !hasDuration) { + statusText = 'Подготовка...'; + } else { + statusText = + "${_formatDuration(_position)} / ${_formatDuration(_duration)}"; + } + + final double durationMs = _duration.inMilliseconds.toDouble(); + final double positionMs = _position.inMilliseconds.toDouble(); + final bool canSeek = hasDuration; + final double safeMax = durationMs > 0 ? durationMs : 1.0; + final double safeValue = durationMs > 0 + ? positionMs.clamp(0.0, safeMax) + : 0.0; + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + width: 240, + decoration: BoxDecoration( + color: Colors.black12, + borderRadius: BorderRadius.circular(10), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: Icon( + _isPlaying ? Icons.pause_circle_filled : Icons.play_circle_filled, + ), + iconSize: 36, + color: fileAvailable ? Colors.white : Colors.white38, + onPressed: fileAvailable ? _togglePlay : null, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 3, + padding: EdgeInsets.zero, + thumbShape: const RoundSliderThumbShape( + enabledThumbRadius: 5, + elevation: 0, + ), + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 8, + ), + ), + child: Container( + height: 20, + alignment: Alignment.center, + child: Slider( + activeColor: isReady ? Colors.white : Colors.white38, + inactiveColor: Colors.white60, + thumbColor: isReady ? Colors.white : Colors.white24, + min: 0.0, + max: safeMax, + value: safeValue, + onChanged: canSeek + ? (value) async { + await _audioPlayer.seek( + Duration(milliseconds: value.toInt()), + ); + } + : null, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 2, + ), + child: Text( + statusText, + style: const TextStyle( + fontSize: 11, + color: Colors.white70, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ), + ], + ), + ); } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 3ccd551..6f62215 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,17 +6,25 @@ #include "generated_plugin_registrant.h" +#include #include #include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index fbedf4a..c0e31b7 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,8 +3,10 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux file_selector_linux flutter_secure_storage_linux + record_linux url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 66c0d33..76220df 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,9 @@ import FlutterMacOS import Foundation +import audioplayers_darwin +import ffmpeg_kit_flutter_new_min_gpl +import file_picker import file_selector_macos import firebase_analytics import firebase_core @@ -16,11 +19,18 @@ import gal import local_auth_darwin import package_info_plus import path_provider_foundation +import photo_manager +import record_macos import shared_preferences_foundation import sqflite_darwin import url_launcher_macos +import video_compress +import video_player_avfoundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + FFmpegKitFlutterPlugin.register(with: registry.registrar(forPlugin: "FFmpegKitFlutterPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) @@ -32,7 +42,11 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + PhotoManagerPlugin.register(with: registry.registrar(forPlugin: "PhotoManagerPlugin")) + RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 4cad2c8..9ed6682 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.35" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" args: dependency: transitive description: @@ -25,6 +33,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.1" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: a72dd459d1a48f61a6fb9c0134dba26597c9236af40639ff0eb70eb4e0baab70 + url: "https://pub.dev" + source: hosted + version: "6.6.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" + url: "https://pub.dev" + source: hosted + version: "5.2.1" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: c994b3bb3a921e4904ac40e013fbc94488e824fd7c1de6326f549943b0b44a91 + url: "https://pub.dev" + source: hosted + version: "6.4.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 + url: "https://pub.dev" + source: hosted + version: "4.2.1" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" + url: "https://pub.dev" + source: hosted + version: "7.1.1" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: faa8fa6587f996a6f604433b53af44c57a1407d4fe8dff5766cf63d6875e8de9 + url: "https://pub.dev" + source: hosted + version: "5.2.0" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: bafff2b38b6f6d331887558ba6e0a01c9c208d9dbb3ad0005234db065122a734 + url: "https://pub.dev" + source: hosted + version: "4.3.0" boolean_selector: dependency: transitive description: @@ -57,14 +121,70 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + camera: + dependency: "direct main" + description: + name: camera + sha256: "4142a19a38e388d3bab444227636610ba88982e36dff4552d5191a86f65dc437" + url: "https://pub.dev" + source: hosted + version: "0.11.4" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: "8516fe308bc341a5067fb1a48edff0ddfa57c0d3cdcc9dbe7ceca3ba119e2577" + url: "https://pub.dev" + source: hosted + version: "0.6.30" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "11b4aee2f5e5e038982e152b4a342c749b414aa27857899d20f4323e94cb5f0b" + url: "https://pub.dev" + source: hosted + version: "0.9.23+2" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: "7ac852d77699acee79f0d438b793feee26721841e50973576419ff5c6d95e9b7" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "57f49a635c8bf249d07fb95eb693d7e4dda6796dedb3777f9127fb54847beba7" + url: "https://pub.dev" + source: hosted + version: "0.3.5+3" characters: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" clock: dependency: transitive description: @@ -113,6 +233,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.9.0" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -145,6 +273,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + extended_image: + dependency: transitive + description: + name: extended_image + sha256: f6cbb1d798f51262ed1a3d93b4f1f2aa0d76128df39af18ecb77fa740f88b2e0 + url: "https://pub.dev" + source: hosted + version: "10.0.1" + extended_image_library: + dependency: transitive + description: + name: extended_image_library + sha256: "1f9a24d3a00c2633891c6a7b5cab2807999eb2d5b597e5133b63f49d113811fe" + url: "https://pub.dev" + source: hosted + version: "5.0.1" fake_async: dependency: transitive description: @@ -161,6 +305,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + ffmpeg_kit_flutter_new_min_gpl: + dependency: "direct main" + description: + name: ffmpeg_kit_flutter_new_min_gpl + sha256: "7009b1a8a75188b4f8c13ba4bbc399c8e57b13bab9ee172f4a5583774d850efd" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + ffmpeg_kit_flutter_platform_interface: + dependency: transitive + description: + name: ffmpeg_kit_flutter_platform_interface + sha256: addf046ae44e190ad0101b2fde2ad909a3cd08a2a109f6106d2f7048b7abedee + url: "https://pub.dev" + source: hosted + version: "0.2.1" file: dependency: transitive description: @@ -169,6 +329,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: f13a03000d942e476bc1ff0a736d2e9de711d2f89a95cd4c1d88f861c3348387 + url: "https://pub.dev" + source: hosted + version: "11.0.2" file_selector_linux: dependency: transitive description: @@ -294,6 +462,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.1" + flutter_http_cache: + dependency: "direct main" + description: + name: flutter_http_cache + sha256: "2227f5694d730622d6dad580b0e4fdfec6b5884868148101d13c61a09661fa78" + url: "https://pub.dev" + source: hosted + version: "0.0.3" flutter_image_compress: dependency: "direct main" description: @@ -342,6 +518,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.5" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" flutter_linkify: dependency: "direct main" description: @@ -456,6 +640,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" http: dependency: "direct main" description: @@ -464,6 +656,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.6.0" + http_client_helper: + dependency: transitive + description: + name: http_client_helper + sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" + url: "https://pub.dev" + source: hosted + version: "3.0.0" http_parser: dependency: transitive description: @@ -472,14 +672,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" image_picker: dependency: "direct main" description: name: image_picker - sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320" + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" image_picker_android: dependency: transitive description: @@ -568,6 +776,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" jwt_decoder: dependency: "direct main" description: @@ -660,26 +876,26 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.18.0" mime: dependency: transitive description: @@ -792,6 +1008,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 + url: "https://pub.dev" + source: hosted + version: "12.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: @@ -800,6 +1064,22 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.2" + photo_manager: + dependency: "direct main" + description: + name: photo_manager + sha256: fb3bc8ea653370f88742b3baa304700107c83d12748aa58b2b9f2ed3ef15e6c2 + url: "https://pub.dev" + source: hosted + version: "3.9.0" + photo_manager_image_provider: + dependency: transitive + description: + name: photo_manager_image_provider + sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f + url: "https://pub.dev" + source: hosted + version: "2.2.0" platform: dependency: transitive description: @@ -816,6 +1096,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: "direct main" + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" provider: dependency: "direct main" description: @@ -824,6 +1120,70 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.5+1" + record: + dependency: "direct main" + description: + name: record + sha256: d5b6b334f3ab02460db6544e08583c942dbf23e3504bf1e14fd4cbe3d9409277 + url: "https://pub.dev" + source: hosted + version: "6.2.0" + record_android: + dependency: transitive + description: + name: record_android + sha256: "94783f08403aed33ffb68797bf0715b0812eb852f3c7985644c945faea462ba1" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: "8df7c136131bd05efc19256af29b2ba6ccc000ccc2c80d4b6b6d7a8d21a3b5a9" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: c31a35cc158cd666fc6395f7f56fc054f31685571684be6b97670a27649ce5c7 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: "084902e63fc9c0c224c29203d6c75f0bdf9b6a40536c9d916393c8f4c4256488" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8a81dbc4e14e1272a285bbfef6c9136d070a47d9b0d1f40aa6193516253ee2f6" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" + url: "https://pub.dev" + source: hosted + version: "1.0.7" rxdart: dependency: transitive description: @@ -957,6 +1317,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -985,10 +1353,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.11" timezone: dependency: transitive description: @@ -1085,6 +1453,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + video_compress: + dependency: "direct main" + description: + name: video_compress + sha256: "31bc5cdb9a02ba666456e5e1907393c28e6e0e972980d7d8d619a7beda0d4f20" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: af0e5b8a7a4876fb37e7cc8cb2a011e82bb3ecfa45844ef672e32cb14a1f259e + url: "https://pub.dev" + source: hosted + version: "2.9.4" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0" + url: "https://pub.dev" + source: hosted + version: "6.7.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + video_thumbnail: + dependency: "direct main" + description: + name: video_thumbnail + sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b" + url: "https://pub.dev" + source: hosted + version: "0.5.6" + visibility_detector: + dependency: "direct main" + description: + name: visibility_detector + sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 + url: "https://pub.dev" + source: hosted + version: "0.4.0+2" vm_service: dependency: transitive description: @@ -1117,6 +1549,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + wechat_assets_picker: + dependency: "direct main" + description: + name: wechat_assets_picker + sha256: c307e50394c1e6dfcd5c4701e84efb549fce71444fedcf2e671c50d809b3e2a1 + url: "https://pub.dev" + source: hosted + version: "9.8.0" + wechat_picker_library: + dependency: transitive + description: + name: wechat_picker_library + sha256: "5cb61b9aa935b60da5b043f8446fbb9c5077419f20ccc4856bf444aec4f44bc1" + url: "https://pub.dev" + source: hosted + version: "1.0.7" win32: dependency: transitive description: @@ -1141,6 +1589,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.10.0 <4.0.0" flutter: ">=3.38.0" diff --git a/pubspec.yaml b/pubspec.yaml index aa50479..10a94ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.0.1+1 +version: 2.0.2+1 environment: sdk: ^3.10.0 @@ -50,16 +50,30 @@ dependencies: shared_preferences: ^2.5.5 flutter_linkify: ^6.0.0 url_launcher: ^6.3.2 - image_picker: ^1.0.4 gal: ^2.3.2 flutter_image_compress: ^2.1.0 dio: ^5.9.2 package_info_plus: ^9.0.1 - open_filex: ^4.3.2 + open_filex: ^4.7.0 convert: ^3.1.2 cached_network_image: ^3.3.1 flutter_cache_manager: ^3.0.2 path_provider: ^2.1.3 + file_picker: ^11.0.2 + video_compress: ^3.1.0 + video_player: ^2.11.1 + flutter_http_cache: ^0.0.3 + image_picker: ^1.2.2 + permission_handler: ^12.0.1 + wechat_assets_picker: ^9.0.0 + photo_manager: ^3.0.0 + camera: ^0.11.0 + pointycastle: ^3.9.1 + visibility_detector: ^0.4.0+2 + video_thumbnail: ^0.5.3 + record: ^6.2.0 + audioplayers: ^6.6.0 + ffmpeg_kit_flutter_new_min_gpl: ^2.1.1 dev_dependencies: flutter_test: @@ -71,6 +85,14 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 + + flutter_launcher_icons: "^0.14.0" + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/icon.png" + remove_alpha_channel_ios: true # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/srv/8971f17fd63b416b964620c9bd89701a.png b/srv/8971f17fd63b416b964620c9bd89701a.png new file mode 100644 index 0000000000000000000000000000000000000000..9147a48f9f776a648134dbb0826c4835f663f15b GIT binary patch literal 142683 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
com;&PRd;0m+0Gw`KChYk54l}W+GT9i+&p2A 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

<%&FNiH=NU8yy9=ZqEEog6US5vOg2 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 GzyH}_a^ds< literal 0 HcmV?d00001 diff --git a/srv/app/api/endpoints/media.py b/srv/app/api/endpoints/media.py index 7ce8a00..dddc09e 100644 --- a/srv/app/api/endpoints/media.py +++ b/srv/app/api/endpoints/media.py @@ -1,3 +1,4 @@ +import shutil from fastapi import Depends, FastAPI, HTTPException, status, APIRouter, File, UploadFile, Request, Form from fastapi.responses import FileResponse, StreamingResponse from sqlalchemy.orm import Session @@ -49,13 +50,16 @@ def _parse_multipart_body(body: bytes): if not disposition_match: continue - field_name = disposition_match.group(1).decode('utf-8', errors='ignore') + field_name = disposition_match.group( + 1).decode('utf-8', errors='ignore') filename = disposition_match.group(2) if field_name != 'file': continue - filename = filename.decode('utf-8', errors='ignore') if filename else 'upload.bin' - content_type_match = re.search(br'Content-Type:\s*([\w\-\/]+)', headers, re.IGNORECASE) + filename = filename.decode( + 'utf-8', errors='ignore') if filename else 'upload.bin' + content_type_match = re.search( + br'Content-Type:\s*([\w\-\/]+)', headers, re.IGNORECASE) content_type = ( content_type_match.group(1).decode('utf-8', errors='ignore') if content_type_match @@ -86,14 +90,16 @@ def _encode_multipart_formdata(fields, files): for name, value in fields.items(): body.write(f"--{boundary}\r\n".encode('utf-8')) - body.write(f'Content-Disposition: form-data; name="{name}"\r\n\r\n'.encode('utf-8')) + body.write( + f'Content-Disposition: form-data; name="{name}"\r\n\r\n'.encode('utf-8')) body.write(str(value).encode('utf-8')) body.write(b"\r\n") for field_name, filename, content_type, file_bytes in files: body.write(f"--{boundary}\r\n".encode('utf-8')) body.write( - f'Content-Disposition: form-data; name="{field_name}"; filename="{filename}"\r\n'.encode('utf-8') + f'Content-Disposition: form-data; name="{field_name}"; filename="{filename}"\r\n'.encode( + 'utf-8') ) body.write(f"Content-Type: {content_type}\r\n\r\n".encode('utf-8')) body.write(file_bytes) @@ -130,9 +136,11 @@ def _stream_response_from_remote(url: str): except urllib.error.HTTPError as exc: if exc.code == 404: raise HTTPException(status_code=404, detail='File not found') - raise HTTPException(status_code=502, detail=f'Error fetching media from home server: {exc.code}') + raise HTTPException( + status_code=502, detail=f'Error fetching media from home server: {exc.code}') except Exception as exc: - raise HTTPException(status_code=502, detail=f'Could not reach home server: {exc}') + raise HTTPException( + status_code=502, detail=f'Could not reach home server: {exc}') headers = {k.lower(): v for k, v in response.getheaders()} content_type = headers.get('content-type', 'application/octet-stream') @@ -146,7 +154,8 @@ def _stream_response_from_remote(url: str): def _post_file_to_home(item: models.CloudMediaItem) -> tuple[bool, str]: - file_path = os.path.join(config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) + file_path = os.path.join( + config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) if not os.path.exists(file_path): return False, 'Local cache file not found' @@ -159,7 +168,8 @@ def _post_file_to_home(item: models.CloudMediaItem) -> tuple[bool, str]: 'original_filename': item.original_filename or item.local_filename, } files = [ - ('file', item.original_filename or item.local_filename, item.content_type or 'application/octet-stream', content), + ('file', item.original_filename or item.local_filename, + item.content_type or 'application/octet-stream', content), ] body, boundary = _encode_multipart_formdata(fields, files) request = urllib.request.Request( @@ -201,7 +211,8 @@ def _cleanup_home_quota(db: Session, owner_id: int | None): for file_record in files: if total <= config.HOME_USER_QUOTA_BYTES: break - path = os.path.join(config.HOME_MEDIA_FOLDER, file_record.storage_filename) + path = os.path.join(config.HOME_MEDIA_FOLDER, + file_record.storage_filename) if os.path.exists(path): os.remove(path) total -= file_record.size_bytes @@ -212,7 +223,8 @@ def _cleanup_home_quota(db: Session, owner_id: int | None): def _cleanup_all_home_storage(): db = models.SessionLocal() try: - owner_ids = db.query(models.HomeMediaFile.owner_id).filter(models.HomeMediaFile.owner_id.isnot(None)).distinct().all() + owner_ids = db.query(models.HomeMediaFile.owner_id).filter( + models.HomeMediaFile.owner_id.isnot(None)).distinct().all() for owner_id_tuple in owner_ids: _cleanup_home_quota(db, owner_id_tuple[0]) finally: @@ -248,7 +260,8 @@ async def forward_pending_media_loop(): item.sent_at = func.now() item.error_message = None db.commit() - cache_path = os.path.join(config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) + cache_path = os.path.join( + config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) if os.path.exists(cache_path): os.remove(cache_path) else: @@ -293,7 +306,8 @@ async def upload_file( content = await uploaded_file.read() if len(content) > config.MEDIA_UPLOAD_MAX_BYTES: - raise HTTPException(status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') + raise HTTPException( + status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') file_id = uuid.uuid4().hex filename = f"{file_id}.enc" @@ -315,7 +329,8 @@ async def upload_file_v2( current_user: models.User = Depends(get_current_user), ): if config.SERVER_ROLE != 'cloud': - raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail='Upload endpoint is available only on cloud server') + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail='Upload endpoint is available only on cloud server') uploaded_file = await _get_upload_file(request, file) if uploaded_file is None or not uploaded_file.filename: @@ -323,7 +338,8 @@ async def upload_file_v2( content = await uploaded_file.read() if len(content) > config.MEDIA_UPLOAD_MAX_BYTES: - raise HTTPException(status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') + raise HTTPException( + status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') db = models.SessionLocal() try: @@ -337,7 +353,8 @@ async def upload_file_v2( file_id = uuid.uuid4().hex local_filename = f"{file_id}.enc" - storage_path = os.path.join(config.CLOUD_MEDIA_CACHE_FOLDER, local_filename) + storage_path = os.path.join( + config.CLOUD_MEDIA_CACHE_FOLDER, local_filename) with open(storage_path, 'wb') as f: f.write(content) @@ -369,7 +386,8 @@ async def receive_media( ): secret = request.headers.get('X-Media-Forwarding-Secret') if secret != config.MEDIA_FORWARDING_SECRET: - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid forwarding secret') + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid forwarding secret') uploaded_file = await _get_upload_file(request, file) if uploaded_file is None or not uploaded_file.filename: @@ -377,7 +395,8 @@ async def receive_media( content = await uploaded_file.read() if len(content) > config.MEDIA_UPLOAD_MAX_BYTES: - raise HTTPException(status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') + raise HTTPException( + status_code=400, detail=f'File too large (max {config.MEDIA_UPLOAD_MAX_BYTES} bytes)') file_id = cloud_file_id or uuid.uuid4().hex storage_filename = f"{file_id}.enc" @@ -404,13 +423,162 @@ async def receive_media( return {'status': 'ok', 'file_id': file_id} +@mediaRouter.get('/size/{file_id}') +async def get_file_size(file_id: str): + db = models.SessionLocal() + db_file = None + try: + db_file = db.query(models.HomeMediaFile).filter( + models.HomeMediaFile.file_id == file_id).first() + finally: + db.close() + # 1. Проверяем наличие файла локально на этом сервере + local_path = _find_local_media_path(file_id) + if local_path and os.path.exists(local_path): + file_size = os.path.getsize(local_path) + filename = db_file.original_filename if db_file else f"file_{file_id}" + content_type = db_file.content_type if db_file else 'application/octet-stream' + encoded_filename = urllib.parse.quote(filename) + return {"file_id": file_id, "size": file_size, "file_name": encoded_filename, "content_type": content_type} + + # 2. Если роль сервера 'cloud', запрашиваем размер у домашнего сервера + if config.SERVER_ROLE == 'cloud': + remote_url = f"{config.HOME_SERVER_URL}/media/size/{file_id}" + try: + # Выполняем синхронный легковесный подзапрос к домашнему серверу в треде, + # чтобы не блокировать асинхронный цикл FastAPI (по аналогии с деплоем стримов) + def _fetch_remote_size(): + req = urllib.request.Request(remote_url, method='GET') + with urllib.request.urlopen(req, timeout=5.0) as response: + if response.status == 200: + import json + return json.loads(response.read().decode('utf-8')) + return None + + remote_data = await asyncio.to_thread(_fetch_remote_size) + if remote_data: + return remote_data + + except urllib.error.HTTPError as e: + if e.code == 404: + raise HTTPException( + status_code=404, detail='File not found on home server') + raise HTTPException(status_code=e.code, detail='Home server error') + except Exception as e: + print(f"Ошибка подключения к домашнему серверу: {e}") + raise HTTPException( + status_code=502, detail='Home server is unavailable') + + # 3. Если файл не найден ни локально, ни на удаленном сервере + raise HTTPException(status_code=404, detail='File not found') + + @mediaRouter.get('/{file_id}') async def get_file(file_id: str): + db = models.SessionLocal() + db_file = None + try: + db_file = db.query(models.HomeMediaFile).filter( + models.HomeMediaFile.file_id == file_id).first() + finally: + db.close() local_path = _find_local_media_path(file_id) if local_path: - return FileResponse(local_path, media_type='application/octet-stream') + filename = db_file.original_filename if db_file else f"file_{file_id}" + content_type = db_file.content_type if db_file else 'application/octet-stream' + encoded_filename = urllib.parse.quote(filename) + headers = { + "Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}" + } + + return FileResponse( + local_path, + media_type=content_type, + headers=headers + ) if config.SERVER_ROLE == 'cloud': return _stream_response_from_remote(f"{config.HOME_SERVER_URL}/media/{file_id}") raise HTTPException(status_code=404, detail='File not found') + + +@mediaRouter.post('/copy_internal') +async def copy_file_internal( + request: Request, + file_id: str = Form(...), + owner_id: int = Form(...), # ID нового владельца (получателя) +): + # Проверка секрета + secret = request.headers.get('X-Media-Forwarding-Secret') + if secret != config.MEDIA_FORWARDING_SECRET: + raise HTTPException(status_code=401, detail='Unauthorized') + + # 1. Находим файл + source_path = _find_local_media_path(file_id) + if not source_path: + raise HTTPException(status_code=404, detail='Source file not found') + + # 2. Создаем новый ID и путь + new_file_id = uuid.uuid4().hex + new_storage_filename = f"{new_file_id}.enc" + dest_path = os.path.join(config.HOME_MEDIA_FOLDER, new_storage_filename) + + # 3. Физическое копирование + shutil.copyfile(source_path, dest_path) + + # 4. Обновляем БД + db = models.SessionLocal() + try: + old_record = db.query(models.HomeMediaFile).filter( + models.HomeMediaFile.file_id == file_id).first() + new_record = models.HomeMediaFile( + file_id=new_file_id, + owner_id=owner_id, + original_filename=old_record.original_filename if old_record else "copy.enc", + content_type=old_record.content_type if old_record else 'application/octet-stream', + storage_filename=new_storage_filename, + size_bytes=os.path.getsize(dest_path), + ) + db.add(new_record) + db.commit() + finally: + db.close() + + return {"status": "ok", "new_file_id": new_file_id} + + +@mediaRouter.post('/copy') +async def copy( + file_id: str = Form(...), + current_user: models.User = Depends(get_current_user), +): + if config.SERVER_ROLE != 'cloud': + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail='Upload endpoint is available only on cloud server') + + # Делаем запрос к домашнему серверу + url = f"{config.HOME_SERVER_URL}/media/copy_internal" + + # Используем FormData для передачи параметров на домашний сервер + body_data = f"file_id={file_id}&owner_id={current_user.id}".encode('utf-8') + request = urllib.request.Request( + url, + data=body_data, + headers={ + 'X-Media-Forwarding-Secret': config.MEDIA_FORWARDING_SECRET, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + method='POST' + ) + + try: + with urllib.request.urlopen(request, timeout=10) as response: + if response.status == 200: + import json + return json.loads(response.read().decode('utf-8')) + except Exception as e: + raise HTTPException( + status_code=502, detail=f'Failed to copy on home server: {e}') + + raise HTTPException(status_code=500, detail='Copying failed') diff --git a/srv/app/api/endpoints/messages.py b/srv/app/api/endpoints/messages.py index f32d6b5..08e0af7 100644 --- a/srv/app/api/endpoints/messages.py +++ b/srv/app/api/endpoints/messages.py @@ -37,6 +37,21 @@ async def get_chat_history( return jsonable_encoder(messages) +@messagesRouter.get("/last") +async def get_last_messages( + contact_id: int, + current_user: models.User = Depends(get_current_user), + db: Session = Depends(get_db), + limit: int = 2 +): + messages = db.query(models.Message).filter( + (models.Message.sender_id == current_user.id) & (models.Message.receiver_id == contact_id) | + (models.Message.sender_id == contact_id) & (models.Message.receiver_id == current_user.id) + ).order_by(models.Message.timestamp.desc()).limit(limit).all() + + return jsonable_encoder(messages) + + @messagesRouter.delete("/all") async def delete_all_messages( current_user: models.User = Depends(get_current_user), diff --git a/srv/app/api/endpoints/users.py b/srv/app/api/endpoints/users.py index 1e3d5be..313bd33 100644 --- a/srv/app/api/endpoints/users.py +++ b/srv/app/api/endpoints/users.py @@ -1,7 +1,7 @@ import os -from fastapi import Depends, APIRouter, HTTPException, Depends, Request +from fastapi import Depends, APIRouter, HTTPException, Depends, Request, status from sqlalchemy.orm import Session from app.db import models from app.core.security import get_current_user @@ -34,7 +34,8 @@ def _delete_old_avatar_file(file_id: str, db: Session): models.CloudMediaItem.file_id == file_id, ).all() for item in cloud_item: - cloud_path = os.path.join(config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) + cloud_path = os.path.join( + config.CLOUD_MEDIA_CACHE_FOLDER, item.local_filename) if os.path.exists(cloud_path): try: os.remove(cloud_path) @@ -175,8 +176,8 @@ async def update_privacy_settings( user_to_update.show_avatar = 1 if data.show_avatar else 0 if data.show_about is not None: user_to_update.show_about = 1 if data.show_about else 0 - if data.show_username is not None: - user_to_update.show_username = 1 if data.show_username else 0 + # Настройка show_username удалена, всегда сохраняем 1 + user_to_update.show_username = 1 if data.show_last_online is not None: user_to_update.show_last_online = 1 if data.show_last_online else 0 try: @@ -201,11 +202,12 @@ async def get_privacy_settings(current_user: models.User = Depends(get_current_u "show_phone": bool(current_user.show_phone), "show_avatar": bool(current_user.show_avatar), "show_about": bool(current_user.show_about), - "show_username": bool(current_user.show_username), + "show_username": True, # Настройка show_username удалена, всегда возвращаем True "show_last_online": bool(current_user.show_last_online), } + @usersRouter.get("/all") async def read_users_all(current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): users = db.query(models.User).all() @@ -217,7 +219,7 @@ async def read_users_all(current_user: models.User = Depends(get_current_user), else: users_for_return = users return [{"id": user.id, "username": user.username, "name": f"{user.first_name} {user.last_name or ''}".strip(), "public_key": user.public_key} for user in users_for_return] - + @usersRouter.get("/chats") async def read_users_chats( @@ -282,11 +284,14 @@ async def read_users_chats( "username": user.username, "name": f"{user.first_name} {user.last_name or ''}".strip(), "public_key": user.public_key, - "avatar_file_id": user.avatar_file_id if user.show_avatar else None, - "avatar_url": str(request.url_for("get_file", file_id=user.avatar_file_id)) if user.show_avatar and user.avatar_file_id else None, + "avatar_file_id": user.avatar_file_id if (user.show_avatar or current_user.id == 1) else None, + "avatar_url": str(request.url_for("get_file", file_id=user.avatar_file_id)) if (user.show_avatar or current_user.id == 1) and user.avatar_file_id else None, "last_message": last_msg.content if last_msg else None, "last_message_time": (last_msg.timestamp.isoformat() if last_msg and last_msg.timestamp else None), "unread_count": unread_count, + "online": str(user.id) in connection_manager.manager.active_connections, + "last_message_id": last_msg.id if last_msg else None, + "last_message_type": last_msg.message_type if last_msg else None, } ) @@ -294,6 +299,51 @@ async def read_users_chats( return result + +@usersRouter.get("/by-username/{username}", response_model=schemas.UserContactResponse) +def get_user_by_username(username: str, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user)): + user = db.query(models.User).filter(models.User.username == username).first() + + if not user: + raise HTTPException(status_code=404, detail="Пользователь не найден") + + profile_data = { + "id": user.id, + "public_key": user.public_key, + } + + profile_data["first_name"] = user.first_name + profile_data["last_name"] = user.last_name + profile_data["username"] = user.username + + if user.show_avatar or current_user.id == 1: + profile_data["avatar_url"] = str(request.url_for( + "get_file", file_id=user.avatar_file_id)) if (user.show_avatar or current_user.id == 1) and user.avatar_file_id else None + + profile_data["show_avatar"] = bool(user.show_avatar) + + profile_data["totp_enabled"] = bool(user.totp_secret) + + if user.show_about or current_user.id == 1: + profile_data["about"] = user.about + + if user.show_phone or current_user.id == 1: + profile_data["phone"] = user.phone + + if user.show_email or current_user.id == 1: + profile_data["email"] = user.email + + if str(user.id) in connection_manager.manager.active_connections: + profile_data["online"] = True + else: + profile_data["online"] = False + if user.show_last_online or current_user.id == 1: + profile_data["last_online"] = user.last_online.isoformat( + ) if user.last_online else None + + return profile_data + + @usersRouter.get("/{user_id}", response_model=schemas.UserProfile) def get_user_by_id( user_id: int, @@ -317,33 +367,30 @@ def get_user_by_id( profile_data["first_name"] = user.first_name profile_data["last_name"] = user.last_name + profile_data["username"] = user.username - # Проверяем настройки конфиденциальности - if user.show_username: - profile_data["username"] = user.username - - if user.show_avatar: + if user.show_avatar or current_user.id == 1: profile_data["avatar_url"] = str(request.url_for( - "get_file", file_id=user.avatar_file_id)) if user.avatar_file_id else None + "get_file", file_id=user.avatar_file_id)) if (user.show_avatar or current_user.id == 1) and user.avatar_file_id else None profile_data["show_avatar"] = bool(user.show_avatar) profile_data["totp_enabled"] = bool(user.totp_secret) - if user.show_about: + if user.show_about or current_user.id == 1: profile_data["about"] = user.about - if user.show_phone: + if user.show_phone or current_user.id == 1: profile_data["phone"] = user.phone - if user.show_email: + if user.show_email or current_user.id == 1: profile_data["email"] = user.email if str(user.id) in connection_manager.manager.active_connections: profile_data["online"] = True else: profile_data["online"] = False - if user.show_last_online: + if user.show_last_online or current_user.id == 1: profile_data["last_online"] = user.last_online.isoformat( ) if user.last_online else None diff --git a/srv/app/api/schemas.py b/srv/app/api/schemas.py index 19b2bbc..1185d8d 100644 --- a/srv/app/api/schemas.py +++ b/srv/app/api/schemas.py @@ -72,3 +72,12 @@ class UserProfile(BaseModel): class Config: from_attributes = True + +class UserContactResponse(BaseModel): + id: str + name: str + username: str + public_key: Optional[str] = None + + class Config: + from_attributes = True \ No newline at end of file diff --git a/srv/app/websocket/connection_manager.py b/srv/app/websocket/connection_manager.py index 348e19c..8f225e2 100644 --- a/srv/app/websocket/connection_manager.py +++ b/srv/app/websocket/connection_manager.py @@ -110,15 +110,15 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: f"DEBUG saved message: id={new_msg.id}, sender={new_msg.sender_id}, receiver={new_msg.receiver_id}, message_type={new_msg.message_type}, file_id={new_msg.file_id}, encrypted_key_present={new_msg.encrypted_key is not None}", ) - # ACK отправителю: сервер принял и сохранил сообщение (нужно для статусов клиента). + # ACK отправителю: сервер принял и сохранил сообщение. await manager.send_personal_message({ "type": "message_sent", "temp_id": temp_id, "server_id": new_msg.id, - "timestamp": (new_msg.timestamp or datetime.now()).isoformat(), + "timestamp": (new_msg.timestamp or datetime.utcnow()).isoformat(), }, str(user_id)) - # Если получатель оффлайн — отправим пуш (если есть токен и ключи). + # отправим пуш. if user.public_key: receiver = db.query(models.User).filter( models.User.id == receiver_id).first() @@ -129,7 +129,12 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: user.first_name, user.public_key, content50 if content50 else content, - datetime.now(), + datetime.utcnow(), + unread_count=db.query(models.Message).filter( + models.Message.receiver_id == receiver_id, + models.Message.read_at == None + ).count(), + message_id=new_msg.id, ) # Формируем пакет для получателя outgoing_message = { @@ -141,7 +146,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: "message_type": message_type, "file_id": file_id, "encrypted_key": message_data.get("encrypted_key"), - "timestamp": (new_msg.timestamp or datetime.now()).isoformat(), + "timestamp": (new_msg.timestamp or datetime.utcnow()).isoformat(), "reply_to_id": new_msg.reply_to_id, "reply_to_text": new_msg.reply_to_text, } @@ -157,7 +162,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: # Если сообщение реально ушло по сокету получателю — отмечаем delivered_at. if sent_to_receiver: try: - delivered_at = datetime.now() + delivered_at = datetime.utcnow() new_msg.delivered_at = delivered_at db.add(new_msg) db.commit() @@ -192,7 +197,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: continue try: msg.content = content - msg.edited_at = datetime.now() + msg.edited_at = datetime.utcnow() db.add(msg) db.commit() except Exception: @@ -201,6 +206,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: event = { "type": "message_edited", "message_id": msg.id, + "sender_id": msg.sender_id, "content": msg.content, "edited_at": msg.edited_at.isoformat() if msg.edited_at else None, } @@ -259,7 +265,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: # Сохраняем read_at в БД try: - read_at = datetime.now() + read_at = datetime.utcnow() msg.read_at = read_at db.add(msg) db.commit() @@ -270,7 +276,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: await manager.send_personal_message({ "type": "message_read", "message_id": message_id, - "timestamp": read_at.isoformat() if 'read_at' in locals() else datetime.now().isoformat(), + "timestamp": read_at.isoformat() if 'read_at' in locals() else datetime.utcnow().isoformat(), }, str(sender_id)) elif message_data.get("type") == "typing": receiver_id = message_data.get("receiver_id") @@ -311,7 +317,7 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db: }) -def send_fcm_notification(token, user_id, username, public_key, encrypted_text, timestamp): +def send_fcm_notification(token, user_id, username, public_key, encrypted_text, timestamp, unread_count='1', message_id='0'): print( f"DEBUG: Отправляем FCM уведомление пользователю {user_id} с токеном {token}") message = messaging.Message( @@ -322,6 +328,8 @@ def send_fcm_notification(token, user_id, username, public_key, encrypted_text, "public_key": public_key, "content": encrypted_text, # Зашифрованный текст "timestamp": timestamp.isoformat(), + "unread_count": str(unread_count), + "message_id": str(message_id), }, android=messaging.AndroidConfig( priority='high', diff --git a/srv/ca5c897d07a84334933ad99beab4e63c.png b/srv/ca5c897d07a84334933ad99beab4e63c.png new file mode 100644 index 0000000000000000000000000000000000000000..5377185683c7060c47a879044b27ef65fbf7ccc1 GIT binary patch literal 69999 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

E9|a$XD=;jk8RbQ))boG82yZ2)+YxDl)1; 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

MqA1L9xp{r15#J7PLsn+GfrmMh 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�J?&!UX*AWMtNw!@9;Vx~BR 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 #include #include #include #include #include +#include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); FirebaseCorePluginCApiRegisterWithRegistrar( @@ -24,6 +29,10 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("GalPluginCApi")); LocalAuthPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("LocalAuthPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 6b6e227..fa538b4 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,11 +3,14 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows file_selector_windows firebase_core flutter_secure_storage_windows gal local_auth_windows + permission_handler_windows + record_windows url_launcher_windows )