From cbe77fbb9e45c8260cbaf01976ef2e57cf3f5580 Mon Sep 17 00:00:00 2001 From: Amirmahdi Nourkazemi Date: Fri, 5 Jun 2026 18:02:48 +0330 Subject: [PATCH] feat: change package name --- app/build.gradle.kts | 6 +- app/release/output-metadata.json | 2 +- .../ExampleInstrumentedTest.kt | 2 +- app/src/main/assets/key/key_pharmacy.jks | Bin 0 -> 2706 bytes .../java/com/approagency/drug/MainActivity.kt | 54 -- .../drug/domain/repository/DrugRepository.kt | 24 - .../domain/usecase/DrugDetailYabUseCase.kt | 14 - .../domain/usecase/GetDrugSearchUseCase.kt | 13 - .../domain/usecase/SearchDrugsYabUseCase.kt | 17 - .../approagency/{drug => pharmacy}/DrugApp.kt | 48 +- .../com/approagency/pharmacy/MainActivity.kt | 33 ++ .../data/dto/DarmanModel.kt | 24 +- .../{drug => pharmacy}/data/dto/DrugModels.kt | 146 +++--- .../data/local/dao/TestGroupDao.kt | 90 ++-- .../data/local/dao/TestItemDao.kt | 90 ++-- .../data/local/database/LabDatabase.kt | 84 ++-- .../data/local/entities/TestGroupEntity.kt | 46 +- .../data/local/entities/TestItemEntity.kt | 71 ++- .../data/remote/DarooyabApiService.kt | 3 +- .../data/remote/DrugApiService.kt | 59 ++- .../data/remote/DrugDetailParser.kt | 5 +- .../data/remote/DrugHtmlParser.kt | 6 +- .../data/remote/PharmacyHtmlParser.kt | 6 +- .../data/remote/StringConverterFactory.kt | 2 +- .../data/repository/DrugRepositoryImpl.kt | 247 +++++----- .../data/repository/LabRepositoryImpl.kt | 68 +-- .../{drug => pharmacy}/di/AppModule.kt | 323 ++++++------ .../domain/model/DaroYabParams.kt | 2 +- .../domain/model/DaroYabSearchResult.kt | 2 +- .../domain/model/DrugDetail.kt | 2 +- .../domain/model/DrugSearchParams.kt | 20 +- .../domain/model/DrugSearchResult.kt | 2 +- .../domain/model/PharmacyModels.kt | 2 +- .../domain/model/TestGroup.kt | 42 +- .../domain/model/TestItem.kt | 38 +- .../domain/repository/DrugRepository.kt | 23 + .../domain/usecase/DrugDetailYabUseCase.kt | 12 + .../domain/usecase/GetDarmanUseCase.kt | 22 +- .../domain/usecase/GetDrugDetailUseCase.kt | 22 +- .../domain/usecase/GetDrugSearchUseCase.kt | 13 + .../domain/usecase/GetPharmaciesUseCase.kt | 6 +- .../usecase/GetPharmacyDetailUseCase.kt | 6 +- .../domain/usecase/GetTestGroupUseCase.kt | 46 +- .../domain/usecase/GetTestItemByGroupId.kt | 49 +- .../domain/usecase/SearchDrugsYabUseCase.kt | 14 + .../domain/usecase/SearchTestsUseCase.kt | 44 +- .../navigation/AppNavGraph.kt | 10 +- .../navigation/BottomBar.kt | 13 +- .../navigation/MainContainer.kt | 6 +- .../{drug => pharmacy}/navigation/Routes.kt | 2 +- .../navigation/graphs/HomeGraph.kt | 0 .../navigation/graphs/LabGraph.kt | 0 .../navigation/graphs/SearchGraph.kt | 0 .../presentation/common/CustomBottonSheet.kt | 76 ++- .../presentation/common/CustomBox.kt | 49 +- .../presentation/common/CustomModalDialog.kt | 77 ++- .../presentation/common/CustomTextFilled.kt | 363 +++++++------- .../presentation/common/EmptySearchState.kt | 3 +- .../common/LoadingMoreIndicator.kt | 2 +- .../presentation/common/SnackbarManager.kt | 42 +- .../presentation/common/UiState.kt | 12 +- .../presentation/common/loading.kt | 43 +- .../presentation/common/primaryButton.kt | 75 ++- .../presentation/components/DarmanContent.kt | 251 +++++----- .../components/DaroYabResultContent.kt | 11 +- .../components/DrugListContent.kt | 302 ++++++------ .../components/EmptyStateContent.kt | 78 +-- .../components/PaginationControls.kt | 2 +- .../components/PharmacyBottomSheet.kt | 20 +- .../presentation/components/RetryContent.kt | 6 +- .../components/SearchResultContent.kt | 409 ++++++++-------- .../presentation/components/ShowDrugDetail.kt | 447 +++++++++-------- .../components/TestDetailSheet.kt | 239 +++++---- .../components/TestGroupItemContent.kt | 178 +++---- .../presentation/components/showYabDetail.kt | 28 +- .../presentation/screens/DrugDetailScreen.kt | 16 +- .../presentation/screens/HomeScreen.kt | 461 ++++++++---------- .../presentation/screens/LabScreen.kt | 397 ++++++++------- .../presentation/screens/RootScreen.kt | 248 +++++----- .../presentation/screens/SearchScreen.kt | 28 +- .../viewModel/DrugDetailViewModel.kt | 6 +- .../presentation/viewModel/HomeViewModel.kt | 344 +++++++------ .../presentation/viewModel/LabViewModel.kt | 346 +++++++------ .../viewModel/PharmacyViewModel.kt | 10 +- .../presentation/viewModel/SearchViewModel.kt | 5 +- .../{drug => pharmacy}/ui/theme/Color.kt | 2 +- .../{drug => pharmacy}/ui/theme/Dimention.kt | 38 +- .../{drug => pharmacy}/ui/theme/Local.kt | 8 +- .../ui/theme/MaterialThemeExt.kt | 14 +- .../{drug => pharmacy}/ui/theme/Shape.kt | 22 +- .../{drug => pharmacy}/ui/theme/Theme.kt | 4 +- .../{drug => pharmacy}/ui/theme/Type.kt | 6 +- .../{drug => pharmacy}/utils/Config.kt | 10 +- .../{drug => pharmacy}/utils/province.kt | 2 +- .../{drug => pharmacy}/utils/retry.kt | 58 +-- app/src/main/res/values/strings.xml | 2 +- .../{drug => pharmacy}/ExampleUnitTest.kt | 2 +- 97 files changed, 3228 insertions(+), 3395 deletions(-) rename app/src/androidTest/java/com/approagency/{drug => pharmacy}/ExampleInstrumentedTest.kt (94%) create mode 100644 app/src/main/assets/key/key_pharmacy.jks delete mode 100644 app/src/main/java/com/approagency/drug/MainActivity.kt delete mode 100644 app/src/main/java/com/approagency/drug/domain/repository/DrugRepository.kt delete mode 100644 app/src/main/java/com/approagency/drug/domain/usecase/DrugDetailYabUseCase.kt delete mode 100644 app/src/main/java/com/approagency/drug/domain/usecase/GetDrugSearchUseCase.kt delete mode 100644 app/src/main/java/com/approagency/drug/domain/usecase/SearchDrugsYabUseCase.kt rename app/src/main/java/com/approagency/{drug => pharmacy}/DrugApp.kt (78%) create mode 100644 app/src/main/java/com/approagency/pharmacy/MainActivity.kt rename app/src/main/java/com/approagency/{drug => pharmacy}/data/dto/DarmanModel.kt (79%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/dto/DrugModels.kt (93%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/local/dao/TestGroupDao.kt (90%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/local/dao/TestItemDao.kt (90%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/local/database/LabDatabase.kt (77%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/local/entities/TestGroupEntity.kt (86%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/local/entities/TestItemEntity.kt (86%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/DarooyabApiService.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/DrugApiService.kt (70%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/DrugDetailParser.kt (99%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/DrugHtmlParser.kt (95%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/PharmacyHtmlParser.kt (97%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/remote/StringConverterFactory.kt (91%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/repository/DrugRepositoryImpl.kt (78%) rename app/src/main/java/com/approagency/{drug => pharmacy}/data/repository/LabRepositoryImpl.kt (80%) rename app/src/main/java/com/approagency/{drug => pharmacy}/di/AppModule.kt (68%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/DaroYabParams.kt (65%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/DaroYabSearchResult.kt (79%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/DrugDetail.kt (97%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/DrugSearchParams.kt (78%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/DrugSearchResult.kt (87%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/PharmacyModels.kt (95%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/TestGroup.kt (73%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/model/TestItem.kt (74%) create mode 100644 app/src/main/java/com/approagency/pharmacy/domain/repository/DrugRepository.kt create mode 100644 app/src/main/java/com/approagency/pharmacy/domain/usecase/DrugDetailYabUseCase.kt rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetDarmanUseCase.kt (51%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetDrugDetailUseCase.kt (53%) create mode 100644 app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugSearchUseCase.kt rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetPharmaciesUseCase.kt (61%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetPharmacyDetailUseCase.kt (55%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetTestGroupUseCase.kt (76%) rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/GetTestItemByGroupId.kt (70%) create mode 100644 app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchDrugsYabUseCase.kt rename app/src/main/java/com/approagency/{drug => pharmacy}/domain/usecase/SearchTestsUseCase.kt (57%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/AppNavGraph.kt (84%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/BottomBar.kt (86%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/MainContainer.kt (75%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/Routes.kt (92%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/graphs/HomeGraph.kt (100%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/graphs/LabGraph.kt (100%) rename app/src/main/java/com/approagency/{drug => pharmacy}/navigation/graphs/SearchGraph.kt (100%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/CustomBottonSheet.kt (87%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/CustomBox.kt (83%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/CustomModalDialog.kt (89%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/CustomTextFilled.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/EmptySearchState.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/LoadingMoreIndicator.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/SnackbarManager.kt (88%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/UiState.kt (97%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/loading.kt (61%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/common/primaryButton.kt (89%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/DarmanContent.kt (84%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/DaroYabResultContent.kt (86%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/DrugListContent.kt (93%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/EmptyStateContent.kt (89%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/PaginationControls.kt (98%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/PharmacyBottomSheet.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/RetryContent.kt (87%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/SearchResultContent.kt (92%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/ShowDrugDetail.kt (92%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/TestDetailSheet.kt (88%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/TestGroupItemContent.kt (93%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/components/showYabDetail.kt (94%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/screens/DrugDetailScreen.kt (98%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/screens/HomeScreen.kt (71%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/screens/LabScreen.kt (79%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/screens/RootScreen.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/screens/SearchScreen.kt (90%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/viewModel/DrugDetailViewModel.kt (88%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/viewModel/HomeViewModel.kt (86%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/viewModel/LabViewModel.kt (88%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/viewModel/PharmacyViewModel.kt (91%) rename app/src/main/java/com/approagency/{drug => pharmacy}/presentation/viewModel/SearchViewModel.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Color.kt (75%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Dimention.kt (94%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Local.kt (62%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/MaterialThemeExt.kt (84%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Shape.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Theme.kt (96%) rename app/src/main/java/com/approagency/{drug => pharmacy}/ui/theme/Type.kt (95%) rename app/src/main/java/com/approagency/{drug => pharmacy}/utils/Config.kt (76%) rename app/src/main/java/com/approagency/{drug => pharmacy}/utils/province.kt (97%) rename app/src/main/java/com/approagency/{drug => pharmacy}/utils/retry.kt (92%) rename app/src/test/java/com/approagency/{drug => pharmacy}/ExampleUnitTest.kt (90%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8f1cdc5..ce6c382 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,13 +6,13 @@ plugins { } android { - namespace = "com.approagency.drug" + namespace = "com.approagency.pharmacy" compileSdk { version = release(36) } defaultConfig { - applicationId = "com.approagency.drug" + applicationId = "com.approagency.pharmacy" minSdk = 24 targetSdk = 36 versionCode = 1 @@ -23,7 +23,7 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 22cacee..d93bd7a 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -4,7 +4,7 @@ "type": "APK", "kind": "Directory" }, - "applicationId": "com.approagency.drug", + "applicationId": "com.approagency.pharmacy", "variantName": "release", "elements": [ { diff --git a/app/src/androidTest/java/com/approagency/drug/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/approagency/pharmacy/ExampleInstrumentedTest.kt similarity index 94% rename from app/src/androidTest/java/com/approagency/drug/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/approagency/pharmacy/ExampleInstrumentedTest.kt index a64c925..ea737b0 100644 --- a/app/src/androidTest/java/com/approagency/drug/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/approagency/pharmacy/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.approagency.drug +package com.approagency.pharmacy import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 diff --git a/app/src/main/assets/key/key_pharmacy.jks b/app/src/main/assets/key/key_pharmacy.jks new file mode 100644 index 0000000000000000000000000000000000000000..9113da918d0d552692c57648790cf6e04aa8165c GIT binary patch literal 2706 zcma);X*3iJ`^L>GV;Q?_(~vD=nX#{#NR}`|;-O;fSt>+GwqdLxmFzne8B4Y_jh#}8 z@K};9G1IYFS$9eOd0T3w72?QX~Y|s<`p9o}uFrh`EEQDBNfEx%5 zkOgy6uQQK-=zgGIp{4HAZ}Q6!Oau=EDK}=F?Aih!D(3&xBvrE;S-h7D^s)0<$B5b~ z$T!M-mQd8+t@556!ZMH?!L|I`>%kfNJ*zz;TvJW6BKG~7XoELG_r6zWAPf0V8eQhH zeHQQ4^Yy9d+Okz&7{2xHOIk=mNQ`K2Q1bIgwKCEOo5^5N$;mM3bDqg>S1vC!E4uTz zJ*X4ZAj2X=B)j9AFuvO8j!TTibkakZ^EDDexn9qN3xs;kkqR|(S#Neao>k^pK9xbS zVxQa<6{>+Y{OY;n`}BB|UeZeNOnAGckG&^_ z%cBi4wUbn~f`>yoBD@5s`1upnGt2k{BXJ$x`sla=Pirx+Ag8n`3wRfFH#@T7et5j> zrUwQ8ci#}(cU{{Vii{>_fVvDi;LF&WWVf5sLjw?EyQ|3~lHPDS&*`AU(2O?Nq2s3V z=rLSkuD6q3ITfb5-t+j4ZRT!6`Q^TJvF8Jp(7`t0c0;}R4~3|xiYgs@Ryx51On_r| z=KLRzBeG&RaAU)FEyUeAzePW=@#dx~x?R@g5oV?Ia#!W-n;&7*^46myd@|#r?!7L= z0;PuagiXx5iv|c6Q2eA&D~ANPaK!_!tc+`Z_T)L-eZw!N&nFV~eh6)E*;Aw=E1ioB z^U0&j4EeJVX77d7>dM)h2D3A1BnLkDM@9u*4%I>*3g8Q6AAb9Vo3Zb}S<>kK3Ank) zxg?W7ycL%hyv0yyPAPsb9RK6%CoW2o>7mF&eko>K-JYs!FbyOy5$!R^WvFcP6BLnW zP)i9^xxg3s+~lja+^3qgvpz*{wCrFqWpen7?L&n1sO9G2<{Qj!798q&f4$ctR#Bd= z4PvW(3CEu|$~}Vb0Ui^*p_1*FR`_8(sq&{xvs=!z%P%>tDLS;)Tqual*O}XIXc_%@ zFl3=30S@K8Un)?On$LkEtNIsMRpFZG%4MtbM|0J>(QLZ6Y5@0^GA>tOuLpknsIYZv z)}g+!xO&dsVl9ZL(Rg#Xq;;O9V3d@&Brfx+zO7alzzum<%F~yNfbCn zfLvR?ySqYo9`Y((hI9hYGQyetk<)OX>Y!8uSMD+6h6&CrRVdoRyT(KTl7`3x@juHq9c8@XF{$5uLPt|F3>rb%4s~6{z~)n0VkI)MoLky+U>7=F|&(f z>r!m^HI}_P@$~J}Zoj_%DP;}VyY6Jl(LnrP`lN(bATI?Uphv5ZtTYKJcLt@l5&}wSxYHDazj5?YK z_WN_h3@s#roqr<-Ab{!jvi(N^{I`N$Of=Ya-u7JH!>MLMboTnrxlx1umx69%y4uHD zN6qrmu@EOYuxdpTK{KPC`LT~q6eZ%%tCt9yJ=}n)`ktInC0Pw<&+~uM$bCz01)^D+ z90UGZ+#*o2tCNEAt_-a} zXbiji$s467pO%-q(i6H4ixCe71+pAVEWW~JgpCI4sqFlW`}%}TxP7}tQ+iq<=&!_G z*A_vPJ@D8(?@{nzkY!dZi+ivnc!Z0eKT#EQ+`+PE(90`_I90XPF-f)RuQ0>>vK?ts z-k(J@8%kX<|I|{+bU3u=_dfgN%NYjsjZ0VfLQ=PxUt57!`4d0zn1+k3R@_-p)!c^W zcme;dkxzHkR(+D@)HF2)Hm5a1h_S2;vGPoNp{h*rHc{F;A=`4XJHK>$k?>zx-Akv^YodA49T_TjH_v=xOAyL z{|9q`P~A8_b}AK@0)I$)RWDk*5E4=Dgi7~sGI3T)@Od;+E+dLetHWA_4D^zqZrpWw&KY_Kz72&Ne)lZ*jl; z!W@sR&vD5s510Swd<8dC*d>g;-RSRIdGUyr!20<4io#5XUN>eZ9 z64hfF-gz)f&Qx@p@lD#W3tnBEb^Tq3z6JA7tlLqYfQaqt3oTT`6t_==*Ct#} zeL`^0=jut+%eq|2n%s_rQeTcoaITlUb0T}QGWQa$bQl~G@BM5Qf55^V#ADEU$K8(_M;DJr)YGs3V&;p(LplgAQsTHk>gq zS^JBWad(>9cDzX=s)~oO_6**hvNSUdy&csb^s$>gC(3q}B!}}(+&oY$786-7>CZ&ieEebuVVfMiJsmy literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/approagency/drug/MainActivity.kt b/app/src/main/java/com/approagency/drug/MainActivity.kt deleted file mode 100644 index 5f7f9c7..0000000 --- a/app/src/main/java/com/approagency/drug/MainActivity.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.approagency.drug - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.LayoutDirection -import androidx.navigation.compose.rememberNavController -import com.approagency.drug.navigation.AppNavGraph -import com.approagency.drug.presentation.screens.HomeScreen -import com.approagency.drug.ui.theme.DrugTheme -import com.vada.caller.ui.theme.dime - -class MainActivity : ComponentActivity() { - @OptIn(ExperimentalMaterial3Api::class) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - DrugTheme { - - AppNavGraph( -// navController = navController, -// modifier = Modifier.padding(innerPadding) - ) -// Scaffold(modifier = Modifier.fillMaxSize(), -// ) { innerPadding -> -// AppNavGraph( -//// navController = navController, -//// modifier = Modifier.padding(innerPadding) -// ) -// } - } - } - } -} diff --git a/app/src/main/java/com/approagency/drug/domain/repository/DrugRepository.kt b/app/src/main/java/com/approagency/drug/domain/repository/DrugRepository.kt deleted file mode 100644 index 16092a3..0000000 --- a/app/src/main/java/com/approagency/drug/domain/repository/DrugRepository.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.approagency.drug.domain.repository - -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.domain.model.DaroYabParams -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.domain.model.PharmacyDetail -import com.approagency.drug.domain.model.PharmacyItem - -interface DrugRepository { - suspend fun searchDrug(params: DrugSearchParams): Result - suspend fun drugDetail(cod:Int): Result - suspend fun getGorohDaroei(): Result - suspend fun searchDrugs(params:DaroYabParams):Result - suspend fun getDrugDetailFromYab(detailUrl: String):Result - suspend fun searchPharmacies(genericDrugId: String,provId: String): List - - suspend fun getPharmacyDetail(pharmacyUrl: String): PharmacyDetail - -} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/DrugDetailYabUseCase.kt b/app/src/main/java/com/approagency/drug/domain/usecase/DrugDetailYabUseCase.kt deleted file mode 100644 index 9bbc1be..0000000 --- a/app/src/main/java/com/approagency/drug/domain/usecase/DrugDetailYabUseCase.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.domain.model.DaroYabParams -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.domain.repository.DrugRepository - -class DrugDetailYabUseCase ( - private val repository: DrugRepository -) { - suspend operator fun invoke(detailUrl: String):Result { - return repository.getDrugDetailFromYab(detailUrl) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetDrugSearchUseCase.kt b/app/src/main/java/com/approagency/drug/domain/usecase/GetDrugSearchUseCase.kt deleted file mode 100644 index 0b5fe84..0000000 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetDrugSearchUseCase.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.domain.repository.DrugRepository - -class GetDrugSearchUseCase ( - private val repository: DrugRepository -){ - suspend operator fun invoke(params: DrugSearchParams): Result { - return repository.searchDrug(params) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/SearchDrugsYabUseCase.kt b/app/src/main/java/com/approagency/drug/domain/usecase/SearchDrugsYabUseCase.kt deleted file mode 100644 index 05029f0..0000000 --- a/app/src/main/java/com/approagency/drug/domain/usecase/SearchDrugsYabUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.repository.DrugRepositoryImpl -import com.approagency.drug.domain.model.DaroYabParams -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.domain.repository.DrugRepository - -class SearchDrugsYabUseCase ( - private val repository: DrugRepository -) { - suspend operator fun invoke(query: String, pageNumber: Int = 1): Result { - val params = DaroYabParams(query = query, pageNumber = pageNumber) - return repository.searchDrugs(params) - } -} diff --git a/app/src/main/java/com/approagency/drug/DrugApp.kt b/app/src/main/java/com/approagency/pharmacy/DrugApp.kt similarity index 78% rename from app/src/main/java/com/approagency/drug/DrugApp.kt rename to app/src/main/java/com/approagency/pharmacy/DrugApp.kt index 55ad295..d305b49 100644 --- a/app/src/main/java/com/approagency/drug/DrugApp.kt +++ b/app/src/main/java/com/approagency/pharmacy/DrugApp.kt @@ -1,25 +1,25 @@ -package com.approagency.drug - -import android.app.Application -import com.approagency.drug.data.local.database.LabDatabase -import com.approagency.drug.di.appModule -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import org.koin.android.ext.koin.androidContext -import org.koin.core.context.startKoin - -class DrugApp : Application(){ - override fun onCreate() { - super.onCreate() - startKoin { - androidContext(this@DrugApp) - modules(appModule) - printLogger() - } - - // Preload database (optional, for faster access) - GlobalScope.launch { - LabDatabase.getInstance(this@DrugApp) - } - } +package com.approagency.pharmacy + +import android.app.Application +import com.approagency.pharmacy.data.local.database.LabDatabase +import com.approagency.pharmacy.di.appModule +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin + +class DrugApp : Application(){ + override fun onCreate() { + super.onCreate() + startKoin { + androidContext(this@DrugApp) + modules(appModule) + printLogger() + } + + // Preload database (optional, for faster access) + GlobalScope.launch { + LabDatabase.getInstance(this@DrugApp) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/pharmacy/MainActivity.kt b/app/src/main/java/com/approagency/pharmacy/MainActivity.kt new file mode 100644 index 0000000..07993d9 --- /dev/null +++ b/app/src/main/java/com/approagency/pharmacy/MainActivity.kt @@ -0,0 +1,33 @@ +package com.approagency.pharmacy + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.material3.ExperimentalMaterial3Api +import com.approagency.pharmacy.navigation.AppNavGraph +import com.approagency.pharmacy.ui.theme.DrugTheme + +class MainActivity : ComponentActivity() { + @OptIn(ExperimentalMaterial3Api::class) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + DrugTheme { + + AppNavGraph( +// navController = navController, +// modifier = Modifier.padding(innerPadding) + ) +// Scaffold(modifier = Modifier.fillMaxSize(), +// ) { innerPadding -> +// AppNavGraph( +//// navController = navController, +//// modifier = Modifier.padding(innerPadding) +// ) +// } + } + } + } +} diff --git a/app/src/main/java/com/approagency/drug/data/dto/DarmanModel.kt b/app/src/main/java/com/approagency/pharmacy/data/dto/DarmanModel.kt similarity index 79% rename from app/src/main/java/com/approagency/drug/data/dto/DarmanModel.kt rename to app/src/main/java/com/approagency/pharmacy/data/dto/DarmanModel.kt index 5cd6ff2..ced6d99 100644 --- a/app/src/main/java/com/approagency/drug/data/dto/DarmanModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/dto/DarmanModel.kt @@ -1,13 +1,13 @@ -package com.approagency.drug.data.dto - -data class DarmanModel( - val success : String, - val message:String, - val data: List -) - -data class DarmanList( - val cod : Int, - val nam_fa:String, - val nam_en:String, +package com.approagency.pharmacy.data.dto + +data class DarmanModel( + val success : String, + val message:String, + val data: List +) + +data class DarmanList( + val cod : Int, + val nam_fa:String, + val nam_en:String, ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/dto/DrugModels.kt b/app/src/main/java/com/approagency/pharmacy/data/dto/DrugModels.kt similarity index 93% rename from app/src/main/java/com/approagency/drug/data/dto/DrugModels.kt rename to app/src/main/java/com/approagency/pharmacy/data/dto/DrugModels.kt index a0b2a4b..01fb206 100644 --- a/app/src/main/java/com/approagency/drug/data/dto/DrugModels.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/dto/DrugModels.kt @@ -1,74 +1,74 @@ -package com.approagency.drug.data.dto - -data class DrugModels( - val success: Boolean, - val message: String?, - val data: DrugDetail?, - val meta: Meta? -) - -data class DrugDetail( - val cod: Int?, - val goroh_darmani_detail_cod: Int?, - val goroh_daroei_cod: Int?, - val goroh_farmakologic_cod: Int?, - val goroh_darmani_cod: Int?, - val nam_fa: String?, - val nam_en: String?, - val mavaredmasraf: String?, - val meghdarmasraf: String?, - val masrafdarhamelegi: String?, - val masrafdarshirdehi: String?, - val manemasraf: String?, - val avarez: String?, - val tadakhol: String?, - val mekanismtasir: String?, - val nokte: String?, - val hoshdar: String?, - val sharayetnegahdari: String?, - val ashkal_daroei: String?, - val created_at: String?, - val updated_at: String?, - val goroh_daroei: GorohDaroei?, - val goroh_darmani: GorohDarmani?, - val goroh_darmani_detail: GorohDarmaniDetail? -) - -data class GorohDaroei( - val cod: Int?, - val nam: String?, - val created_at: String?, - val updated_at: String? -) - -data class GorohDarmani( - val cod: Int?, - val nam_fa: String?, - val nam_en: String?, - val giyahi_ya_shimiyaei: String?, - val image: String?, - val created_at: String?, - val updated_at: String? -) - -data class GorohDarmaniDetail( - val cod: Int?, - val nam: String?, - val created_at: String?, - val updated_at: String? -) - -data class Meta( - val current_page: Int?, - val last_page: Int?, - val per_page: Int?, - val total: Int? -) - -// For list response compatibility -data class DrugListResponse( - val success: Boolean, - val message: String?, - val data: List = emptyList(), - val meta: Meta? +package com.approagency.pharmacy.data.dto + +data class DrugModels( + val success: Boolean, + val message: String?, + val data: DrugDetail?, + val meta: Meta? +) + +data class DrugDetail( + val cod: Int?, + val goroh_darmani_detail_cod: Int?, + val goroh_daroei_cod: Int?, + val goroh_farmakologic_cod: Int?, + val goroh_darmani_cod: Int?, + val nam_fa: String?, + val nam_en: String?, + val mavaredmasraf: String?, + val meghdarmasraf: String?, + val masrafdarhamelegi: String?, + val masrafdarshirdehi: String?, + val manemasraf: String?, + val avarez: String?, + val tadakhol: String?, + val mekanismtasir: String?, + val nokte: String?, + val hoshdar: String?, + val sharayetnegahdari: String?, + val ashkal_daroei: String?, + val created_at: String?, + val updated_at: String?, + val goroh_daroei: GorohDaroei?, + val goroh_darmani: GorohDarmani?, + val goroh_darmani_detail: GorohDarmaniDetail? +) + +data class GorohDaroei( + val cod: Int?, + val nam: String?, + val created_at: String?, + val updated_at: String? +) + +data class GorohDarmani( + val cod: Int?, + val nam_fa: String?, + val nam_en: String?, + val giyahi_ya_shimiyaei: String?, + val image: String?, + val created_at: String?, + val updated_at: String? +) + +data class GorohDarmaniDetail( + val cod: Int?, + val nam: String?, + val created_at: String?, + val updated_at: String? +) + +data class Meta( + val current_page: Int?, + val last_page: Int?, + val per_page: Int?, + val total: Int? +) + +// For list response compatibility +data class DrugListResponse( + val success: Boolean, + val message: String?, + val data: List = emptyList(), + val meta: Meta? ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/local/dao/TestGroupDao.kt b/app/src/main/java/com/approagency/pharmacy/data/local/dao/TestGroupDao.kt similarity index 90% rename from app/src/main/java/com/approagency/drug/data/local/dao/TestGroupDao.kt rename to app/src/main/java/com/approagency/pharmacy/data/local/dao/TestGroupDao.kt index 27668c1..3027578 100644 --- a/app/src/main/java/com/approagency/drug/data/local/dao/TestGroupDao.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/local/dao/TestGroupDao.kt @@ -1,46 +1,46 @@ -package com.approagency.drug.data.local.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.approagency.drug.data.local.entities.TestGroupEntity -import kotlinx.coroutines.flow.Flow - -@Dao -interface TestGroupDao { - @Query("SELECT * FROM testGroup ORDER BY Id") - fun getAllGroups(): Flow> - - @Query("SELECT * FROM testGroup WHERE Id = :groupId") - suspend fun getGroupById(groupId: Int): TestGroupEntity? - - @Query("SELECT * FROM testGroup WHERE Isparent = '1'") - fun getParentGroups(): Flow> - - @Query("SELECT * FROM testGroup WHERE Isparent = '0'") - fun getChildGroups(): Flow> - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertGroup(group: TestGroupEntity) - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertAllGroups(groups: List) - - @Query("DELETE FROM testGroup") - suspend fun deleteAllGroups() - - @Query(""" - SELECT * FROM testGroup - WHERE Fname LIKE '%' || :query || '%' - OR Ename LIKE '%' || :query || '%' - OR Detail LIKE '%' || :query || '%' - ORDER BY - CASE - WHEN Fname LIKE '%' || :query || '%' THEN 1 - WHEN Ename LIKE '%' || :query || '%' THEN 2 - ELSE 3 - END - """) - fun searchGroups(query: String): Flow> +package com.approagency.pharmacy.data.local.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.approagency.pharmacy.data.local.entities.TestGroupEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface TestGroupDao { + @Query("SELECT * FROM testGroup ORDER BY Id") + fun getAllGroups(): Flow> + + @Query("SELECT * FROM testGroup WHERE Id = :groupId") + suspend fun getGroupById(groupId: Int): TestGroupEntity? + + @Query("SELECT * FROM testGroup WHERE Isparent = '1'") + fun getParentGroups(): Flow> + + @Query("SELECT * FROM testGroup WHERE Isparent = '0'") + fun getChildGroups(): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertGroup(group: TestGroupEntity) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertAllGroups(groups: List) + + @Query("DELETE FROM testGroup") + suspend fun deleteAllGroups() + + @Query(""" + SELECT * FROM testGroup + WHERE Fname LIKE '%' || :query || '%' + OR Ename LIKE '%' || :query || '%' + OR Detail LIKE '%' || :query || '%' + ORDER BY + CASE + WHEN Fname LIKE '%' || :query || '%' THEN 1 + WHEN Ename LIKE '%' || :query || '%' THEN 2 + ELSE 3 + END + """) + fun searchGroups(query: String): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/local/dao/TestItemDao.kt b/app/src/main/java/com/approagency/pharmacy/data/local/dao/TestItemDao.kt similarity index 90% rename from app/src/main/java/com/approagency/drug/data/local/dao/TestItemDao.kt rename to app/src/main/java/com/approagency/pharmacy/data/local/dao/TestItemDao.kt index 4ff2a1c..dfd794c 100644 --- a/app/src/main/java/com/approagency/drug/data/local/dao/TestItemDao.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/local/dao/TestItemDao.kt @@ -1,46 +1,46 @@ -package com.approagency.drug.data.local.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.approagency.drug.data.local.entities.TestItemEntity -import kotlinx.coroutines.flow.Flow - -@Dao -interface TestItemDao { - @Query("SELECT * FROM testItem ORDER BY Id") - fun getAllItems(): Flow> - - @Query("SELECT * FROM testItem WHERE Group_Id = :groupId ORDER BY Id") - fun getItemsByGroupId(groupId: Int): Flow> - - @Query("SELECT * FROM testItem WHERE Id = :itemId") - suspend fun getItemById(itemId: Int): TestItemEntity? - - @Query(""" - SELECT ti.* FROM testItem ti - LEFT JOIN testGroup tg ON ti.Group_Id = tg.Id - WHERE ti.Title LIKE '%' || :searchQuery || '%' - OR ti.Normal_Value LIKE '%' || :searchQuery || '%' - OR ti.Detail LIKE '%' || :searchQuery || '%' - OR tg.Fname LIKE '%' || :searchQuery || '%' - OR tg.Ename LIKE '%' || :searchQuery || '%' - ORDER BY - CASE - WHEN ti.Title LIKE '%' || :searchQuery || '%' THEN 1 - WHEN tg.Fname LIKE '%' || :searchQuery || '%' THEN 2 - ELSE 3 - END - """) - fun searchTestItems(searchQuery: String): Flow> - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertItem(item: TestItemEntity) - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertAllItems(items: List) - - @Query("DELETE FROM testItem") - suspend fun deleteAllItems() +package com.approagency.pharmacy.data.local.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.approagency.pharmacy.data.local.entities.TestItemEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface TestItemDao { + @Query("SELECT * FROM testItem ORDER BY Id") + fun getAllItems(): Flow> + + @Query("SELECT * FROM testItem WHERE Group_Id = :groupId ORDER BY Id") + fun getItemsByGroupId(groupId: Int): Flow> + + @Query("SELECT * FROM testItem WHERE Id = :itemId") + suspend fun getItemById(itemId: Int): TestItemEntity? + + @Query(""" + SELECT ti.* FROM testItem ti + LEFT JOIN testGroup tg ON ti.Group_Id = tg.Id + WHERE ti.Title LIKE '%' || :searchQuery || '%' + OR ti.Normal_Value LIKE '%' || :searchQuery || '%' + OR ti.Detail LIKE '%' || :searchQuery || '%' + OR tg.Fname LIKE '%' || :searchQuery || '%' + OR tg.Ename LIKE '%' || :searchQuery || '%' + ORDER BY + CASE + WHEN ti.Title LIKE '%' || :searchQuery || '%' THEN 1 + WHEN tg.Fname LIKE '%' || :searchQuery || '%' THEN 2 + ELSE 3 + END + """) + fun searchTestItems(searchQuery: String): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertItem(item: TestItemEntity) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertAllItems(items: List) + + @Query("DELETE FROM testItem") + suspend fun deleteAllItems() } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/local/database/LabDatabase.kt b/app/src/main/java/com/approagency/pharmacy/data/local/database/LabDatabase.kt similarity index 77% rename from app/src/main/java/com/approagency/drug/data/local/database/LabDatabase.kt rename to app/src/main/java/com/approagency/pharmacy/data/local/database/LabDatabase.kt index 2a35fcd..ab9f72d 100644 --- a/app/src/main/java/com/approagency/drug/data/local/database/LabDatabase.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/local/database/LabDatabase.kt @@ -1,43 +1,43 @@ -package com.approagency.drug.data.local.database - -import android.content.Context -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase -import com.approagency.drug.data.local.dao.TestGroupDao -import com.approagency.drug.data.local.dao.TestItemDao -import com.approagency.drug.data.local.entities.TestGroupEntity -import com.approagency.drug.data.local.entities.TestItemEntity - -@Database( - entities = [ - TestGroupEntity::class, - TestItemEntity::class - ], - version = 1, - exportSchema = false -) -abstract class LabDatabase : RoomDatabase() { - abstract fun testGroupDao(): TestGroupDao - abstract fun testItemDao(): TestItemDao - - companion object { - @Volatile - private var INSTANCE: LabDatabase? = null - - fun getInstance(context: Context): LabDatabase { - return INSTANCE ?: synchronized(this) { - val instance = Room.databaseBuilder( - context.applicationContext, - LabDatabase::class.java, - "lab_tests.db" // This will use your existing database - ) - .createFromAsset("lab_tests.db") // IMPORTANT: Copy from assets - .fallbackToDestructiveMigration() // For development only - .build() - INSTANCE = instance - instance - } - } - } +package com.approagency.pharmacy.data.local.database + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.approagency.pharmacy.data.local.dao.TestGroupDao +import com.approagency.pharmacy.data.local.dao.TestItemDao +import com.approagency.pharmacy.data.local.entities.TestGroupEntity +import com.approagency.pharmacy.data.local.entities.TestItemEntity + +@Database( + entities = [ + TestGroupEntity::class, + TestItemEntity::class + ], + version = 1, + exportSchema = false +) +abstract class LabDatabase : RoomDatabase() { + abstract fun testGroupDao(): TestGroupDao + abstract fun testItemDao(): TestItemDao + + companion object { + @Volatile + private var INSTANCE: LabDatabase? = null + + fun getInstance(context: Context): LabDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + LabDatabase::class.java, + "lab_tests.db" // This will use your existing database + ) + .createFromAsset("lab_tests.db") // IMPORTANT: Copy from assets + .fallbackToDestructiveMigration() // For development only + .build() + INSTANCE = instance + instance + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/local/entities/TestGroupEntity.kt b/app/src/main/java/com/approagency/pharmacy/data/local/entities/TestGroupEntity.kt similarity index 86% rename from app/src/main/java/com/approagency/drug/data/local/entities/TestGroupEntity.kt rename to app/src/main/java/com/approagency/pharmacy/data/local/entities/TestGroupEntity.kt index e69c90b..395e665 100644 --- a/app/src/main/java/com/approagency/drug/data/local/entities/TestGroupEntity.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/local/entities/TestGroupEntity.kt @@ -1,24 +1,24 @@ -package com.approagency.drug.data.local.entities - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity(tableName = "testGroup") -data class TestGroupEntity( - @PrimaryKey - @ColumnInfo(name = "Id") - val id: Int, - - @ColumnInfo(name = "Ename") - val ename: String?, - - @ColumnInfo(name = "Fname") - val fname: String?, - - @ColumnInfo(name = "Detail") - val detail: String?, - - @ColumnInfo(name = "Isparent") - val isParent: String? +package com.approagency.pharmacy.data.local.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "testGroup") +data class TestGroupEntity( + @PrimaryKey + @ColumnInfo(name = "Id") + val id: Int, + + @ColumnInfo(name = "Ename") + val ename: String?, + + @ColumnInfo(name = "Fname") + val fname: String?, + + @ColumnInfo(name = "Detail") + val detail: String?, + + @ColumnInfo(name = "Isparent") + val isParent: String? ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/local/entities/TestItemEntity.kt b/app/src/main/java/com/approagency/pharmacy/data/local/entities/TestItemEntity.kt similarity index 86% rename from app/src/main/java/com/approagency/drug/data/local/entities/TestItemEntity.kt rename to app/src/main/java/com/approagency/pharmacy/data/local/entities/TestItemEntity.kt index c6490b0..275569e 100644 --- a/app/src/main/java/com/approagency/drug/data/local/entities/TestItemEntity.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/local/entities/TestItemEntity.kt @@ -1,37 +1,36 @@ -package com.approagency.drug.data.local.entities - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.Index -import androidx.room.PrimaryKey - -@Entity( - tableName = "testItem", -// foreignKeys = [ -// ForeignKey( -// entity = TestGroupEntity::class, -// parentColumns = ["Id"], -// childColumns = ["Group_Id"], -// onDelete = ForeignKey.CASCADE -// ) -// ], - indices = [Index(value = ["Group_Id"])] -) -data class TestItemEntity( - @PrimaryKey - @ColumnInfo(name = "Id") - val id: Int, - - @ColumnInfo(name = "Group_Id") - val groupId: Int, - - @ColumnInfo(name = "Title") - val title: String?, - - @ColumnInfo(name = "Normal_Value") - val normalValue: String?, - - @ColumnInfo(name = "Detail") - val detail: String? +package com.approagency.pharmacy.data.local.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity( + tableName = "testItem", +// foreignKeys = [ +// ForeignKey( +// entity = TestGroupEntity::class, +// parentColumns = ["Id"], +// childColumns = ["Group_Id"], +// onDelete = ForeignKey.CASCADE +// ) +// ], + indices = [Index(value = ["Group_Id"])] +) +data class TestItemEntity( + @PrimaryKey + @ColumnInfo(name = "Id") + val id: Int, + + @ColumnInfo(name = "Group_Id") + val groupId: Int, + + @ColumnInfo(name = "Title") + val title: String?, + + @ColumnInfo(name = "Normal_Value") + val normalValue: String?, + + @ColumnInfo(name = "Detail") + val detail: String? ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/remote/DarooyabApiService.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/DarooyabApiService.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/data/remote/DarooyabApiService.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/DarooyabApiService.kt index 892ea91..d8316a5 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/DarooyabApiService.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/DarooyabApiService.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.data.remote +package com.approagency.pharmacy.data.remote import retrofit2.http.Field import retrofit2.http.FormUrlEncoded @@ -6,7 +6,6 @@ import retrofit2.http.GET import retrofit2.http.Headers import retrofit2.http.POST import retrofit2.http.Path -import retrofit2.http.Query import retrofit2.http.Url interface DarooyabApiService { diff --git a/app/src/main/java/com/approagency/drug/data/remote/DrugApiService.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugApiService.kt similarity index 70% rename from app/src/main/java/com/approagency/drug/data/remote/DrugApiService.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/DrugApiService.kt index c61a8a1..7cea760 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/DrugApiService.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugApiService.kt @@ -1,31 +1,30 @@ -package com.approagency.drug.data.remote - -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.data.dto.DrugModels -import retrofit2.http.GET -import retrofit2.http.Headers -import retrofit2.http.Path -import retrofit2.http.Query - -interface DrugApiService { - @GET("drugs/search") - suspend fun getDrugs( - @Query("q")query: String?, - @Query("per_page")perPage:Int? = 20, - @Query("with_relations")withRelations: Boolean? =true, - @Query("goroh_daroei_cod")drugGroup:Int?, - @Query("goroh_darmani_cod")healGroup:Int?, - ): DrugListResponse - - - @GET("drugs/{cod}") - suspend fun getDrugDetail( - @Path("cod") cod: Int - ): DrugModels - - - @GET("drugs/goroh-darmani") - suspend fun getGorohDaroei(): DarmanModel - +package com.approagency.pharmacy.data.remote + +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.data.dto.DrugModels +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Query + +interface DrugApiService { + @GET("drugs/search") + suspend fun getDrugs( + @Query("q")query: String?, + @Query("per_page")perPage:Int? = 20, + @Query("with_relations")withRelations: Boolean? =true, + @Query("goroh_daroei_cod")drugGroup:Int?, + @Query("goroh_darmani_cod")healGroup:Int?, + ): DrugListResponse + + + @GET("drugs/{cod}") + suspend fun getDrugDetail( + @Path("cod") cod: Int + ): DrugModels + + + @GET("drugs/goroh-darmani") + suspend fun getGorohDaroei(): DarmanModel + } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/remote/DrugDetailParser.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugDetailParser.kt similarity index 99% rename from app/src/main/java/com/approagency/drug/data/remote/DrugDetailParser.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/DrugDetailParser.kt index 20f3c00..8636c68 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/DrugDetailParser.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugDetailParser.kt @@ -1,10 +1,9 @@ -package com.approagency.drug.data.remote +package com.approagency.pharmacy.data.remote -import com.approagency.drug.domain.model.* +import com.approagency.pharmacy.domain.model.* import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element -import org.jsoup.select.Evaluator class DrugDetailParser { diff --git a/app/src/main/java/com/approagency/drug/data/remote/DrugHtmlParser.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugHtmlParser.kt similarity index 95% rename from app/src/main/java/com/approagency/drug/data/remote/DrugHtmlParser.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/DrugHtmlParser.kt index bcf4023..94bc4cf 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/DrugHtmlParser.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/DrugHtmlParser.kt @@ -1,7 +1,7 @@ -package com.approagency.drug.data.remote +package com.approagency.pharmacy.data.remote -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugSearchResult +import com.approagency.pharmacy.domain.model.DaroYabSearchResult +import com.approagency.pharmacy.domain.model.DrugSearchResult import org.jsoup.Jsoup import org.jsoup.nodes.Document diff --git a/app/src/main/java/com/approagency/drug/data/remote/PharmacyHtmlParser.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/PharmacyHtmlParser.kt similarity index 97% rename from app/src/main/java/com/approagency/drug/data/remote/PharmacyHtmlParser.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/PharmacyHtmlParser.kt index 906146a..b2c4319 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/PharmacyHtmlParser.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/PharmacyHtmlParser.kt @@ -1,8 +1,8 @@ // data/remote/PharmacyHtmlParser.kt -package com.approagency.drug.data.remote +package com.approagency.pharmacy.data.remote -import com.approagency.drug.domain.model.PharmacyDetail -import com.approagency.drug.domain.model.PharmacyItem +import com.approagency.pharmacy.domain.model.PharmacyDetail +import com.approagency.pharmacy.domain.model.PharmacyItem import org.jsoup.Jsoup object PharmacyHtmlParser { diff --git a/app/src/main/java/com/approagency/drug/data/remote/StringConverterFactory.kt b/app/src/main/java/com/approagency/pharmacy/data/remote/StringConverterFactory.kt similarity index 91% rename from app/src/main/java/com/approagency/drug/data/remote/StringConverterFactory.kt rename to app/src/main/java/com/approagency/pharmacy/data/remote/StringConverterFactory.kt index a39dc48..8d0b82c 100644 --- a/app/src/main/java/com/approagency/drug/data/remote/StringConverterFactory.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/remote/StringConverterFactory.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.data.remote +package com.approagency.pharmacy.data.remote import okhttp3.ResponseBody import retrofit2.Converter diff --git a/app/src/main/java/com/approagency/drug/data/repository/DrugRepositoryImpl.kt b/app/src/main/java/com/approagency/pharmacy/data/repository/DrugRepositoryImpl.kt similarity index 78% rename from app/src/main/java/com/approagency/drug/data/repository/DrugRepositoryImpl.kt rename to app/src/main/java/com/approagency/pharmacy/data/repository/DrugRepositoryImpl.kt index a6866fa..096088e 100644 --- a/app/src/main/java/com/approagency/drug/data/repository/DrugRepositoryImpl.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/repository/DrugRepositoryImpl.kt @@ -1,125 +1,124 @@ -package com.approagency.drug.data.repository - -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.data.remote.DarooyabApiService -import com.approagency.drug.data.remote.DrugApiService -import com.approagency.drug.data.remote.DrugDetailParser -import com.approagency.drug.data.remote.DrugHtmlParser -import com.approagency.drug.data.remote.PharmacyHtmlParser -import com.approagency.drug.domain.model.DaroYabParams -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.domain.model.PharmacyDetail -import com.approagency.drug.domain.model.PharmacyItem -import com.approagency.drug.domain.repository.DrugRepository -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import java.io.IOException - -class DrugRepositoryImpl( - private val apiService: DrugApiService, - private val darooyabApiService: DarooyabApiService, - private val parser: DrugHtmlParser, - private val detailParser: DrugDetailParser, -): DrugRepository { - override suspend fun searchDrug(params: DrugSearchParams): Result { - return try { - val response = apiService.getDrugs(query = params.query , perPage = params.perPage , withRelations = params.withRelations , healGroup = params.healGroup , drugGroup = params.drugGroup ) - return Result.success(response) - }catch (e: Exception){ - Result.failure(e) - } - } - - override suspend fun drugDetail(cod: Int): Result { - return try { - val response= apiService.getDrugDetail(cod = cod) - println(response.message) - return Result.success(response) - }catch (e: Exception){ - println(e.message) - Result.failure(e) - } - } - - override suspend fun getGorohDaroei(): Result { - return try { - val response = apiService.getGorohDaroei() - println(response) - return Result.success(response) - }catch (e: Exception){ - Result.failure(e) - } - } - - override suspend fun searchDrugs(params: DaroYabParams): Result { - return withContext(Dispatchers.IO) { - try { - val htmlResponse = darooyabApiService.searchDrugs( - searchText = params.query ?: "", - pageNumber = params.pageNumber - ) - - println("HTML Response length: ${htmlResponse.length}") - - val searchResult = parser.parseSearchResultsWithPagination(htmlResponse) - - if (searchResult.drugs.isNotEmpty()) { - Result.success(searchResult) - } else { - Result.failure(Exception("No drugs found for query: '${params.query}'")) - } - } catch (e: IOException) { - Result.failure(Exception("Network error: ${e.message}", e)) - } catch (e: Exception) { - Result.failure(Exception("An error occurred: ${e.message}", e)) - } - } - } - - override suspend fun getDrugDetailFromYab(detailUrl: String): Result { - return withContext(Dispatchers.IO) { - try { - val html = darooyabApiService.getDrugDetail(detailUrl) - val detail = detailParser.parseDrugDetail(html) - Result.success(detail) - } catch (e: Exception) { - Result.failure(e) - } - } - } - - override suspend fun searchPharmacies( - genericDrugId: String, - provId: String - ): List { - return withContext(Dispatchers.IO) { - try { - val html = darooyabApiService.getPharmacies( - brandIrc = "0", - genericDrugId = genericDrugId, - provId = provId, - cityId = "0" - ) - PharmacyHtmlParser.parse(html) - } catch (e: Exception) { - emptyList() - } - } - } - - override suspend fun getPharmacyDetail(pharmacyUrl: String): PharmacyDetail { - return withContext(Dispatchers.IO) { - try { - val html = darooyabApiService.getPharmacyDetail(pharmacyUrl) - PharmacyHtmlParser.parsePharmacyDetail(html) - } catch (e: Exception) { - PharmacyDetail("", "", "") - } - } - } +package com.approagency.pharmacy.data.repository + +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.data.dto.DrugModels +import com.approagency.pharmacy.data.remote.DarooyabApiService +import com.approagency.pharmacy.data.remote.DrugApiService +import com.approagency.pharmacy.data.remote.DrugDetailParser +import com.approagency.pharmacy.data.remote.DrugHtmlParser +import com.approagency.pharmacy.data.remote.PharmacyHtmlParser +import com.approagency.pharmacy.domain.model.DaroYabParams +import com.approagency.pharmacy.domain.model.DaroYabSearchResult +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.domain.model.DrugSearchParams +import com.approagency.pharmacy.domain.model.PharmacyDetail +import com.approagency.pharmacy.domain.model.PharmacyItem +import com.approagency.pharmacy.domain.repository.DrugRepository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.IOException + +class DrugRepositoryImpl( + private val apiService: DrugApiService, + private val darooyabApiService: DarooyabApiService, + private val parser: DrugHtmlParser, + private val detailParser: DrugDetailParser, +): DrugRepository { + override suspend fun searchDrug(params: DrugSearchParams): Result { + return try { + val response = apiService.getDrugs(query = params.query , perPage = params.perPage , withRelations = params.withRelations , healGroup = params.healGroup , drugGroup = params.drugGroup ) + return Result.success(response) + }catch (e: Exception){ + Result.failure(e) + } + } + + override suspend fun drugDetail(cod: Int): Result { + return try { + val response= apiService.getDrugDetail(cod = cod) + println(response.message) + return Result.success(response) + }catch (e: Exception){ + println(e.message) + Result.failure(e) + } + } + + override suspend fun getGorohDaroei(): Result { + return try { + val response = apiService.getGorohDaroei() + println(response) + return Result.success(response) + }catch (e: Exception){ + Result.failure(e) + } + } + + override suspend fun searchDrugs(params: DaroYabParams): Result { + return withContext(Dispatchers.IO) { + try { + val htmlResponse = darooyabApiService.searchDrugs( + searchText = params.query ?: "", + pageNumber = params.pageNumber + ) + + println("HTML Response length: ${htmlResponse.length}") + + val searchResult = parser.parseSearchResultsWithPagination(htmlResponse) + + if (searchResult.drugs.isNotEmpty()) { + Result.success(searchResult) + } else { + Result.failure(Exception("No drugs found for query: '${params.query}'")) + } + } catch (e: IOException) { + Result.failure(Exception("Network error: ${e.message}", e)) + } catch (e: Exception) { + Result.failure(Exception("An error occurred: ${e.message}", e)) + } + } + } + + override suspend fun getDrugDetailFromYab(detailUrl: String): Result { + return withContext(Dispatchers.IO) { + try { + val html = darooyabApiService.getDrugDetail(detailUrl) + val detail = detailParser.parseDrugDetail(html) + Result.success(detail) + } catch (e: Exception) { + Result.failure(e) + } + } + } + + override suspend fun searchPharmacies( + genericDrugId: String, + provId: String + ): List { + return withContext(Dispatchers.IO) { + try { + val html = darooyabApiService.getPharmacies( + brandIrc = "0", + genericDrugId = genericDrugId, + provId = provId, + cityId = "0" + ) + PharmacyHtmlParser.parse(html) + } catch (e: Exception) { + emptyList() + } + } + } + + override suspend fun getPharmacyDetail(pharmacyUrl: String): PharmacyDetail { + return withContext(Dispatchers.IO) { + try { + val html = darooyabApiService.getPharmacyDetail(pharmacyUrl) + PharmacyHtmlParser.parsePharmacyDetail(html) + } catch (e: Exception) { + PharmacyDetail("", "", "") + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/data/repository/LabRepositoryImpl.kt b/app/src/main/java/com/approagency/pharmacy/data/repository/LabRepositoryImpl.kt similarity index 80% rename from app/src/main/java/com/approagency/drug/data/repository/LabRepositoryImpl.kt rename to app/src/main/java/com/approagency/pharmacy/data/repository/LabRepositoryImpl.kt index ad775d1..ce0cccd 100644 --- a/app/src/main/java/com/approagency/drug/data/repository/LabRepositoryImpl.kt +++ b/app/src/main/java/com/approagency/pharmacy/data/repository/LabRepositoryImpl.kt @@ -1,35 +1,35 @@ -package com.approagency.drug.data.repository - -import com.approagency.drug.data.local.dao.TestGroupDao -import com.approagency.drug.data.local.dao.TestItemDao -import com.approagency.drug.data.local.entities.TestGroupEntity -import com.approagency.drug.data.local.entities.TestItemEntity -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.combine - -class LabRepositoryImpl ( - private val testGroupDao: TestGroupDao, - private val testItemDao: TestItemDao -) { - // Test Group Operations - fun getAllGroups(): Flow> = testGroupDao.getAllGroups() - fun getParentGroups(): Flow> = testGroupDao.getParentGroups() - fun getChildGroups(): Flow> = testGroupDao.getChildGroups() - suspend fun getGroupById(groupId: Int): TestGroupEntity? = testGroupDao.getGroupById(groupId) - - // Test Item Operations - fun getAllItems(): Flow> = testItemDao.getAllItems() - fun getItemsByGroupId(groupId: Int): Flow> = testItemDao.getItemsByGroupId(groupId) - suspend fun getItemById(itemId: Int): TestItemEntity? = testItemDao.getItemById(itemId) - fun searchTestItems(query: String): Flow> = testItemDao.searchTestItems(query) - - - fun searchGroupsAndItems(searchQuery: String): Flow, List>> { - return combine( - testGroupDao.searchGroups(searchQuery), - testItemDao.searchTestItems(searchQuery) - ) { groups, items -> - Pair(groups, items) - } - } +package com.approagency.pharmacy.data.repository + +import com.approagency.pharmacy.data.local.dao.TestGroupDao +import com.approagency.pharmacy.data.local.dao.TestItemDao +import com.approagency.pharmacy.data.local.entities.TestGroupEntity +import com.approagency.pharmacy.data.local.entities.TestItemEntity +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine + +class LabRepositoryImpl ( + private val testGroupDao: TestGroupDao, + private val testItemDao: TestItemDao +) { + // Test Group Operations + fun getAllGroups(): Flow> = testGroupDao.getAllGroups() + fun getParentGroups(): Flow> = testGroupDao.getParentGroups() + fun getChildGroups(): Flow> = testGroupDao.getChildGroups() + suspend fun getGroupById(groupId: Int): TestGroupEntity? = testGroupDao.getGroupById(groupId) + + // Test Item Operations + fun getAllItems(): Flow> = testItemDao.getAllItems() + fun getItemsByGroupId(groupId: Int): Flow> = testItemDao.getItemsByGroupId(groupId) + suspend fun getItemById(itemId: Int): TestItemEntity? = testItemDao.getItemById(itemId) + fun searchTestItems(query: String): Flow> = testItemDao.searchTestItems(query) + + + fun searchGroupsAndItems(searchQuery: String): Flow, List>> { + return combine( + testGroupDao.searchGroups(searchQuery), + testItemDao.searchTestItems(searchQuery) + ) { groups, items -> + Pair(groups, items) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/di/AppModule.kt b/app/src/main/java/com/approagency/pharmacy/di/AppModule.kt similarity index 68% rename from app/src/main/java/com/approagency/drug/di/AppModule.kt rename to app/src/main/java/com/approagency/pharmacy/di/AppModule.kt index 70b36b8..ecc7d49 100644 --- a/app/src/main/java/com/approagency/drug/di/AppModule.kt +++ b/app/src/main/java/com/approagency/pharmacy/di/AppModule.kt @@ -1,163 +1,162 @@ -package com.approagency.drug.di - - -import android.app.Application -import com.approagency.drug.data.local.database.LabDatabase -import com.approagency.drug.data.remote.DarooyabApiService -import com.approagency.drug.data.remote.DrugApiService -import com.approagency.drug.data.remote.DrugDetailParser -import com.approagency.drug.data.remote.DrugHtmlParser -import com.approagency.drug.data.repository.DrugRepositoryImpl -import com.approagency.drug.data.repository.LabRepositoryImpl -import com.approagency.drug.domain.repository.DrugRepository -import com.approagency.drug.domain.usecase.DrugDetailYabUseCase -import com.approagency.drug.domain.usecase.GetDarmanUseCase -import com.approagency.drug.domain.usecase.GetDrugDetailUseCase -import com.approagency.drug.domain.usecase.GetDrugSearchUseCase -import com.approagency.drug.domain.usecase.GetPharmaciesUseCase -import com.approagency.drug.domain.usecase.GetPharmacyDetailUseCase -import com.approagency.drug.domain.usecase.GetTestGroupUseCase -import com.approagency.drug.domain.usecase.GetTestItemByGroupId -import com.approagency.drug.domain.usecase.SearchDrugsYabUseCase -import com.approagency.drug.domain.usecase.SearchTestsUseCase -import com.approagency.drug.presentation.viewModel.DrugDetailViewModel -import com.approagency.drug.presentation.viewModel.HomeViewModel -import com.approagency.drug.presentation.viewModel.LabViewModel -import com.approagency.drug.presentation.viewModel.PharmacyViewModel -import com.approagency.drug.utils.Config -import com.approgency.drug.presentation.viewModel.SearchViewModel -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import org.koin.android.ext.koin.androidContext -import org.koin.core.module.dsl.viewModel -import org.koin.core.qualifier.qualifier -import org.koin.dsl.module -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.converter.scalars.ScalarsConverterFactory -import java.net.CookieManager -import java.net.CookiePolicy -import java.util.concurrent.TimeUnit -val jsonRetrofitQualifier = qualifier("jsonRetrofit") -val scalarRetrofitQualifier = qualifier("scalarRetrofit") -val appModule= module { - - single { LabDatabase.getInstance(androidContext()) } - - single { get().testGroupDao() } - single { get().testItemDao() } - - // Shared OkHttpClient for both APIs - single { - val cookieManager = CookieManager() - cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL) - - OkHttpClient.Builder() - .addInterceptor(HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.BODY // Change to BODY for debugging - }) - // Add cookie support - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(30, TimeUnit.SECONDS) - .followRedirects(true) - .build() - } - - single(jsonRetrofitQualifier) { // Add qualifier - Retrofit.Builder() - .baseUrl(Config.BASE_URL) - .client(get()) - .addConverterFactory(GsonConverterFactory.create()) - .build() - } - - single { - val retrofit: Retrofit = get(jsonRetrofitQualifier) // Get qualified instance - retrofit.create(DrugApiService::class.java) - } - - // ========== Retrofit for DAROOYAB Website ========== - single(scalarRetrofitQualifier) { // Add qualifier - Retrofit.Builder() - .baseUrl(Config.Darro_Url) - .client(get()) - .addConverterFactory(ScalarsConverterFactory.create()) - .build() - } - - single { - val retrofit: Retrofit = get(scalarRetrofitQualifier) // Get qualified instance - retrofit.create(DarooyabApiService::class.java) - } - - - factory { DrugHtmlParser() } - factory { DrugDetailParser() } - //repo - single { - DrugRepositoryImpl(get() , get() , get() , get()) - } - - - - //UseCase - single { - GetDrugSearchUseCase(get()) - - } - - single { - SearchDrugsYabUseCase(get()) - } - - single{ - GetDrugDetailUseCase(get()) - } - - single { - GetDarmanUseCase(get()) - } - - single { - GetTestGroupUseCase(get()) - } - - single { - GetPharmaciesUseCase(get()) - } - - single { - GetTestItemByGroupId(get()) - } - - single { LabRepositoryImpl(get(), get()) } - - single { - DrugDetailYabUseCase(get()) - } - - single { - GetPharmacyDetailUseCase(get()) - } - - viewModel { - DrugDetailViewModel(get()) - } - - single { SearchTestsUseCase(get()) } - //view model - viewModel { - HomeViewModel(get() , get() , get()) - } - - viewModel { - SearchViewModel(get()) - } - viewModel { - PharmacyViewModel(get() , get ()) - } - - viewModel { - LabViewModel(get() , get() , get()) - } +package com.approagency.pharmacy.di + + +import com.approagency.pharmacy.data.local.database.LabDatabase +import com.approagency.pharmacy.data.remote.DarooyabApiService +import com.approagency.pharmacy.data.remote.DrugApiService +import com.approagency.pharmacy.data.remote.DrugDetailParser +import com.approagency.pharmacy.data.remote.DrugHtmlParser +import com.approagency.pharmacy.data.repository.DrugRepositoryImpl +import com.approagency.pharmacy.data.repository.LabRepositoryImpl +import com.approagency.pharmacy.domain.repository.DrugRepository +import com.approagency.pharmacy.domain.usecase.DrugDetailYabUseCase +import com.approagency.pharmacy.domain.usecase.GetDarmanUseCase +import com.approagency.pharmacy.domain.usecase.GetDrugDetailUseCase +import com.approagency.pharmacy.domain.usecase.GetDrugSearchUseCase +import com.approagency.pharmacy.domain.usecase.GetPharmaciesUseCase +import com.approagency.pharmacy.domain.usecase.GetPharmacyDetailUseCase +import com.approagency.pharmacy.domain.usecase.GetTestGroupUseCase +import com.approagency.pharmacy.domain.usecase.GetTestItemByGroupId +import com.approagency.pharmacy.domain.usecase.SearchDrugsYabUseCase +import com.approagency.pharmacy.domain.usecase.SearchTestsUseCase +import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel +import com.approagency.pharmacy.presentation.viewModel.HomeViewModel +import com.approagency.pharmacy.presentation.viewModel.LabViewModel +import com.approagency.pharmacy.presentation.viewModel.PharmacyViewModel +import com.approagency.pharmacy.utils.Config +import com.approgency.drug.presentation.viewModel.SearchViewModel +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.viewModel +import org.koin.core.qualifier.qualifier +import org.koin.dsl.module +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.scalars.ScalarsConverterFactory +import java.net.CookieManager +import java.net.CookiePolicy +import java.util.concurrent.TimeUnit +val jsonRetrofitQualifier = qualifier("jsonRetrofit") +val scalarRetrofitQualifier = qualifier("scalarRetrofit") +val appModule= module { + + single { LabDatabase.getInstance(androidContext()) } + + single { get().testGroupDao() } + single { get().testItemDao() } + + // Shared OkHttpClient for both APIs + single { + val cookieManager = CookieManager() + cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL) + + OkHttpClient.Builder() + .addInterceptor(HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY // Change to BODY for debugging + }) + // Add cookie support + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .followRedirects(true) + .build() + } + + single(jsonRetrofitQualifier) { // Add qualifier + Retrofit.Builder() + .baseUrl(Config.BASE_URL) + .client(get()) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + single { + val retrofit: Retrofit = get(jsonRetrofitQualifier) // Get qualified instance + retrofit.create(DrugApiService::class.java) + } + + // ========== Retrofit for DAROOYAB Website ========== + single(scalarRetrofitQualifier) { // Add qualifier + Retrofit.Builder() + .baseUrl(Config.Darro_Url) + .client(get()) + .addConverterFactory(ScalarsConverterFactory.create()) + .build() + } + + single { + val retrofit: Retrofit = get(scalarRetrofitQualifier) // Get qualified instance + retrofit.create(DarooyabApiService::class.java) + } + + + factory { DrugHtmlParser() } + factory { DrugDetailParser() } + //repo + single { + DrugRepositoryImpl(get() , get() , get() , get()) + } + + + + //UseCase + single { + GetDrugSearchUseCase(get()) + + } + + single { + SearchDrugsYabUseCase(get()) + } + + single{ + GetDrugDetailUseCase(get()) + } + + single { + GetDarmanUseCase(get()) + } + + single { + GetTestGroupUseCase(get()) + } + + single { + GetPharmaciesUseCase(get()) + } + + single { + GetTestItemByGroupId(get()) + } + + single { LabRepositoryImpl(get(), get()) } + + single { + DrugDetailYabUseCase(get()) + } + + single { + GetPharmacyDetailUseCase(get()) + } + + viewModel { + DrugDetailViewModel(get()) + } + + single { SearchTestsUseCase(get()) } + //view model + viewModel { + HomeViewModel(get() , get() , get()) + } + + viewModel { + SearchViewModel(get()) + } + viewModel { + PharmacyViewModel(get() , get ()) + } + + viewModel { + LabViewModel(get() , get() , get()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/model/DaroYabParams.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabParams.kt similarity index 65% rename from app/src/main/java/com/approagency/drug/domain/model/DaroYabParams.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabParams.kt index e8ca8ef..c571500 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/DaroYabParams.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabParams.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.domain.model +package com.approagency.pharmacy.domain.model data class DaroYabParams( val query: String? = null, diff --git a/app/src/main/java/com/approagency/drug/domain/model/DaroYabSearchResult.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabSearchResult.kt similarity index 79% rename from app/src/main/java/com/approagency/drug/domain/model/DaroYabSearchResult.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabSearchResult.kt index 1684a5a..85f129b 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/DaroYabSearchResult.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/DaroYabSearchResult.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.domain.model +package com.approagency.pharmacy.domain.model data class DaroYabSearchResult( val drugs: List, diff --git a/app/src/main/java/com/approagency/drug/domain/model/DrugDetail.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugDetail.kt similarity index 97% rename from app/src/main/java/com/approagency/drug/domain/model/DrugDetail.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/DrugDetail.kt index ae296f6..f423097 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/DrugDetail.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugDetail.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.domain.model +package com.approagency.pharmacy.domain.model data class DrugDetail( val genericId: String, diff --git a/app/src/main/java/com/approagency/drug/domain/model/DrugSearchParams.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchParams.kt similarity index 78% rename from app/src/main/java/com/approagency/drug/domain/model/DrugSearchParams.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchParams.kt index 2d4c109..f9b3d09 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/DrugSearchParams.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchParams.kt @@ -1,10 +1,10 @@ -package com.approagency.drug.domain.model - -data class DrugSearchParams( - val query: String? = null, - val perPage: Int = 20, - val withRelations: Boolean = true, - val drugGroup: Int? = null, - val healGroup: Int? = null, - -) +package com.approagency.pharmacy.domain.model + +data class DrugSearchParams( + val query: String? = null, + val perPage: Int = 20, + val withRelations: Boolean = true, + val drugGroup: Int? = null, + val healGroup: Int? = null, + +) diff --git a/app/src/main/java/com/approagency/drug/domain/model/DrugSearchResult.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchResult.kt similarity index 87% rename from app/src/main/java/com/approagency/drug/domain/model/DrugSearchResult.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchResult.kt index dbf4ee5..7e086fe 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/DrugSearchResult.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/DrugSearchResult.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.domain.model +package com.approagency.pharmacy.domain.model data class DrugSearchResult( val genericId: String, // e.g., "2556" from "/G-2556/Casanthranol" diff --git a/app/src/main/java/com/approagency/drug/domain/model/PharmacyModels.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/PharmacyModels.kt similarity index 95% rename from app/src/main/java/com/approagency/drug/domain/model/PharmacyModels.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/PharmacyModels.kt index 5c87107..65f8601 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/PharmacyModels.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/PharmacyModels.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.domain.model +package com.approagency.pharmacy.domain.model data class PharmacySearchRequest( val brandIrc: String = "0", // برای صفحات برند diff --git a/app/src/main/java/com/approagency/drug/domain/model/TestGroup.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/TestGroup.kt similarity index 73% rename from app/src/main/java/com/approagency/drug/domain/model/TestGroup.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/TestGroup.kt index 94d0362..d9f6eb1 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/TestGroup.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/TestGroup.kt @@ -1,22 +1,22 @@ -package com.approagency.drug.domain.model - -import com.approagency.drug.data.local.entities.TestGroupEntity - -data class TestGroup( - val id: Int, - val ename: String?, - val fname: String?, - val detail: String?, - val isParent: String?, -) - - -fun TestGroupEntity.toTestGroup(): TestGroup { - return TestGroup( - id = this.id, - ename = this.ename, - fname = this.fname, - detail = this.detail, - isParent = this.isParent - ) +package com.approagency.pharmacy.domain.model + +import com.approagency.pharmacy.data.local.entities.TestGroupEntity + +data class TestGroup( + val id: Int, + val ename: String?, + val fname: String?, + val detail: String?, + val isParent: String?, +) + + +fun TestGroupEntity.toTestGroup(): TestGroup { + return TestGroup( + id = this.id, + ename = this.ename, + fname = this.fname, + detail = this.detail, + isParent = this.isParent + ) } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/model/TestItem.kt b/app/src/main/java/com/approagency/pharmacy/domain/model/TestItem.kt similarity index 74% rename from app/src/main/java/com/approagency/drug/domain/model/TestItem.kt rename to app/src/main/java/com/approagency/pharmacy/domain/model/TestItem.kt index 5033582..24aad0a 100644 --- a/app/src/main/java/com/approagency/drug/domain/model/TestItem.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/model/TestItem.kt @@ -1,20 +1,20 @@ -package com.approagency.drug.domain.model - -import com.approagency.drug.data.local.entities.TestItemEntity - -data class TestItem( - val id: Int, - val groupId: Int, - val title: String?, - val normalValue: String?, - val detail: String? -) -fun TestItemEntity.toTestItem(): TestItem { - return TestItem( - id = this.id, - groupId = this.groupId, - title = this.title, - normalValue = this.normalValue, - detail = this.detail - ) +package com.approagency.pharmacy.domain.model + +import com.approagency.pharmacy.data.local.entities.TestItemEntity + +data class TestItem( + val id: Int, + val groupId: Int, + val title: String?, + val normalValue: String?, + val detail: String? +) +fun TestItemEntity.toTestItem(): TestItem { + return TestItem( + id = this.id, + groupId = this.groupId, + title = this.title, + normalValue = this.normalValue, + detail = this.detail + ) } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/pharmacy/domain/repository/DrugRepository.kt b/app/src/main/java/com/approagency/pharmacy/domain/repository/DrugRepository.kt new file mode 100644 index 0000000..35d5f4a --- /dev/null +++ b/app/src/main/java/com/approagency/pharmacy/domain/repository/DrugRepository.kt @@ -0,0 +1,23 @@ +package com.approagency.pharmacy.domain.repository + +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.data.dto.DrugModels +import com.approagency.pharmacy.domain.model.DaroYabParams +import com.approagency.pharmacy.domain.model.DaroYabSearchResult +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.domain.model.DrugSearchParams +import com.approagency.pharmacy.domain.model.PharmacyDetail +import com.approagency.pharmacy.domain.model.PharmacyItem + +interface DrugRepository { + suspend fun searchDrug(params: DrugSearchParams): Result + suspend fun drugDetail(cod:Int): Result + suspend fun getGorohDaroei(): Result + suspend fun searchDrugs(params:DaroYabParams):Result + suspend fun getDrugDetailFromYab(detailUrl: String):Result + suspend fun searchPharmacies(genericDrugId: String,provId: String): List + + suspend fun getPharmacyDetail(pharmacyUrl: String): PharmacyDetail + +} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/pharmacy/domain/usecase/DrugDetailYabUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/DrugDetailYabUseCase.kt new file mode 100644 index 0000000..337cd12 --- /dev/null +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/DrugDetailYabUseCase.kt @@ -0,0 +1,12 @@ +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.domain.repository.DrugRepository + +class DrugDetailYabUseCase ( + private val repository: DrugRepository +) { + suspend operator fun invoke(detailUrl: String):Result { + return repository.getDrugDetailFromYab(detailUrl) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetDarmanUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDarmanUseCase.kt similarity index 51% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetDarmanUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDarmanUseCase.kt index 9302daa..44482dd 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetDarmanUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDarmanUseCase.kt @@ -1,12 +1,12 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.domain.repository.DrugRepository - -class GetDarmanUseCase ( - private val repository: DrugRepository -){ - suspend operator fun invoke (): Result{ - return repository.getGorohDaroei() - } +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.domain.repository.DrugRepository + +class GetDarmanUseCase ( + private val repository: DrugRepository +){ + suspend operator fun invoke (): Result{ + return repository.getGorohDaroei() + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetDrugDetailUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugDetailUseCase.kt similarity index 53% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetDrugDetailUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugDetailUseCase.kt index b137852..cd3c5f1 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetDrugDetailUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugDetailUseCase.kt @@ -1,12 +1,12 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.domain.repository.DrugRepository - -class GetDrugDetailUseCase - ( - private val repository: DrugRepository){ - suspend operator fun invoke(cod:Int): Result{ - return repository.drugDetail(cod) - } +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.data.dto.DrugModels +import com.approagency.pharmacy.domain.repository.DrugRepository + +class GetDrugDetailUseCase + ( + private val repository: DrugRepository){ + suspend operator fun invoke(cod:Int): Result{ + return repository.drugDetail(cod) + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugSearchUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugSearchUseCase.kt new file mode 100644 index 0000000..02288c0 --- /dev/null +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetDrugSearchUseCase.kt @@ -0,0 +1,13 @@ +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.domain.model.DrugSearchParams +import com.approagency.pharmacy.domain.repository.DrugRepository + +class GetDrugSearchUseCase ( + private val repository: DrugRepository +){ + suspend operator fun invoke(params: DrugSearchParams): Result { + return repository.searchDrug(params) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetPharmaciesUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmaciesUseCase.kt similarity index 61% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetPharmaciesUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmaciesUseCase.kt index 44f5df0..4cfab2d 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetPharmaciesUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmaciesUseCase.kt @@ -1,7 +1,7 @@ -package com.approagency.drug.domain.usecase +package com.approagency.pharmacy.domain.usecase -import com.approagency.drug.domain.model.PharmacyItem -import com.approagency.drug.domain.repository.DrugRepository +import com.approagency.pharmacy.domain.model.PharmacyItem +import com.approagency.pharmacy.domain.repository.DrugRepository class GetPharmaciesUseCase( private val repository: DrugRepository diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetPharmacyDetailUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmacyDetailUseCase.kt similarity index 55% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetPharmacyDetailUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmacyDetailUseCase.kt index 70b7028..9ebf0d2 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetPharmacyDetailUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetPharmacyDetailUseCase.kt @@ -1,7 +1,7 @@ -package com.approagency.drug.domain.usecase +package com.approagency.pharmacy.domain.usecase -import com.approagency.drug.domain.model.PharmacyDetail -import com.approagency.drug.domain.repository.DrugRepository +import com.approagency.pharmacy.domain.model.PharmacyDetail +import com.approagency.pharmacy.domain.repository.DrugRepository class GetPharmacyDetailUseCase( private val repository: DrugRepository diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetTestGroupUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestGroupUseCase.kt similarity index 76% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetTestGroupUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestGroupUseCase.kt index 7400d5b..c428ce0 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetTestGroupUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestGroupUseCase.kt @@ -1,24 +1,24 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.repository.LabRepositoryImpl -import com.approagency.drug.domain.model.TestGroup -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map - -class GetTestGroupUseCase ( - private val repository: LabRepositoryImpl -) { - operator fun invoke(): Flow> { - return repository.getAllGroups().map { entities -> - entities.map { entity -> - TestGroup( - id = entity.id, - ename = entity.ename, - fname = entity.fname, - detail = entity.detail, - isParent = entity.isParent - ) - } - } - } +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.data.repository.LabRepositoryImpl +import com.approagency.pharmacy.domain.model.TestGroup +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +class GetTestGroupUseCase ( + private val repository: LabRepositoryImpl +) { + operator fun invoke(): Flow> { + return repository.getAllGroups().map { entities -> + entities.map { entity -> + TestGroup( + id = entity.id, + ename = entity.ename, + fname = entity.fname, + detail = entity.detail, + isParent = entity.isParent + ) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/GetTestItemByGroupId.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestItemByGroupId.kt similarity index 70% rename from app/src/main/java/com/approagency/drug/domain/usecase/GetTestItemByGroupId.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestItemByGroupId.kt index 5172e42..c56ab6e 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/GetTestItemByGroupId.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/GetTestItemByGroupId.kt @@ -1,26 +1,25 @@ -package com.approagency.drug.domain.usecase - -import com.approagency.drug.data.local.entities.TestItemEntity -import com.approagency.drug.data.repository.LabRepositoryImpl -import com.approagency.drug.domain.model.TestItem -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map - -class GetTestItemByGroupId ( - private val repository: LabRepositoryImpl -) { - operator fun invoke(id:Int): Flow> { - return repository.getItemsByGroupId(groupId = id).map { - entities -> entities.map { - entity -> - TestItem( - id = entity.id, - groupId = entity.groupId, - title = entity.title, - normalValue = entity.normalValue, - detail = entity.detail, - ) - } - } - } +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.data.repository.LabRepositoryImpl +import com.approagency.pharmacy.domain.model.TestItem +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +class GetTestItemByGroupId ( + private val repository: LabRepositoryImpl +) { + operator fun invoke(id:Int): Flow> { + return repository.getItemsByGroupId(groupId = id).map { + entities -> entities.map { + entity -> + TestItem( + id = entity.id, + groupId = entity.groupId, + title = entity.title, + normalValue = entity.normalValue, + detail = entity.detail, + ) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchDrugsYabUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchDrugsYabUseCase.kt new file mode 100644 index 0000000..05aeecb --- /dev/null +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchDrugsYabUseCase.kt @@ -0,0 +1,14 @@ +package com.approagency.pharmacy.domain.usecase + +import com.approagency.pharmacy.domain.model.DaroYabParams +import com.approagency.pharmacy.domain.model.DaroYabSearchResult +import com.approagency.pharmacy.domain.repository.DrugRepository + +class SearchDrugsYabUseCase ( + private val repository: DrugRepository +) { + suspend operator fun invoke(query: String, pageNumber: Int = 1): Result { + val params = DaroYabParams(query = query, pageNumber = pageNumber) + return repository.searchDrugs(params) + } +} diff --git a/app/src/main/java/com/approagency/drug/domain/usecase/SearchTestsUseCase.kt b/app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchTestsUseCase.kt similarity index 57% rename from app/src/main/java/com/approagency/drug/domain/usecase/SearchTestsUseCase.kt rename to app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchTestsUseCase.kt index 410feb8..4379684 100644 --- a/app/src/main/java/com/approagency/drug/domain/usecase/SearchTestsUseCase.kt +++ b/app/src/main/java/com/approagency/pharmacy/domain/usecase/SearchTestsUseCase.kt @@ -1,23 +1,23 @@ -package com.approagency.drug.domain.usecase - - -import com.approagency.drug.data.repository.LabRepositoryImpl -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.domain.model.TestItem -import com.approagency.drug.domain.model.toTestGroup -import com.approagency.drug.domain.model.toTestItem -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map - -class SearchTestsUseCase( - private val repository: LabRepositoryImpl -) { - operator fun invoke(query: String): Flow, List>> { - return repository.searchGroupsAndItems(query).map { (groups, items) -> - Pair( - groups.map { it.toTestGroup() }, - items.map { it.toTestItem() } - ) - } - } +package com.approagency.pharmacy.domain.usecase + + +import com.approagency.pharmacy.data.repository.LabRepositoryImpl +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.domain.model.TestItem +import com.approagency.pharmacy.domain.model.toTestGroup +import com.approagency.pharmacy.domain.model.toTestItem +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +class SearchTestsUseCase( + private val repository: LabRepositoryImpl +) { + operator fun invoke(query: String): Flow, List>> { + return repository.searchGroupsAndItems(query).map { (groups, items) -> + Pair( + groups.map { it.toTestGroup() }, + items.map { it.toTestItem() } + ) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/navigation/AppNavGraph.kt b/app/src/main/java/com/approagency/pharmacy/navigation/AppNavGraph.kt similarity index 84% rename from app/src/main/java/com/approagency/drug/navigation/AppNavGraph.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/AppNavGraph.kt index 0be624c..d368d63 100644 --- a/app/src/main/java/com/approagency/drug/navigation/AppNavGraph.kt +++ b/app/src/main/java/com/approagency/pharmacy/navigation/AppNavGraph.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.navigation +package com.approagency.pharmacy.navigation import android.net.Uri import androidx.compose.runtime.Composable @@ -8,10 +8,10 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import com.approagency.drug.presentation.screens.DrugDetailScreen -import com.approagency.drug.presentation.screens.HomeScreen -import com.approagency.drug.presentation.screens.LabScreen -import com.approagency.drug.presentation.screens.SearchScreen +import com.approagency.pharmacy.presentation.screens.DrugDetailScreen +import com.approagency.pharmacy.presentation.screens.HomeScreen +import com.approagency.pharmacy.presentation.screens.LabScreen +import com.approagency.pharmacy.presentation.screens.SearchScreen @Composable fun AppNavGraph() { diff --git a/app/src/main/java/com/approagency/drug/navigation/BottomBar.kt b/app/src/main/java/com/approagency/pharmacy/navigation/BottomBar.kt similarity index 86% rename from app/src/main/java/com/approagency/drug/navigation/BottomBar.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/BottomBar.kt index 841493b..e37c6f2 100644 --- a/app/src/main/java/com/approagency/drug/navigation/BottomBar.kt +++ b/app/src/main/java/com/approagency/pharmacy/navigation/BottomBar.kt @@ -1,31 +1,22 @@ -package com.approagency.drug.navigation +package com.approagency.pharmacy.navigation import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Build import androidx.compose.material.icons.filled.LocalPharmacy import androidx.compose.material.icons.filled.Science import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -35,8 +26,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState diff --git a/app/src/main/java/com/approagency/drug/navigation/MainContainer.kt b/app/src/main/java/com/approagency/pharmacy/navigation/MainContainer.kt similarity index 75% rename from app/src/main/java/com/approagency/drug/navigation/MainContainer.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/MainContainer.kt index 6d939a3..daccaf6 100644 --- a/app/src/main/java/com/approagency/drug/navigation/MainContainer.kt +++ b/app/src/main/java/com/approagency/pharmacy/navigation/MainContainer.kt @@ -1,14 +1,12 @@ -package com.approagency.drug.navigation +package com.approagency.pharmacy.navigation import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.currentBackStackEntryAsState + @Composable fun MainContainer( navController: NavHostController, diff --git a/app/src/main/java/com/approagency/drug/navigation/Routes.kt b/app/src/main/java/com/approagency/pharmacy/navigation/Routes.kt similarity index 92% rename from app/src/main/java/com/approagency/drug/navigation/Routes.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/Routes.kt index 4d9bdb6..6b7ba58 100644 --- a/app/src/main/java/com/approagency/drug/navigation/Routes.kt +++ b/app/src/main/java/com/approagency/pharmacy/navigation/Routes.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.navigation +package com.approagency.pharmacy.navigation import android.net.Uri diff --git a/app/src/main/java/com/approagency/drug/navigation/graphs/HomeGraph.kt b/app/src/main/java/com/approagency/pharmacy/navigation/graphs/HomeGraph.kt similarity index 100% rename from app/src/main/java/com/approagency/drug/navigation/graphs/HomeGraph.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/graphs/HomeGraph.kt diff --git a/app/src/main/java/com/approagency/drug/navigation/graphs/LabGraph.kt b/app/src/main/java/com/approagency/pharmacy/navigation/graphs/LabGraph.kt similarity index 100% rename from app/src/main/java/com/approagency/drug/navigation/graphs/LabGraph.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/graphs/LabGraph.kt diff --git a/app/src/main/java/com/approagency/drug/navigation/graphs/SearchGraph.kt b/app/src/main/java/com/approagency/pharmacy/navigation/graphs/SearchGraph.kt similarity index 100% rename from app/src/main/java/com/approagency/drug/navigation/graphs/SearchGraph.kt rename to app/src/main/java/com/approagency/pharmacy/navigation/graphs/SearchGraph.kt diff --git a/app/src/main/java/com/approagency/drug/presentation/common/CustomBottonSheet.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBottonSheet.kt similarity index 87% rename from app/src/main/java/com/approagency/drug/presentation/common/CustomBottonSheet.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBottonSheet.kt index dda937a..9bd5986 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/CustomBottonSheet.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBottonSheet.kt @@ -1,39 +1,37 @@ -package com.approagency.drug.presentation.common - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun CustomModalBottomSheet( - modifier: Modifier = Modifier, - sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), - scope: CoroutineScope = rememberCoroutineScope(), - onDismiss: (() -> Unit)? = null, - content: @Composable () -> Unit -) { - ModalBottomSheet( - onDismissRequest = { - onDismiss?.invoke() - }, - sheetState = sheetState, - modifier = modifier, - shape = RoundedCornerShape(topStart = MaterialTheme.dime.lg, topEnd = MaterialTheme.dime.lg) - ) { - Box( - modifier = Modifier - .fillMaxWidth() - ) { - content() - } - } -} +package com.approagency.pharmacy.presentation.common + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import com.vada.caller.ui.theme.dime +import kotlinx.coroutines.CoroutineScope + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun CustomModalBottomSheet( + modifier: Modifier = Modifier, + sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), + scope: CoroutineScope = rememberCoroutineScope(), + onDismiss: (() -> Unit)? = null, + content: @Composable () -> Unit +) { + ModalBottomSheet( + onDismissRequest = { + onDismiss?.invoke() + }, + sheetState = sheetState, + modifier = modifier, + shape = RoundedCornerShape(topStart = MaterialTheme.dime.lg, topEnd = MaterialTheme.dime.lg) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + ) { + content() + } + } +} diff --git a/app/src/main/java/com/approagency/drug/presentation/common/CustomBox.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBox.kt similarity index 83% rename from app/src/main/java/com/approagency/drug/presentation/common/CustomBox.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBox.kt index 30b2a46..f165366 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/CustomBox.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomBox.kt @@ -1,26 +1,25 @@ -package com.approagency.drug.presentation.common -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip - - -@Composable - -fun CustomBox( - modifier: Modifier? = Modifier, - child: @Composable ()-> Unit -) { - if (modifier != null) { - Box( - modifier = modifier.clip(shape = MaterialTheme.shapes.large).background( - color = MaterialTheme.colorScheme.surfaceContainer - ) - ) { - child() - } - } +package com.approagency.pharmacy.presentation.common +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip + + +@Composable + +fun CustomBox( + modifier: Modifier? = Modifier, + child: @Composable ()-> Unit +) { + if (modifier != null) { + Box( + modifier = modifier.clip(shape = MaterialTheme.shapes.large).background( + color = MaterialTheme.colorScheme.surfaceContainer + ) + ) { + child() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/common/CustomModalDialog.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomModalDialog.kt similarity index 89% rename from app/src/main/java/com/approagency/drug/presentation/common/CustomModalDialog.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/CustomModalDialog.kt index 4374c01..13f888c 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/CustomModalDialog.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomModalDialog.kt @@ -1,40 +1,39 @@ -package com.approagency.drug.presentation.common - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.window.Dialog -import com.vada.caller.ui.theme.dime - -@Composable -fun CustomModalDialog( - onDismissRequest: () -> Unit, - modifier: Modifier = Modifier, - content: @Composable ColumnScope.() -> Unit -) { - Dialog( - onDismissRequest = onDismissRequest - ){ - Surface( - modifier = modifier - .wrapContentHeight(), - shape = MaterialTheme.shapes.medium, - color = MaterialTheme.colorScheme.surface, - tonalElevation = MaterialTheme.dime.sm - ) { - Column( - modifier = Modifier - .padding(MaterialTheme.dime.lg), - verticalArrangement = Arrangement.spacedBy(MaterialTheme.dime.lg), - content = content - ) - } - } +package com.approagency.pharmacy.presentation.common + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.window.Dialog +import com.vada.caller.ui.theme.dime + +@Composable +fun CustomModalDialog( + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + content: @Composable ColumnScope.() -> Unit +) { + Dialog( + onDismissRequest = onDismissRequest + ){ + Surface( + modifier = modifier + .wrapContentHeight(), + shape = MaterialTheme.shapes.medium, + color = MaterialTheme.colorScheme.surface, + tonalElevation = MaterialTheme.dime.sm + ) { + Column( + modifier = Modifier + .padding(MaterialTheme.dime.lg), + verticalArrangement = Arrangement.spacedBy(MaterialTheme.dime.lg), + content = content + ) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/common/CustomTextFilled.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomTextFilled.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/common/CustomTextFilled.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/CustomTextFilled.kt index f377c21..6998fe8 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/CustomTextFilled.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/CustomTextFilled.kt @@ -1,183 +1,182 @@ -package com.approagency.drug.presentation.common - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.text.input.ImeAction -import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.unit.LayoutDirection -import androidx.compose.ui.unit.dp -import com.vada.caller.ui.theme.dime - -@Composable -fun CustomTextFilled( - value: String = "", - onValueChange: (String) -> Unit, - onSearch: (String) -> Unit = {}, - placeholder: String = "جستجو...", - modifier: Modifier = Modifier, - enabled: Boolean = true, - readOnly: Boolean = false, - singleLine: Boolean = true, - showClearButton: Boolean = true, - showSearchButton: Boolean = true, - autoSearch: Boolean = false, - searchDelay: Long = 1200L, - keyboardOptions: KeyboardOptions = KeyboardOptions( - imeAction = ImeAction.Search - ), - keyboardActions: KeyboardActions = KeyboardActions( - onSearch = { - if (value.isNotBlank()) { - onSearch(value) - } - } - ), - textStyle: androidx.compose.ui.text.TextStyle = MaterialTheme.typography.bodyLarge, - hintStyle: androidx.compose.ui.text.TextStyle = MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.onSurfaceVariant - ), - containerColor: androidx.compose.ui.graphics.Color = MaterialTheme.colorScheme.surfaceVariant, - borderColor: androidx.compose.ui.graphics.Color = MaterialTheme.colorScheme.primaryContainer, - shape: androidx.compose.ui.graphics.Shape = MaterialTheme.shapes.medium, - height: Int = 45, - onFocusChange: ((Boolean) -> Unit)? = null -) { - var isFocused by remember { mutableStateOf(false) } - var localValue by remember(value) { mutableStateOf(value) } - - // Auto-search functionality - androidx.compose.runtime.LaunchedEffect(autoSearch, searchDelay, localValue) { - if (autoSearch && localValue.isNotBlank()) { - kotlinx.coroutines.delay(searchDelay) - onSearch(localValue) - } - } - - CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { - Box( - modifier = modifier - .fillMaxWidth() - .height(height.dp) - .background( - color = containerColor, - shape = shape - ) - .border( - width = 1.dp, - color = if (isFocused) - MaterialTheme.colorScheme.primary - else - borderColor, - shape = shape - ) - .padding(horizontal = MaterialTheme.dime.md, vertical = MaterialTheme.dime.sm) - .onFocusChanged { focusState -> - isFocused = focusState.isFocused - onFocusChange?.invoke(focusState.isFocused) - } - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - // Clear button (shows when there's text and clear button is enabled) - if (showClearButton && localValue.isNotEmpty()) { - IconButton( - onClick = { - localValue = "" - onValueChange("") - }, - modifier = Modifier.size(28.dp) - ) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = "Clear", - modifier = Modifier.size(16.dp), - tint = MaterialTheme.colorScheme.onSurfaceVariant - ) - } - } - - // Text field - BasicTextField( - value = localValue, - onValueChange = { newValue -> - localValue = newValue - onValueChange(newValue) - }, - modifier = Modifier - .weight(1f) - .padding(horizontal = if (showClearButton && localValue.isNotEmpty()) 4.dp else 0.dp), - enabled = enabled, - readOnly = readOnly, - singleLine = singleLine, - textStyle = textStyle, - keyboardOptions = keyboardOptions, - keyboardActions = keyboardActions, - decorationBox = { innerTextField -> - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.CenterStart - ) { - if (localValue.isEmpty() && !isFocused) { - Text( - text = placeholder, - style = hintStyle - ) - } - innerTextField() - } - } - ) - - // Search button - if (showSearchButton) { - IconButton( - onClick = { - if (localValue.isNotBlank()) { - onSearch(localValue) - } - }, - modifier = Modifier.size(32.dp) - ) { - Icon( - imageVector = Icons.Default.Search, - contentDescription = "Search", - modifier = Modifier.size(18.dp), - tint = if (localValue.isNotBlank()) - MaterialTheme.colorScheme.primary - else - MaterialTheme.colorScheme.onSurfaceVariant - ) - } - } - } - } - } +package com.approagency.pharmacy.presentation.common + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import com.vada.caller.ui.theme.dime + +@Composable +fun CustomTextFilled( + value: String = "", + onValueChange: (String) -> Unit, + onSearch: (String) -> Unit = {}, + placeholder: String = "جستجو...", + modifier: Modifier = Modifier, + enabled: Boolean = true, + readOnly: Boolean = false, + singleLine: Boolean = true, + showClearButton: Boolean = true, + showSearchButton: Boolean = true, + autoSearch: Boolean = false, + searchDelay: Long = 1200L, + keyboardOptions: KeyboardOptions = KeyboardOptions( + imeAction = ImeAction.Search + ), + keyboardActions: KeyboardActions = KeyboardActions( + onSearch = { + if (value.isNotBlank()) { + onSearch(value) + } + } + ), + textStyle: androidx.compose.ui.text.TextStyle = MaterialTheme.typography.bodyLarge, + hintStyle: androidx.compose.ui.text.TextStyle = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant + ), + containerColor: androidx.compose.ui.graphics.Color = MaterialTheme.colorScheme.surfaceVariant, + borderColor: androidx.compose.ui.graphics.Color = MaterialTheme.colorScheme.primaryContainer, + shape: androidx.compose.ui.graphics.Shape = MaterialTheme.shapes.medium, + height: Int = 45, + onFocusChange: ((Boolean) -> Unit)? = null +) { + var isFocused by remember { mutableStateOf(false) } + var localValue by remember(value) { mutableStateOf(value) } + + // Auto-search functionality + androidx.compose.runtime.LaunchedEffect(autoSearch, searchDelay, localValue) { + if (autoSearch && localValue.isNotBlank()) { + kotlinx.coroutines.delay(searchDelay) + onSearch(localValue) + } + } + + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { + Box( + modifier = modifier + .fillMaxWidth() + .height(height.dp) + .background( + color = containerColor, + shape = shape + ) + .border( + width = 1.dp, + color = if (isFocused) + MaterialTheme.colorScheme.primary + else + borderColor, + shape = shape + ) + .padding(horizontal = MaterialTheme.dime.md, vertical = MaterialTheme.dime.sm) + .onFocusChanged { focusState -> + isFocused = focusState.isFocused + onFocusChange?.invoke(focusState.isFocused) + } + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + // Clear button (shows when there's text and clear button is enabled) + if (showClearButton && localValue.isNotEmpty()) { + IconButton( + onClick = { + localValue = "" + onValueChange("") + }, + modifier = Modifier.size(28.dp) + ) { + Icon( + imageVector = Icons.Default.Close, + contentDescription = "Clear", + modifier = Modifier.size(16.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + // Text field + BasicTextField( + value = localValue, + onValueChange = { newValue -> + localValue = newValue + onValueChange(newValue) + }, + modifier = Modifier + .weight(1f) + .padding(horizontal = if (showClearButton && localValue.isNotEmpty()) 4.dp else 0.dp), + enabled = enabled, + readOnly = readOnly, + singleLine = singleLine, + textStyle = textStyle, + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + decorationBox = { innerTextField -> + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.CenterStart + ) { + if (localValue.isEmpty() && !isFocused) { + Text( + text = placeholder, + style = hintStyle + ) + } + innerTextField() + } + } + ) + + // Search button + if (showSearchButton) { + IconButton( + onClick = { + if (localValue.isNotBlank()) { + onSearch(localValue) + } + }, + modifier = Modifier.size(32.dp) + ) { + Icon( + imageVector = Icons.Default.Search, + contentDescription = "Search", + modifier = Modifier.size(18.dp), + tint = if (localValue.isNotBlank()) + MaterialTheme.colorScheme.primary + else + MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/common/EmptySearchState.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/EmptySearchState.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/common/EmptySearchState.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/EmptySearchState.kt index fb17e8a..0006cf0 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/EmptySearchState.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/EmptySearchState.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.common +package com.approagency.pharmacy.presentation.common import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -10,7 +10,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.vada.caller.ui.theme.LocalDime diff --git a/app/src/main/java/com/approagency/drug/presentation/common/LoadingMoreIndicator.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/LoadingMoreIndicator.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/common/LoadingMoreIndicator.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/LoadingMoreIndicator.kt index a03b632..4a292a7 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/LoadingMoreIndicator.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/LoadingMoreIndicator.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.common +package com.approagency.pharmacy.presentation.common import androidx.compose.ui.unit.sp diff --git a/app/src/main/java/com/approagency/drug/presentation/common/SnackbarManager.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/SnackbarManager.kt similarity index 88% rename from app/src/main/java/com/approagency/drug/presentation/common/SnackbarManager.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/SnackbarManager.kt index cafb1f4..0038836 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/SnackbarManager.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/SnackbarManager.kt @@ -1,21 +1,21 @@ -package com.approagency.drug.presentation.common - -import androidx.compose.material3.SnackbarHostState -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -object SnackbarManager { - private var snackbarHostState: SnackbarHostState? = null - private var coroutineScope: CoroutineScope? = null - - fun init(scope: CoroutineScope, hostState: SnackbarHostState) { - coroutineScope = scope - snackbarHostState = hostState - } - - fun showMessage(message: String) { - coroutineScope?.launch { - snackbarHostState?.showSnackbar(message) - } - } -} +package com.approagency.pharmacy.presentation.common + +import androidx.compose.material3.SnackbarHostState +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +object SnackbarManager { + private var snackbarHostState: SnackbarHostState? = null + private var coroutineScope: CoroutineScope? = null + + fun init(scope: CoroutineScope, hostState: SnackbarHostState) { + coroutineScope = scope + snackbarHostState = hostState + } + + fun showMessage(message: String) { + coroutineScope?.launch { + snackbarHostState?.showSnackbar(message) + } + } +} diff --git a/app/src/main/java/com/approagency/drug/presentation/common/UiState.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/UiState.kt similarity index 97% rename from app/src/main/java/com/approagency/drug/presentation/common/UiState.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/UiState.kt index ed53f23..84bbfdf 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/UiState.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/UiState.kt @@ -1,7 +1,7 @@ -package com.vada.caller.presentation.common - -sealed interface UiState { - object Loading : UiState - data class Success(val data: T) : UiState - data class Error(val message: String) : UiState +package com.vada.caller.presentation.common + +sealed interface UiState { + object Loading : UiState + data class Success(val data: T) : UiState + data class Error(val message: String) : UiState } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/common/loading.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/loading.kt similarity index 61% rename from app/src/main/java/com/approagency/drug/presentation/common/loading.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/loading.kt index 43debb5..c739cc7 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/loading.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/loading.kt @@ -1,25 +1,20 @@ -package com.approagency.drug.presentation.common - -import android.content.res.Resources.Theme -import androidx.compose.ui.graphics.Color -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.vada.caller.ui.theme.dime - -@Composable -fun Loading( -color: Color = MaterialTheme.colorScheme.onPrimary, -modifier: Modifier = Modifier -) { - CircularProgressIndicator( - color = color, - modifier = modifier, - strokeWidth = 2.dp - ) +package com.approagency.pharmacy.presentation.common + +import androidx.compose.ui.graphics.Color +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@Composable +fun Loading( +color: Color = MaterialTheme.colorScheme.onPrimary, +modifier: Modifier = Modifier +) { + CircularProgressIndicator( + color = color, + modifier = modifier, + strokeWidth = 2.dp + ) } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/common/primaryButton.kt b/app/src/main/java/com/approagency/pharmacy/presentation/common/primaryButton.kt similarity index 89% rename from app/src/main/java/com/approagency/drug/presentation/common/primaryButton.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/common/primaryButton.kt index 6c1adae..7115db4 100644 --- a/app/src/main/java/com/approagency/drug/presentation/common/primaryButton.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/common/primaryButton.kt @@ -1,39 +1,38 @@ -package com.approagency.drug.presentation.common - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp - -@Composable -fun PrimaryButton( - text: String, - isLoading: Boolean?, - onClick: () -> Unit, - height: Int? = null -) { - Button( - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - contentColor = MaterialTheme.colorScheme.onPrimary - ), - shape = MaterialTheme.shapes.medium, - modifier = Modifier.fillMaxWidth().height(height?.dp ?: 50.dp), - onClick = { - onClick() - }, - ) { - if (isLoading == true) { - Text("... در حال جستجو" , textAlign = TextAlign.Right) - } else { - Text(text) - } - } +package com.approagency.pharmacy.presentation.common + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp + +@Composable +fun PrimaryButton( + text: String, + isLoading: Boolean?, + onClick: () -> Unit, + height: Int? = null +) { + Button( + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary + ), + shape = MaterialTheme.shapes.medium, + modifier = Modifier.fillMaxWidth().height(height?.dp ?: 50.dp), + onClick = { + onClick() + }, + ) { + if (isLoading == true) { + Text("... در حال جستجو" , textAlign = TextAlign.Right) + } else { + Text(text) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/DarmanContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/DarmanContent.kt similarity index 84% rename from app/src/main/java/com/approagency/drug/presentation/components/DarmanContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/DarmanContent.kt index 1cf685d..96344fa 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/DarmanContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/DarmanContent.kt @@ -1,131 +1,122 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.AbsoluteAlignment -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import com.approagency.drug.data.dto.DarmanList -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.data.dto.DrugDetail -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.PrimaryButton -import com.vada.caller.ui.theme.dime -import kotlin.collections.emptyList - -@Composable -fun DarmanContent( - darmanData: Result?, - onDarmanClick: (Int) -> Unit, - onRetryClick:()-> Unit, -){ - val drugs = darmanData?.getOrNull()?.data ?: emptyList() - if (drugs.isEmpty()){ - RetryContent( - modifier = Modifier, - error = "مشکلی از سمت سرور پیش آمده", - onClick = { - onRetryClick() - } - ) - } else { - LazyColumn { - items(drugs.count() , itemContent ={ - i -> DarmanItem( - darman = darmanData?.getOrNull()!!.data[i] , - onClick = { onDarmanClick(drugs[i].cod!!) } - ) - } ) - } - - } - - -} - -@Composable -fun DarmanItem( - darman: DarmanList, // Adjust this based on your actual data class - onClick: (Int?) -> Unit -) { - CustomBox( - modifier = Modifier - .padding(bottom = MaterialTheme.dime.sm) - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - onClick(darman.cod) - }, - child = { - Row( - modifier = Modifier.padding(all = MaterialTheme.dime.lg), - ) { - Column ( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = AbsoluteAlignment.Right -// horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(darman.nam_fa.toString() , style = MaterialTheme.typography.labelLarge , textAlign = TextAlign.Right ) - Text(darman.nam_en.toString() , style = MaterialTheme.typography.bodySmall) - } - Row ( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center - ) { - TextButton( - onClick = { - onClick(darman.cod) - } - ) { - Row( - horizontalArrangement = Arrangement.Center - ) { - Icon( - imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft - , contentDescription = "see more" - ) - Text("مشاهده لیست") - } - } - } - } - - } - } - ) -// Button( -// onClick = onClick, -// modifier = Modifier -// .fillMaxWidth() -// .padding(vertical = 4.dp) -// ) { -// drug.nam_fa?.let { Text(text = it) } // Adjust based on your drug model -// } +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.AbsoluteAlignment +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import com.approagency.pharmacy.data.dto.DarmanList +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.presentation.common.CustomBox +import com.vada.caller.ui.theme.dime +import kotlin.collections.emptyList + +@Composable +fun DarmanContent( + darmanData: Result?, + onDarmanClick: (Int) -> Unit, + onRetryClick:()-> Unit, +){ + val drugs = darmanData?.getOrNull()?.data ?: emptyList() + if (drugs.isEmpty()){ + RetryContent( + modifier = Modifier, + error = "مشکلی از سمت سرور پیش آمده", + onClick = { + onRetryClick() + } + ) + } else { + LazyColumn { + items(drugs.count() , itemContent ={ + i -> DarmanItem( + darman = darmanData?.getOrNull()!!.data[i] , + onClick = { onDarmanClick(drugs[i].cod!!) } + ) + } ) + } + + } + + +} + +@Composable +fun DarmanItem( + darman: DarmanList, // Adjust this based on your actual data class + onClick: (Int?) -> Unit +) { + CustomBox( + modifier = Modifier + .padding(bottom = MaterialTheme.dime.sm) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + onClick(darman.cod) + }, + child = { + Row( + modifier = Modifier.padding(all = MaterialTheme.dime.lg), + ) { + Column ( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.Start + ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = AbsoluteAlignment.Right +// horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(darman.nam_fa.toString() , style = MaterialTheme.typography.labelLarge , textAlign = TextAlign.Right ) + Text(darman.nam_en.toString() , style = MaterialTheme.typography.bodySmall) + } + Row ( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + TextButton( + onClick = { + onClick(darman.cod) + } + ) { + Row( + horizontalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft + , contentDescription = "see more" + ) + Text("مشاهده لیست") + } + } + } + } + + } + } + ) +// Button( +// onClick = onClick, +// modifier = Modifier +// .fillMaxWidth() +// .padding(vertical = 4.dp) +// ) { +// drug.nam_fa?.let { Text(text = it) } // Adjust based on your drug model +// } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/DaroYabResultContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/DaroYabResultContent.kt similarity index 86% rename from app/src/main/java/com/approagency/drug/presentation/components/DaroYabResultContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/DaroYabResultContent.kt index 286864f..8e35e03 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/DaroYabResultContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/DaroYabResultContent.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.components +package com.approagency.pharmacy.presentation.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -6,20 +6,15 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.approagency.drug.domain.model.DaroYabSearchResult -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.presentation.common.CustomBox +import com.approagency.pharmacy.domain.model.DrugSearchResult +import com.approagency.pharmacy.presentation.common.CustomBox import com.vada.caller.ui.theme.LocalDime import com.vada.caller.ui.theme.dime diff --git a/app/src/main/java/com/approagency/drug/presentation/components/DrugListContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/DrugListContent.kt similarity index 93% rename from app/src/main/java/com/approagency/drug/presentation/components/DrugListContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/DrugListContent.kt index 5fe83e2..9749998 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/DrugListContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/DrugListContent.kt @@ -1,152 +1,152 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import com.approagency.drug.data.dto.DrugDetail -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.presentation.common.CustomBox -import com.vada.caller.ui.theme.dime - -@Composable -fun DrugListContent( - drugsData: Result?, - onDrugClick: (Int) -> Unit -) { - val drugs = drugsData?.getOrNull()?.data ?: emptyList() - - if (drugs.isEmpty()) { - CustomBox( - child = { - Row( - horizontalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxWidth() - .padding(all = MaterialTheme.dime.sm), - ) { - Text( - text = "نتیجه‌ای یافت نشد", - fontWeight = FontWeight.W500 - ) - Spacer(modifier = Modifier.width(MaterialTheme.dime.xs)) - Icon( - imageVector = Icons.Default.Search, - contentDescription = "Search" - ) - } - } - ) - } else { - LazyColumn( - - ){ - items(drugs.count() , itemContent ={ - i -> DrugItem( - drug = drugs[i], - onClick = { onDrugClick(drugs[i].cod!!) } - ) - } ) - } - - } -} - - -@Composable -fun DrugItem( - drug: DrugDetail, // Adjust this based on your actual data class - onClick: (Int?) -> Unit -) { - CustomBox( - modifier = Modifier - .padding(bottom = MaterialTheme.dime.sm) - .fillMaxWidth() - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - onClick(drug.cod) - }, - child = { - Row( - modifier = Modifier.padding(all = MaterialTheme.dime.lg), - ) { - Column ( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(drug.nam_en.toString() , style = MaterialTheme.typography.bodySmall) - Text(drug.nam_fa.toString() , style = MaterialTheme.typography.labelLarge,textAlign = TextAlign.Right) - } - if (drug.goroh_darmani != null ) - - - Row( - modifier = Modifier.fillMaxWidth() - , horizontalArrangement = Arrangement.End - ) {Text( - "گروه دارویی: ${drug.goroh_darmani.nam_fa.toString()}", - style = MaterialTheme.typography.labelMedium, - textAlign = TextAlign.Right - ) } - - - - Row ( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center - ) { - TextButton( - onClick = { - onClick(drug.cod) - } - ) { - Row( - horizontalArrangement = Arrangement.Center - ) { - Icon( - imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft - , contentDescription = "see more" - ) - Text("مشاهده جزییات") - } - } - } - } - - } - } - ) -// Button( -// onClick = onClick, -// modifier = Modifier -// .fillMaxWidth() -// .padding(vertical = 4.dp) -// ) { -// drug.nam_fa?.let { Text(text = it) } // Adjust based on your drug model -// } +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import com.approagency.pharmacy.data.dto.DrugDetail +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.presentation.common.CustomBox +import com.vada.caller.ui.theme.dime + +@Composable +fun DrugListContent( + drugsData: Result?, + onDrugClick: (Int) -> Unit +) { + val drugs = drugsData?.getOrNull()?.data ?: emptyList() + + if (drugs.isEmpty()) { + CustomBox( + child = { + Row( + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .padding(all = MaterialTheme.dime.sm), + ) { + Text( + text = "نتیجه‌ای یافت نشد", + fontWeight = FontWeight.W500 + ) + Spacer(modifier = Modifier.width(MaterialTheme.dime.xs)) + Icon( + imageVector = Icons.Default.Search, + contentDescription = "Search" + ) + } + } + ) + } else { + LazyColumn( + + ){ + items(drugs.count() , itemContent ={ + i -> DrugItem( + drug = drugs[i], + onClick = { onDrugClick(drugs[i].cod!!) } + ) + } ) + } + + } +} + + +@Composable +fun DrugItem( + drug: DrugDetail, // Adjust this based on your actual data class + onClick: (Int?) -> Unit +) { + CustomBox( + modifier = Modifier + .padding(bottom = MaterialTheme.dime.sm) + .fillMaxWidth() + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + onClick(drug.cod) + }, + child = { + Row( + modifier = Modifier.padding(all = MaterialTheme.dime.lg), + ) { + Column ( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.Start + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(drug.nam_en.toString() , style = MaterialTheme.typography.bodySmall) + Text(drug.nam_fa.toString() , style = MaterialTheme.typography.labelLarge,textAlign = TextAlign.Right) + } + if (drug.goroh_darmani != null ) + + + Row( + modifier = Modifier.fillMaxWidth() + , horizontalArrangement = Arrangement.End + ) {Text( + "گروه دارویی: ${drug.goroh_darmani.nam_fa.toString()}", + style = MaterialTheme.typography.labelMedium, + textAlign = TextAlign.Right + ) } + + + + Row ( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + TextButton( + onClick = { + onClick(drug.cod) + } + ) { + Row( + horizontalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft + , contentDescription = "see more" + ) + Text("مشاهده جزییات") + } + } + } + } + + } + } + ) +// Button( +// onClick = onClick, +// modifier = Modifier +// .fillMaxWidth() +// .padding(vertical = 4.dp) +// ) { +// drug.nam_fa?.let { Text(text = it) } // Adjust based on your drug model +// } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/EmptyStateContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/EmptyStateContent.kt similarity index 89% rename from app/src/main/java/com/approagency/drug/presentation/components/EmptyStateContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/EmptyStateContent.kt index 96e2fc3..eafc221 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/EmptyStateContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/EmptyStateContent.kt @@ -1,40 +1,40 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import com.approagency.drug.presentation.common.CustomBox -import com.vada.caller.ui.theme.dime - -@Composable -fun EmptyStateContent() { - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally - , verticalArrangement = Arrangement.Center - ) { - Icon( - imageVector = Icons.Default.Search, - contentDescription = "Search", - modifier = Modifier.size(MaterialTheme.dime.iconLg) - ) - CustomBox( - child = { - Text( - text = "برای جستجو، نام دارو را وارد کنید", - modifier = Modifier.padding(MaterialTheme.dime.sm) - ) - } - ) - } +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.approagency.pharmacy.presentation.common.CustomBox +import com.vada.caller.ui.theme.dime + +@Composable +fun EmptyStateContent() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + , verticalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.Default.Search, + contentDescription = "Search", + modifier = Modifier.size(MaterialTheme.dime.iconLg) + ) + CustomBox( + child = { + Text( + text = "برای جستجو، نام دارو را وارد کنید", + modifier = Modifier.padding(MaterialTheme.dime.sm) + ) + } + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/PaginationControls.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/PaginationControls.kt similarity index 98% rename from app/src/main/java/com/approagency/drug/presentation/components/PaginationControls.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/PaginationControls.kt index 466c9f2..9154c97 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/PaginationControls.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/PaginationControls.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.components +package com.approagency.pharmacy.presentation.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/approagency/drug/presentation/components/PharmacyBottomSheet.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/PharmacyBottomSheet.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/components/PharmacyBottomSheet.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/PharmacyBottomSheet.kt index b2e5446..fce5f55 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/PharmacyBottomSheet.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/PharmacyBottomSheet.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.components +package com.approagency.pharmacy.presentation.components import android.annotation.SuppressLint @@ -13,23 +13,21 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.approagency.drug.domain.model.PharmacyItem -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.CustomModalBottomSheet -import com.approagency.drug.presentation.common.Loading -import com.approagency.drug.presentation.viewModel.PharmacyDetailState -import com.approagency.drug.presentation.viewModel.PharmacyState -import com.approagency.drug.presentation.viewModel.PharmacyViewModel -import com.approagency.drug.utils.provinces +import com.approagency.pharmacy.domain.model.PharmacyItem +import com.approagency.pharmacy.presentation.common.CustomBox +import com.approagency.pharmacy.presentation.common.CustomModalBottomSheet +import com.approagency.pharmacy.presentation.common.Loading +import com.approagency.pharmacy.presentation.viewModel.PharmacyDetailState +import com.approagency.pharmacy.presentation.viewModel.PharmacyState +import com.approagency.pharmacy.presentation.viewModel.PharmacyViewModel +import com.approagency.pharmacy.utils.provinces import com.vada.caller.ui.theme.LocalDime import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.launch @SuppressLint("ConfigurationScreenWidthHeight") @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/com/approagency/drug/presentation/components/RetryContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/RetryContent.kt similarity index 87% rename from app/src/main/java/com/approagency/drug/presentation/components/RetryContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/RetryContent.kt index 04f189c..f54cf8f 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/RetryContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/RetryContent.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.components +package com.approagency.pharmacy.presentation.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -8,8 +8,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.PrimaryButton +import com.approagency.pharmacy.presentation.common.CustomBox +import com.approagency.pharmacy.presentation.common.PrimaryButton import com.vada.caller.ui.theme.dime @Composable diff --git a/app/src/main/java/com/approagency/drug/presentation/components/SearchResultContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/SearchResultContent.kt similarity index 92% rename from app/src/main/java/com/approagency/drug/presentation/components/SearchResultContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/SearchResultContent.kt index 62ffaee..6111551 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/SearchResultContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/SearchResultContent.kt @@ -1,205 +1,204 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.domain.model.TestItem -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.Loading -import com.approagency.drug.presentation.viewModel.SearchResult -import com.vada.caller.ui.theme.dime -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.ui.AbsoluteAlignment -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDirection -import androidx.compose.ui.text.style.TextOverflow - -@Composable -fun SearchResultsContent( - searchResult: SearchResult?, - isLoading: Boolean, - error: String?, - onGroupClick: (TestGroup) -> Unit, - onItemClick: (TestItem) -> Unit, - onClearSearch: () -> Unit -) { - when { - isLoading -> { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Loading(color = MaterialTheme.colorScheme.primary) - Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) - Text("در حال جستجو...") - } - } - } - - error != null -> { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text( - text = "خطا در جستجو", - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.error - ) - Text( - text = error, - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding(vertical = 8.dp) - ) - } - } - } - - searchResult != null -> { - val groups = searchResult.groups - val items = searchResult.items - - if (groups.isEmpty() && items.isEmpty()) { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text( - text = "نتیجه‌ای یافت نشد", - style = MaterialTheme.typography.titleMedium - ) - Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) - Text( - text = "لطفاً عبارت دیگری را جستجو کنید", - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } - } - } else { - LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(vertical = MaterialTheme.dime.md), - horizontalAlignment = AbsoluteAlignment.Right - - ) { - if (groups.isNotEmpty()) { - item { - Text( - text = "گروه‌های آزمایشگاهی (${groups.size})", - style = MaterialTheme.typography.titleMedium.copy( - textAlign = TextAlign.Center - ), - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(vertical = MaterialTheme.dime.md) - ) - } - - items(groups) { group -> - TestGroupItemContent( - group = group, - onClick = { onGroupClick(group) } - ) - } - - if (items.isNotEmpty()) { - item { - HorizontalDivider( - modifier = Modifier.padding(vertical = MaterialTheme.dime.md) - ) - Text( - text = "آیتم‌های آزمایشگاهی (${items.size})", - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(vertical = MaterialTheme.dime.md) - ) - } - } - } - - items(items) { item -> - TestItemSearchResult( - testItem = item, - onClick = { onItemClick(item) } - ) - } - } - } - } - } -} - -@Composable -fun TestItemSearchResult( - testItem: TestItem, - onClick: () -> Unit -) { - CustomBox( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = MaterialTheme.dime.sm) - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - onClick() - } - ) { - Column( - modifier = Modifier.padding(all = MaterialTheme.dime.lg), - horizontalAlignment = AbsoluteAlignment.Right - ) { - Text( - text = testItem.title ?: "بدون عنوان", - style = MaterialTheme.typography.labelLarge, - fontWeight = FontWeight.SemiBold - ) - - if (!testItem.normalValue.isNullOrBlank()) { - Text( - text = "مقدار نرمال: ${testItem.normalValue}", - style = MaterialTheme.typography.bodySmall.copy( - textDirection = TextDirection.Rtl, - textAlign = TextAlign.Right - ), - color = MaterialTheme.colorScheme.primary, - modifier = Modifier.padding(top = MaterialTheme.dime.xs) - ) - } - - if (!testItem.detail.isNullOrBlank()) { - Text( - text = testItem.detail, - style = MaterialTheme.typography.bodySmall.copy( - textDirection = TextDirection.Rtl, - textAlign = TextAlign.Right - ), - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = MaterialTheme.dime.sm) - ) - } - } - } -} - +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.domain.model.TestItem +import com.approagency.pharmacy.presentation.common.CustomBox +import com.approagency.pharmacy.presentation.common.Loading +import com.approagency.pharmacy.presentation.viewModel.SearchResult +import com.vada.caller.ui.theme.dime +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.ui.AbsoluteAlignment +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDirection + +@Composable +fun SearchResultsContent( + searchResult: SearchResult?, + isLoading: Boolean, + error: String?, + onGroupClick: (TestGroup) -> Unit, + onItemClick: (TestItem) -> Unit, + onClearSearch: () -> Unit +) { + when { + isLoading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Loading(color = MaterialTheme.colorScheme.primary) + Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) + Text("در حال جستجو...") + } + } + } + + error != null -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = "خطا در جستجو", + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.error + ) + Text( + text = error, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(vertical = 8.dp) + ) + } + } + } + + searchResult != null -> { + val groups = searchResult.groups + val items = searchResult.items + + if (groups.isEmpty() && items.isEmpty()) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = "نتیجه‌ای یافت نشد", + style = MaterialTheme.typography.titleMedium + ) + Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) + Text( + text = "لطفاً عبارت دیگری را جستجو کنید", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } else { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(vertical = MaterialTheme.dime.md), + horizontalAlignment = AbsoluteAlignment.Right + + ) { + if (groups.isNotEmpty()) { + item { + Text( + text = "گروه‌های آزمایشگاهی (${groups.size})", + style = MaterialTheme.typography.titleMedium.copy( + textAlign = TextAlign.Center + ), + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(vertical = MaterialTheme.dime.md) + ) + } + + items(groups) { group -> + TestGroupItemContent( + group = group, + onClick = { onGroupClick(group) } + ) + } + + if (items.isNotEmpty()) { + item { + HorizontalDivider( + modifier = Modifier.padding(vertical = MaterialTheme.dime.md) + ) + Text( + text = "آیتم‌های آزمایشگاهی (${items.size})", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(vertical = MaterialTheme.dime.md) + ) + } + } + } + + items(items) { item -> + TestItemSearchResult( + testItem = item, + onClick = { onItemClick(item) } + ) + } + } + } + } + } +} + +@Composable +fun TestItemSearchResult( + testItem: TestItem, + onClick: () -> Unit +) { + CustomBox( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = MaterialTheme.dime.sm) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + onClick() + } + ) { + Column( + modifier = Modifier.padding(all = MaterialTheme.dime.lg), + horizontalAlignment = AbsoluteAlignment.Right + ) { + Text( + text = testItem.title ?: "بدون عنوان", + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.SemiBold + ) + + if (!testItem.normalValue.isNullOrBlank()) { + Text( + text = "مقدار نرمال: ${testItem.normalValue}", + style = MaterialTheme.typography.bodySmall.copy( + textDirection = TextDirection.Rtl, + textAlign = TextAlign.Right + ), + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(top = MaterialTheme.dime.xs) + ) + } + + if (!testItem.detail.isNullOrBlank()) { + Text( + text = testItem.detail, + style = MaterialTheme.typography.bodySmall.copy( + textDirection = TextDirection.Rtl, + textAlign = TextAlign.Right + ), + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = MaterialTheme.dime.sm) + ) + } + } + } +} + diff --git a/app/src/main/java/com/approagency/drug/presentation/components/ShowDrugDetail.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/ShowDrugDetail.kt similarity index 92% rename from app/src/main/java/com/approagency/drug/presentation/components/ShowDrugDetail.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/ShowDrugDetail.kt index 80df05d..d55d54c 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/ShowDrugDetail.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/ShowDrugDetail.kt @@ -1,225 +1,222 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items // Import items if you were to use it for lists within LazyColumn -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.LayoutDirection -import com.approagency.drug.data.dto.DrugDetail // Import DrugDetail directly -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.presentation.common.CustomModalBottomSheet -import com.approagency.drug.presentation.viewModel.DrugDetailState -import com.approagency.drug.presentation.viewModel.HomeViewModel -import com.vada.caller.ui.theme.dime // Assuming this is your custom spacing/dimension object - -@Composable -@OptIn(ExperimentalMaterial3Api::class) -fun DrugDetailSheet( - viewModel: HomeViewModel, - state: DrugDetailState // Assuming you pass the state containing the detail -) { - val detail: DrugDetail? = state.drugDetail?.getOrNull()?.data - - // Only show the sheet if detail is not null - if (detail != null) { - CustomModalBottomSheet( - onDismiss = { - viewModel.closeDetail() - }, - content = { - // Use a LazyColumn for scrollable content inside the sheet - - CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = MaterialTheme.dime.lg), - contentPadding = PaddingValues(bottom = MaterialTheme.dime.lg) // Add padding to the bottom of the content for better scrolling - ) { - // --- 1. Main Title --- - item { // Use item {} for single composables within LazyColumn - Text( - text = detail.nam_fa ?: "جزئیات دارو", - style = MaterialTheme.typography.headlineMedium, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(bottom = MaterialTheme.dime.md) - ) - Text( - text = detail.nam_en ?: "N/A (English Name)", - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(bottom = MaterialTheme.dime.lg) - ) - - // Divider for visual separation - HorizontalDivider(Modifier.padding(bottom = MaterialTheme.dime.md)) - } - - // --- 2. Key Groupings --- - // Goroh Darmani (Pharmacological Group) - detail.goroh_darmani?.let { group -> - item { - DetailRow( - title = "گروه درمانی", - value = group.nam_fa ?: "نامشخص" - ) - } - group.nam_en?.let { enName -> - item { - DetailRow( - title = "Group (EN)", - value = enName - ) - } - } - } - - // Goroh Darmanei (Therapeutic Group) - detail.goroh_daroei?.let { group -> - item { - DetailRow( - title = "گروه دارویی", - value = group.nam ?: "نامشخص" - ) - } - } - - // Goroh Farmakologic (Pharmacological Class) - detail.goroh_farmakologic_cod?.let { cod -> - // NOTE: You might need a separate API call or mapping here - // if cod needs to be translated to a name. For now, we show the code. - item { - DetailRow( - title = "کلاس فارماکولوژیک", - value = cod.toString() - ) - } - } - - item { // Add a divider as a separate item - HorizontalDivider(Modifier.padding(vertical = MaterialTheme.dime.md)) - } - - // --- 3. Usage & Mechanism xw--- - detail.mavaredmasraf?.let { usage -> - item { - DetailSection(title = "موارد مصرف", content = usage) - } - } - - detail.mekanismtasir?.let { mechanism -> - item { - DetailSection(title = "مکانیسم اثر", content = mechanism) - } - } - - // --- 4. Warnings & Storage --- - detail.hoshdar?.let { warning -> - item { - DetailSection( - title = "هشدارها", - content = warning, - isWarning = true - ) - } - } - - detail.sharayetnegahdari?.let { storage -> - item { - DetailSection( - title = "شرایط نگهداری", - content = storage - ) - } - } - } - } - } - ) - } -} - -// --- Helper Composables for Clean Code --- - -@Composable -fun DetailRow( - title: String, - value: String -) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = MaterialTheme.dime.sm), - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = title, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Right - ) - Text( - text = value, - style = MaterialTheme.typography.bodyLarge, - fontWeight = FontWeight.SemiBold, - textAlign = TextAlign.End, - // Ensure text takes up available space and doesn't push other elements. - // Using weight(1f, fill = false) is good for aligning to the end if there's space. - modifier = Modifier.weight(1f, fill = false) - ) - } -} - -@Composable -fun DetailSection( - title: String, - content: String, - isWarning: Boolean = false -) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = MaterialTheme.dime.md) - ) { - Text( - text = title, - style = MaterialTheme.typography.titleMedium, - color = if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(bottom = MaterialTheme.dime.sm) - ) - // Use a text block that respects line breaks (usually done with \n) - Text( - text = content, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurface, - // Consider adding softWrap = true if content might overflow - // softWrap = true - ) - } - // Add divider after each section for better visual separation - HorizontalDivider(Modifier.padding(top = MaterialTheme.dime.sm)) -} - -// Make sure your DrugDetailState in ViewModel looks something like this: -// data class DrugDetailState( -// val isLoading: Boolean = false, -// val drugDetail: DrugModels? = null, // Changed to DrugModels? to match data access -// val isDetailVisible: Boolean = false, -// val error: String? = null -// ) +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.LayoutDirection +import com.approagency.pharmacy.data.dto.DrugDetail // Import DrugDetail directly +import com.approagency.pharmacy.presentation.common.CustomModalBottomSheet +import com.approagency.pharmacy.presentation.viewModel.DrugDetailState +import com.approagency.pharmacy.presentation.viewModel.HomeViewModel +import com.vada.caller.ui.theme.dime // Assuming this is your custom spacing/dimension object + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun DrugDetailSheet( + viewModel: HomeViewModel, + state: DrugDetailState // Assuming you pass the state containing the detail +) { + val detail: DrugDetail? = state.drugDetail?.getOrNull()?.data + + // Only show the sheet if detail is not null + if (detail != null) { + CustomModalBottomSheet( + onDismiss = { + viewModel.closeDetail() + }, + content = { + // Use a LazyColumn for scrollable content inside the sheet + + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.dime.lg), + contentPadding = PaddingValues(bottom = MaterialTheme.dime.lg) // Add padding to the bottom of the content for better scrolling + ) { + // --- 1. Main Title --- + item { // Use item {} for single composables within LazyColumn + Text( + text = detail.nam_fa ?: "جزئیات دارو", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = MaterialTheme.dime.md) + ) + Text( + text = detail.nam_en ?: "N/A (English Name)", + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = MaterialTheme.dime.lg) + ) + + // Divider for visual separation + HorizontalDivider(Modifier.padding(bottom = MaterialTheme.dime.md)) + } + + // --- 2. Key Groupings --- + // Goroh Darmani (Pharmacological Group) + detail.goroh_darmani?.let { group -> + item { + DetailRow( + title = "گروه درمانی", + value = group.nam_fa ?: "نامشخص" + ) + } + group.nam_en?.let { enName -> + item { + DetailRow( + title = "Group (EN)", + value = enName + ) + } + } + } + + // Goroh Darmanei (Therapeutic Group) + detail.goroh_daroei?.let { group -> + item { + DetailRow( + title = "گروه دارویی", + value = group.nam ?: "نامشخص" + ) + } + } + + // Goroh Farmakologic (Pharmacological Class) + detail.goroh_farmakologic_cod?.let { cod -> + // NOTE: You might need a separate API call or mapping here + // if cod needs to be translated to a name. For now, we show the code. + item { + DetailRow( + title = "کلاس فارماکولوژیک", + value = cod.toString() + ) + } + } + + item { // Add a divider as a separate item + HorizontalDivider(Modifier.padding(vertical = MaterialTheme.dime.md)) + } + + // --- 3. Usage & Mechanism xw--- + detail.mavaredmasraf?.let { usage -> + item { + DetailSection(title = "موارد مصرف", content = usage) + } + } + + detail.mekanismtasir?.let { mechanism -> + item { + DetailSection(title = "مکانیسم اثر", content = mechanism) + } + } + + // --- 4. Warnings & Storage --- + detail.hoshdar?.let { warning -> + item { + DetailSection( + title = "هشدارها", + content = warning, + isWarning = true + ) + } + } + + detail.sharayetnegahdari?.let { storage -> + item { + DetailSection( + title = "شرایط نگهداری", + content = storage + ) + } + } + } + } + } + ) + } +} + +// --- Helper Composables for Clean Code --- + +@Composable +fun DetailRow( + title: String, + value: String +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = MaterialTheme.dime.sm), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = title, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Right + ) + Text( + text = value, + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.SemiBold, + textAlign = TextAlign.End, + // Ensure text takes up available space and doesn't push other elements. + // Using weight(1f, fill = false) is good for aligning to the end if there's space. + modifier = Modifier.weight(1f, fill = false) + ) + } +} + +@Composable +fun DetailSection( + title: String, + content: String, + isWarning: Boolean = false +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = MaterialTheme.dime.md) + ) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + color = if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = MaterialTheme.dime.sm) + ) + // Use a text block that respects line breaks (usually done with \n) + Text( + text = content, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurface, + // Consider adding softWrap = true if content might overflow + // softWrap = true + ) + } + // Add divider after each section for better visual separation + HorizontalDivider(Modifier.padding(top = MaterialTheme.dime.sm)) +} + +// Make sure your DrugDetailState in ViewModel looks something like this: +// data class DrugDetailState( +// val isLoading: Boolean = false, +// val drugDetail: DrugModels? = null, // Changed to DrugModels? to match data access +// val isDetailVisible: Boolean = false, +// val error: String? = null +// ) diff --git a/app/src/main/java/com/approagency/drug/presentation/components/TestDetailSheet.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/TestDetailSheet.kt similarity index 88% rename from app/src/main/java/com/approagency/drug/presentation/components/TestDetailSheet.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/TestDetailSheet.kt index aadf0cb..63b8da4 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/TestDetailSheet.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/TestDetailSheet.kt @@ -1,122 +1,119 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.LayoutDirection -import androidx.compose.ui.unit.dp -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.presentation.common.CustomModalBottomSheet -import com.approagency.drug.presentation.viewModel.LabViewModel -import com.approagency.drug.presentation.viewModel.TestItemState -import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.flow.collect - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun TestDetailSheet(state: TestItemState, testGroup: TestGroup, onDismiss: () -> Unit) { - if (state.testItem != null) { - val testItems by state.testItem.collectAsState(initial = emptyList()) - - CustomModalBottomSheet( - onDismiss = onDismiss, - content = { - CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = MaterialTheme.dime.lg), - contentPadding = PaddingValues(bottom = MaterialTheme.dime.lg) - ) { - item { - Text( - text = testGroup.fname ?: "جزئیات آزمایش", - style = MaterialTheme.typography.headlineMedium, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(bottom = MaterialTheme.dime.md) - ) - Text( - text = testGroup.ename ?: "N/A (English Name)", - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(bottom = MaterialTheme.dime.sm) - ) - if (testGroup.detail != null){ - Text(testGroup.detail , style = MaterialTheme.typography.bodySmall,modifier = Modifier.padding(bottom = MaterialTheme.dime.md) ) - } - - - - HorizontalDivider(Modifier.padding(bottom = MaterialTheme.dime.md)) - } - - if (testItems.isEmpty()) { - item { - - } - } else { - items(testItems) { testItem -> - TestItemDetailCard(testItem = testItem) - } - } - - - } - } - } - ) - } -} - -@Composable -fun TestItemDetailCard(testItem: com.approagency.drug.domain.model.TestItem) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = MaterialTheme.dime.md) - ) { - Text( - text = testItem.title ?: "بدون عنوان", - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.SemiBold - ) - - if (!testItem.normalValue.isNullOrBlank()) { - Text( - text = "مقدار نرمال: ${testItem.normalValue}", - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.primary, - modifier = Modifier.padding(top = MaterialTheme.dime.xs) - ) - } - - if (!testItem.detail.isNullOrBlank()) { - Text( - text = testItem.detail, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = MaterialTheme.dime.sm) - ) - } - - HorizontalDivider( - modifier = Modifier.padding(top = MaterialTheme.dime.md), - thickness = 0.5.dp - ) - } +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.presentation.common.CustomModalBottomSheet +import com.approagency.pharmacy.presentation.viewModel.TestItemState +import com.vada.caller.ui.theme.dime + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TestDetailSheet(state: TestItemState, testGroup: TestGroup, onDismiss: () -> Unit) { + if (state.testItem != null) { + val testItems by state.testItem.collectAsState(initial = emptyList()) + + CustomModalBottomSheet( + onDismiss = onDismiss, + content = { + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.dime.lg), + contentPadding = PaddingValues(bottom = MaterialTheme.dime.lg) + ) { + item { + Text( + text = testGroup.fname ?: "جزئیات آزمایش", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = MaterialTheme.dime.md) + ) + Text( + text = testGroup.ename ?: "N/A (English Name)", + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = MaterialTheme.dime.sm) + ) + if (testGroup.detail != null){ + Text(testGroup.detail , style = MaterialTheme.typography.bodySmall,modifier = Modifier.padding(bottom = MaterialTheme.dime.md) ) + } + + + + HorizontalDivider(Modifier.padding(bottom = MaterialTheme.dime.md)) + } + + if (testItems.isEmpty()) { + item { + + } + } else { + items(testItems) { testItem -> + TestItemDetailCard(testItem = testItem) + } + } + + + } + } + } + ) + } +} + +@Composable +fun TestItemDetailCard(testItem: com.approagency.pharmacy.domain.model.TestItem) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = MaterialTheme.dime.md) + ) { + Text( + text = testItem.title ?: "بدون عنوان", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + + if (!testItem.normalValue.isNullOrBlank()) { + Text( + text = "مقدار نرمال: ${testItem.normalValue}", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(top = MaterialTheme.dime.xs) + ) + } + + if (!testItem.detail.isNullOrBlank()) { + Text( + text = testItem.detail, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = MaterialTheme.dime.sm) + ) + } + + HorizontalDivider( + modifier = Modifier.padding(top = MaterialTheme.dime.md), + thickness = 0.5.dp + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/TestGroupItemContent.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/TestGroupItemContent.kt similarity index 93% rename from app/src/main/java/com/approagency/drug/presentation/components/TestGroupItemContent.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/TestGroupItemContent.kt index 2e96a6a..c15225a 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/TestGroupItemContent.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/TestGroupItemContent.kt @@ -1,90 +1,90 @@ -package com.approagency.drug.presentation.components - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.AbsoluteAlignment -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDirection -import androidx.compose.ui.text.style.TextOverflow -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.presentation.common.CustomBox -import com.vada.caller.ui.theme.dime - - -@Composable -fun TestGroupItemContent( - group: TestGroup, - onClick: () -> Unit -) { - - CustomBox( - modifier = Modifier - .padding(bottom = MaterialTheme.dime.sm) - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - onClick() - }, - ) { - Row( - modifier = Modifier.padding(all = MaterialTheme.dime.lg), - ) { - Column ( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = AbsoluteAlignment.Right -// horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(group.fname ?: "" , style = MaterialTheme.typography.labelLarge , textAlign = TextAlign.Right ) - Text(group.ename ?: "" , style = MaterialTheme.typography.bodySmall , textAlign = TextAlign.Left) - Spacer(modifier = Modifier.padding(vertical = MaterialTheme.dime.xs)) - Text(group.detail ?: "" , style = MaterialTheme.typography.bodySmall.copy( - textDirection = TextDirection.Rtl - ) , textAlign = TextAlign.Right , maxLines = 2 , softWrap = true , overflow = TextOverflow.Ellipsis) - } - Row ( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center - ) { - TextButton( - onClick = { - onClick() - } - ) { - Row( - horizontalArrangement = Arrangement.Center - ) { - Icon( - imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft - , contentDescription = "see more" - ) - Text("مشاهده جزییات") - } - } - } - } - - } - } - +package com.approagency.pharmacy.presentation.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.AbsoluteAlignment +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDirection +import androidx.compose.ui.text.style.TextOverflow +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.presentation.common.CustomBox +import com.vada.caller.ui.theme.dime + + +@Composable +fun TestGroupItemContent( + group: TestGroup, + onClick: () -> Unit +) { + + CustomBox( + modifier = Modifier + .padding(bottom = MaterialTheme.dime.sm) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + onClick() + }, + ) { + Row( + modifier = Modifier.padding(all = MaterialTheme.dime.lg), + ) { + Column ( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.Start + ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = AbsoluteAlignment.Right +// horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(group.fname ?: "" , style = MaterialTheme.typography.labelLarge , textAlign = TextAlign.Right ) + Text(group.ename ?: "" , style = MaterialTheme.typography.bodySmall , textAlign = TextAlign.Left) + Spacer(modifier = Modifier.padding(vertical = MaterialTheme.dime.xs)) + Text(group.detail ?: "" , style = MaterialTheme.typography.bodySmall.copy( + textDirection = TextDirection.Rtl + ) , textAlign = TextAlign.Right , maxLines = 2 , softWrap = true , overflow = TextOverflow.Ellipsis) + } + Row ( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + TextButton( + onClick = { + onClick() + } + ) { + Row( + horizontalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.AutoMirrored.TwoTone.KeyboardArrowLeft + , contentDescription = "see more" + ) + Text("مشاهده جزییات") + } + } + } + } + + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/presentation/components/showYabDetail.kt b/app/src/main/java/com/approagency/pharmacy/presentation/components/showYabDetail.kt similarity index 94% rename from app/src/main/java/com/approagency/drug/presentation/components/showYabDetail.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/components/showYabDetail.kt index de08c02..8ed6d3a 100644 --- a/app/src/main/java/com/approagency/drug/presentation/components/showYabDetail.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/components/showYabDetail.kt @@ -1,27 +1,20 @@ -package com.approagency.drug.presentation.components +package com.approagency.pharmacy.presentation.components -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.FilterChip -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -33,23 +26,18 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.approagency.drug.R -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.presentation.common.CustomModalBottomSheet -import com.approagency.drug.presentation.common.ErrorState -import com.approagency.drug.presentation.viewModel.DrugDetailViewModel -import com.approagency.drug.presentation.viewModel.DrugDetailYabState +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.presentation.common.CustomModalBottomSheet +import com.approagency.pharmacy.presentation.common.ErrorState +import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel +import com.approagency.pharmacy.presentation.viewModel.DrugDetailYabState import com.vada.caller.ui.theme.LocalDime -import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.delay @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -421,7 +409,7 @@ fun InfoSection( } @Composable -fun DosageFormsSection(dosageForms: List) { +fun DosageFormsSection(dosageForms: List) { val dime = LocalDime.current Column { @@ -477,7 +465,7 @@ fun DosageFormsSection(dosageForms: List) { +fun BrandNamesSection(brandNames: List) { val dime = LocalDime.current Column { diff --git a/app/src/main/java/com/approagency/drug/presentation/screens/DrugDetailScreen.kt b/app/src/main/java/com/approagency/pharmacy/presentation/screens/DrugDetailScreen.kt similarity index 98% rename from app/src/main/java/com/approagency/drug/presentation/screens/DrugDetailScreen.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/screens/DrugDetailScreen.kt index 56d2799..404f3ca 100644 --- a/app/src/main/java/com/approagency/drug/presentation/screens/DrugDetailScreen.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/screens/DrugDetailScreen.kt @@ -1,7 +1,5 @@ -package com.approagency.drug.presentation.screens +package com.approagency.pharmacy.presentation.screens -import android.R -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -26,7 +24,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.SecondaryTabRow import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.Text @@ -50,12 +47,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.presentation.common.ErrorState -import com.approagency.drug.presentation.viewModel.DrugDetailViewModel -import com.approagency.drug.presentation.viewModel.DrugDetailYabState +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.presentation.common.ErrorState +import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel +import com.approagency.pharmacy.presentation.viewModel.DrugDetailYabState import com.vada.caller.ui.theme.LocalDime -import com.vada.caller.ui.theme.dime import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -231,7 +227,7 @@ fun DrugDetailScreen( @Composable fun ManufacturerInfoCard( manufacturer: String, - genericInfo: com.approagency.drug.domain.model.GenericInfo?, + genericInfo: com.approagency.pharmacy.domain.model.GenericInfo?, modifier: Modifier = Modifier ) { val dime = LocalDime.current diff --git a/app/src/main/java/com/approagency/drug/presentation/screens/HomeScreen.kt b/app/src/main/java/com/approagency/pharmacy/presentation/screens/HomeScreen.kt similarity index 71% rename from app/src/main/java/com/approagency/drug/presentation/screens/HomeScreen.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/screens/HomeScreen.kt index a8864b5..8a19b1f 100644 --- a/app/src/main/java/com/approagency/drug/presentation/screens/HomeScreen.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/screens/HomeScreen.kt @@ -1,251 +1,210 @@ -package com.approagency.drug.presentation.screens - -import android.R -import android.R.attr.fontWeight -import android.content.res.Resources -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.gestures.snapping.SnapPosition -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListScope -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft -import androidx.compose.material.icons.filled.Info -import androidx.compose.material.icons.filled.KeyboardArrowLeft -import androidx.compose.material.icons.filled.KeyboardArrowRight -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.twotone.Info -import androidx.compose.material.icons.twotone.KeyboardArrowLeft -import androidx.compose.material.icons.twotone.KeyboardArrowRight -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.material3.TextField -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.LayoutDirection -import androidx.compose.ui.unit.TextUnit -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavController -import com.approagency.drug.data.dto.DrugDetail -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.CustomModalBottomSheet -import com.approagency.drug.presentation.common.CustomModalDialog -import com.approagency.drug.presentation.common.CustomTextFilled -import com.approagency.drug.presentation.common.Loading -import com.approagency.drug.presentation.common.PrimaryButton -import com.approagency.drug.presentation.components.DarmanContent -import com.approagency.drug.presentation.components.DrugDetailSheet -import com.approagency.drug.presentation.components.DrugListContent -import com.approagency.drug.presentation.components.EmptyStateContent -import com.approagency.drug.presentation.viewModel.CombineState -import com.approagency.drug.presentation.viewModel.HomeEvent -import com.approagency.drug.presentation.viewModel.HomeViewModel -import com.vada.caller.ui.theme.Dime -import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.flow.SharedFlow -import org.koin.androidx.compose.koinViewModel - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun HomeScreen( - navController : NavController, - modifier: Modifier, - viewModel: HomeViewModel = koinViewModel() -) { - val state by viewModel.uiState.collectAsState() - val focusManager = LocalFocusManager.current - val keyboardController = LocalSoftwareKeyboardController.current - if (state.drugDetailState.isDetailVisible) { - DrugDetailSheet( - viewModel = viewModel, - state = state.drugDetailState - ) - } - HomeContent( - modifier = modifier, - state = state, - viewModelEvent = viewModel.event, - onSearch = { value -> - if (value is Int) { - viewModel.searchDrugs(DrugSearchParams(healGroup = value)) - } else if (value is String) { - viewModel.searchDrugs(DrugSearchParams(query = value)) - } - keyboardController?.hide() - focusManager.clearFocus()}, - onRetry = { - viewModel.getDarmani() - }, - onDrugClick = { drugId -> viewModel.drugDetail(drugId , allDrugs = state.drugSearchState.drugsData) } - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun HomeContent( - state: CombineState, - viewModelEvent: SharedFlow, - onSearch: (Any) -> Unit, - onRetry: () -> Unit, - onDrugClick: (Int) -> Unit, - modifier: Modifier = Modifier -) { - var searchText by remember { mutableStateOf("") } - Column( - modifier = modifier - .fillMaxSize().padding(horizontal = MaterialTheme.dime.md) - .padding(top = MaterialTheme.dime.md), - horizontalAlignment = Alignment.Start, - ) { - Column ( - verticalArrangement = Arrangement.Center - ){ -// CustomTextFilled( -// value = searchText, -// onValueChange = { searchText = it }, -// onSearch = { query -> -// if (query.isNotBlank()) { -// onSearch(query) -// } -// }, -// placeholder = "جستجوی دارو", -// showClearButton = true, -// showSearchButton = true, -// autoSearch = false, // Set to true if you want search while typing -// height = 45 -// ) -// Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) -// PrimaryButton( -// text = "جستجو", -// height = 40, -// isLoading = state.drugSearchState.isLoading, -// onClick = { -// if (searchText.isNotBlank()) { -// onSearch(searchText) -// } -// } -// ) -// Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) - Box(modifier = Modifier.fillMaxSize()) { - - // Always draw the data if available - if (state.drugSearchState.drugsData != null && !state.showDarmanList) { - Column { - Row( - horizontalArrangement = Arrangement.End, - modifier = Modifier.fillMaxWidth() - ) { - TextButton( - onClick = { - onRetry() - } - ) { - Text("مشاهده تمامی گروه های دارویی") - Icon( - imageVector = Icons.Default.KeyboardArrowRight, - contentDescription = "back" - ) - Spacer(modifier = Modifier.width(MaterialTheme.dime.sm)) - } - } - DrugListContent( - drugsData = state.drugSearchState.drugsData, - onDrugClick = onDrugClick - ) - } - } - else if (state.darmanState.getDarmani != null ){ - Column { - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.End - ) { - Text("لیست گروه های دارویی" , style = MaterialTheme.typography.labelLarge.copy( - color = MaterialTheme.colorScheme.primary - ) ,modifier= Modifier.padding(MaterialTheme.dime.md)) - } - - DarmanContent( - darmanData = state.darmanState.getDarmani, - onDarmanClick = { value -> - onSearch(value) - }, - onRetryClick = { - onRetry() - } - ) - } - } else { - EmptyStateContent() - } - - - - // Draw the loading dialog on top if needed - if (state.drugSearchState.isLoading || state.drugDetailState.isLoading || state.darmanState.isLoading) { - CustomModalDialog( - onDismissRequest = { /* maybe disable dismiss while loading */ }, - content = { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Loading(color = MaterialTheme.colorScheme.primary) - Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) - Text("در حال جستجو..." , textAlign = TextAlign.Right) - } - }, -// modifier = Modifier -// .matchParentSize() -// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) - ) - } - } - - - } - } -} - - - - - +package com.approagency.pharmacy.presentation.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowRight +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.style.TextAlign +import androidx.navigation.NavController +import com.approagency.pharmacy.domain.model.DrugSearchParams +import com.approagency.pharmacy.presentation.common.CustomModalDialog +import com.approagency.pharmacy.presentation.common.Loading +import com.approagency.pharmacy.presentation.components.DarmanContent +import com.approagency.pharmacy.presentation.components.DrugDetailSheet +import com.approagency.pharmacy.presentation.components.DrugListContent +import com.approagency.pharmacy.presentation.components.EmptyStateContent +import com.approagency.pharmacy.presentation.viewModel.CombineState +import com.approagency.pharmacy.presentation.viewModel.HomeEvent +import com.approagency.pharmacy.presentation.viewModel.HomeViewModel +import com.vada.caller.ui.theme.dime +import kotlinx.coroutines.flow.SharedFlow +import org.koin.androidx.compose.koinViewModel + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreen( + navController : NavController, + modifier: Modifier, + viewModel: HomeViewModel = koinViewModel() +) { + val state by viewModel.uiState.collectAsState() + val focusManager = LocalFocusManager.current + val keyboardController = LocalSoftwareKeyboardController.current + if (state.drugDetailState.isDetailVisible) { + DrugDetailSheet( + viewModel = viewModel, + state = state.drugDetailState + ) + } + HomeContent( + modifier = modifier, + state = state, + viewModelEvent = viewModel.event, + onSearch = { value -> + if (value is Int) { + viewModel.searchDrugs(DrugSearchParams(healGroup = value)) + } else if (value is String) { + viewModel.searchDrugs(DrugSearchParams(query = value)) + } + keyboardController?.hide() + focusManager.clearFocus()}, + onRetry = { + viewModel.getDarmani() + }, + onDrugClick = { drugId -> viewModel.drugDetail(drugId , allDrugs = state.drugSearchState.drugsData) } + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeContent( + state: CombineState, + viewModelEvent: SharedFlow, + onSearch: (Any) -> Unit, + onRetry: () -> Unit, + onDrugClick: (Int) -> Unit, + modifier: Modifier = Modifier +) { + var searchText by remember { mutableStateOf("") } + Column( + modifier = modifier + .fillMaxSize().padding(horizontal = MaterialTheme.dime.md) + .padding(top = MaterialTheme.dime.md), + horizontalAlignment = Alignment.Start, + ) { + Column ( + verticalArrangement = Arrangement.Center + ){ +// CustomTextFilled( +// value = searchText, +// onValueChange = { searchText = it }, +// onSearch = { query -> +// if (query.isNotBlank()) { +// onSearch(query) +// } +// }, +// placeholder = "جستجوی دارو", +// showClearButton = true, +// showSearchButton = true, +// autoSearch = false, // Set to true if you want search while typing +// height = 45 +// ) +// Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) +// PrimaryButton( +// text = "جستجو", +// height = 40, +// isLoading = state.drugSearchState.isLoading, +// onClick = { +// if (searchText.isNotBlank()) { +// onSearch(searchText) +// } +// } +// ) +// Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) + Box(modifier = Modifier.fillMaxSize()) { + + // Always draw the data if available + if (state.drugSearchState.drugsData != null && !state.showDarmanList) { + Column { + Row( + horizontalArrangement = Arrangement.End, + modifier = Modifier.fillMaxWidth() + ) { + TextButton( + onClick = { + onRetry() + } + ) { + Text("مشاهده تمامی گروه های دارویی") + Icon( + imageVector = Icons.Default.KeyboardArrowRight, + contentDescription = "back" + ) + Spacer(modifier = Modifier.width(MaterialTheme.dime.sm)) + } + } + DrugListContent( + drugsData = state.drugSearchState.drugsData, + onDrugClick = onDrugClick + ) + } + } + else if (state.darmanState.getDarmani != null ){ + Column { + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End + ) { + Text("لیست گروه های دارویی" , style = MaterialTheme.typography.labelLarge.copy( + color = MaterialTheme.colorScheme.primary + ) ,modifier= Modifier.padding(MaterialTheme.dime.md)) + } + + DarmanContent( + darmanData = state.darmanState.getDarmani, + onDarmanClick = { value -> + onSearch(value) + }, + onRetryClick = { + onRetry() + } + ) + } + } else { + EmptyStateContent() + } + + + + // Draw the loading dialog on top if needed + if (state.drugSearchState.isLoading || state.drugDetailState.isLoading || state.darmanState.isLoading) { + CustomModalDialog( + onDismissRequest = { /* maybe disable dismiss while loading */ }, + content = { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Loading(color = MaterialTheme.colorScheme.primary) + Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) + Text("در حال جستجو..." , textAlign = TextAlign.Right) + } + }, +// modifier = Modifier +// .matchParentSize() +// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) + ) + } + } + + + } + } +} + + + + + diff --git a/app/src/main/java/com/approagency/drug/presentation/screens/LabScreen.kt b/app/src/main/java/com/approagency/pharmacy/presentation/screens/LabScreen.kt similarity index 79% rename from app/src/main/java/com/approagency/drug/presentation/screens/LabScreen.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/screens/LabScreen.kt index 99c297e..85bedff 100644 --- a/app/src/main/java/com/approagency/drug/presentation/screens/LabScreen.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/screens/LabScreen.kt @@ -1,207 +1,190 @@ -package com.approagency.drug.presentation.screens - -import android.R.attr.onClick -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowLeft -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.AbsoluteAlignment -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDirection -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.domain.model.TestItem -import com.approagency.drug.presentation.common.CustomBox -import com.approagency.drug.presentation.common.CustomModalDialog -import com.approagency.drug.presentation.common.CustomTextFilled -import com.approagency.drug.presentation.common.Loading -import com.approagency.drug.presentation.common.PrimaryButton -import com.approagency.drug.presentation.components.RetryContent -import com.approagency.drug.presentation.components.SearchResultsContent -import com.approagency.drug.presentation.components.TestDetailSheet -import com.approagency.drug.presentation.components.TestGroupItemContent -import com.approagency.drug.presentation.viewModel.LabViewModel -import com.vada.caller.ui.theme.dime -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.count -import org.koin.androidx.compose.koinViewModel - -@Composable -fun LabScreen( - modifier: Modifier = Modifier, - viewModel: LabViewModel = koinViewModel() -) { - val testGroupsState by viewModel.testGroups.collectAsState() - val testItemsState by viewModel.testItems.collectAsState() - val searchResultsState by viewModel.searchResults.collectAsState() - - val isLoading = testGroupsState.isLoading || testItemsState.isLoading || searchResultsState.isLoading - val error = testGroupsState.error ?: searchResultsState.error - val testGroups = testGroupsState.testGroup - - var selectedGroup by remember { mutableStateOf(null) } - var selectedItem by remember { mutableStateOf(null) } - var showSheet by remember { mutableStateOf(false) } - var searchText by remember { mutableStateOf("") } - Column(modifier = modifier.fillMaxSize().padding(horizontal = MaterialTheme.dime.md) - .padding(top = MaterialTheme.dime.md),) { - CustomTextFilled( - value = searchText, - onValueChange = { - searchText = it - viewModel.updateSearchQuery(it) - }, - onSearch = { query -> - if (query.isNotBlank()) { - viewModel.updateSearchQuery(query) - } - }, - placeholder = "جستجو در گروه‌ها و آیتم‌های آزمایشگاهی", - showClearButton = true, - showSearchButton = true, - autoSearch = true, - height = 45 - ) - Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) - PrimaryButton( - text = "جستجو", - height = 40, - isLoading =false, - onClick = {} - ) - Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) - if (searchResultsState.query.isNotBlank()) { - // Search Results Section - SearchResultsContent( - searchResult = searchResultsState.searchResults, - isLoading = searchResultsState.isLoading, - error = searchResultsState.error, - onGroupClick = { group -> - selectedGroup = group - viewModel.getItemByGroupId(group.id) - showSheet = true - }, - onItemClick = { item -> - selectedItem = item - // You can show item detail sheet here - // For now, we'll show the parent group - viewModel.getItemByGroupId(item.groupId) - showSheet = true - }, - onClearSearch = { - searchText = "" - viewModel.clearSearch() - viewModel.loadTestGroups() - } - ) - } else if(error != null){ - RetryContent(modifier = modifier , error = error , onClick = { - viewModel.loadTestGroups() - }) - } - else if (testGroups != null){ - TestGroupsList( - testGroupsFlow = testGroups, - viewModel = viewModel, - onGroupClick = { group -> - selectedGroup = group - viewModel.getItemByGroupId(group.id) - showSheet = true - } - ) - } - else { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Text("هیچ داده‌ای موجود نیست") - } - } - - } - if (isLoading) { - CustomModalDialog( - onDismissRequest = { /* maybe disable dismiss while loading */ }, - content = { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Loading(color = MaterialTheme.colorScheme.primary) - Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) - Text("در حال جستجو..." , textAlign = TextAlign.Right) - } - }, -// modifier = Modifier -// .matchParentSize() -// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) - ) - } - if (showSheet && selectedGroup != null) { - TestDetailSheet( - state = testItemsState, - testGroup = selectedGroup!!, - onDismiss = { showSheet = false } - ) - } -} - -@Composable -fun TestGroupsList( - testGroupsFlow: Flow>, - viewModel: LabViewModel, - onGroupClick: (TestGroup) -> Unit -) { - val testGroups by testGroupsFlow.collectAsState(initial = emptyList()) - - if (testGroups.isEmpty()) { - CustomModalDialog( - onDismissRequest = { /* maybe disable dismiss while loading */ }, - content = { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Loading(color = MaterialTheme.colorScheme.primary) - Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) - Text("در حال جستجو..." , textAlign = TextAlign.Right) - } - }, -// modifier = Modifier -// .matchParentSize() -// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) - ) - } else { - LazyColumn( - modifier = Modifier.fillMaxSize() - .fillMaxSize().padding( vertical =MaterialTheme.dime.md ) - ) { - items(testGroups) { group -> - TestGroupItemContent( - group = group, - onClick = { onGroupClick(group) } - ) - } - } - } -} +package com.approagency.pharmacy.presentation.screens + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.domain.model.TestItem +import com.approagency.pharmacy.presentation.common.CustomModalDialog +import com.approagency.pharmacy.presentation.common.CustomTextFilled +import com.approagency.pharmacy.presentation.common.Loading +import com.approagency.pharmacy.presentation.common.PrimaryButton +import com.approagency.pharmacy.presentation.components.RetryContent +import com.approagency.pharmacy.presentation.components.SearchResultsContent +import com.approagency.pharmacy.presentation.components.TestDetailSheet +import com.approagency.pharmacy.presentation.components.TestGroupItemContent +import com.approagency.pharmacy.presentation.viewModel.LabViewModel +import com.vada.caller.ui.theme.dime +import kotlinx.coroutines.flow.Flow +import org.koin.androidx.compose.koinViewModel + +@Composable +fun LabScreen( + modifier: Modifier = Modifier, + viewModel: LabViewModel = koinViewModel() +) { + val testGroupsState by viewModel.testGroups.collectAsState() + val testItemsState by viewModel.testItems.collectAsState() + val searchResultsState by viewModel.searchResults.collectAsState() + + val isLoading = testGroupsState.isLoading || testItemsState.isLoading || searchResultsState.isLoading + val error = testGroupsState.error ?: searchResultsState.error + val testGroups = testGroupsState.testGroup + + var selectedGroup by remember { mutableStateOf(null) } + var selectedItem by remember { mutableStateOf(null) } + var showSheet by remember { mutableStateOf(false) } + var searchText by remember { mutableStateOf("") } + Column(modifier = modifier.fillMaxSize().padding(horizontal = MaterialTheme.dime.md) + .padding(top = MaterialTheme.dime.md),) { + CustomTextFilled( + value = searchText, + onValueChange = { + searchText = it + viewModel.updateSearchQuery(it) + }, + onSearch = { query -> + if (query.isNotBlank()) { + viewModel.updateSearchQuery(query) + } + }, + placeholder = "جستجو در گروه‌ها و آیتم‌های آزمایشگاهی", + showClearButton = true, + showSearchButton = true, + autoSearch = true, + height = 45 + ) + Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) + PrimaryButton( + text = "جستجو", + height = 40, + isLoading =false, + onClick = {} + ) + Spacer(modifier = Modifier.height(MaterialTheme.dime.xs)) + if (searchResultsState.query.isNotBlank()) { + // Search Results Section + SearchResultsContent( + searchResult = searchResultsState.searchResults, + isLoading = searchResultsState.isLoading, + error = searchResultsState.error, + onGroupClick = { group -> + selectedGroup = group + viewModel.getItemByGroupId(group.id) + showSheet = true + }, + onItemClick = { item -> + selectedItem = item + // You can show item detail sheet here + // For now, we'll show the parent group + viewModel.getItemByGroupId(item.groupId) + showSheet = true + }, + onClearSearch = { + searchText = "" + viewModel.clearSearch() + viewModel.loadTestGroups() + } + ) + } else if(error != null){ + RetryContent(modifier = modifier , error = error , onClick = { + viewModel.loadTestGroups() + }) + } + else if (testGroups != null){ + TestGroupsList( + testGroupsFlow = testGroups, + viewModel = viewModel, + onGroupClick = { group -> + selectedGroup = group + viewModel.getItemByGroupId(group.id) + showSheet = true + } + ) + } + else { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text("هیچ داده‌ای موجود نیست") + } + } + + } + if (isLoading) { + CustomModalDialog( + onDismissRequest = { /* maybe disable dismiss while loading */ }, + content = { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Loading(color = MaterialTheme.colorScheme.primary) + Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) + Text("در حال جستجو..." , textAlign = TextAlign.Right) + } + }, +// modifier = Modifier +// .matchParentSize() +// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) + ) + } + if (showSheet && selectedGroup != null) { + TestDetailSheet( + state = testItemsState, + testGroup = selectedGroup!!, + onDismiss = { showSheet = false } + ) + } +} + +@Composable +fun TestGroupsList( + testGroupsFlow: Flow>, + viewModel: LabViewModel, + onGroupClick: (TestGroup) -> Unit +) { + val testGroups by testGroupsFlow.collectAsState(initial = emptyList()) + + if (testGroups.isEmpty()) { + CustomModalDialog( + onDismissRequest = { /* maybe disable dismiss while loading */ }, + content = { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Loading(color = MaterialTheme.colorScheme.primary) + Spacer(modifier = Modifier.height(MaterialTheme.dime.sm)) + Text("در حال جستجو..." , textAlign = TextAlign.Right) + } + }, +// modifier = Modifier +// .matchParentSize() +// .background(MaterialTheme.colorScheme.background.copy(alpha = 0.5f)) + ) + } else { + LazyColumn( + modifier = Modifier.fillMaxSize() + .fillMaxSize().padding( vertical =MaterialTheme.dime.md ) + ) { + items(testGroups) { group -> + TestGroupItemContent( + group = group, + onClick = { onGroupClick(group) } + ) + } + } + } +} diff --git a/app/src/main/java/com/approagency/drug/presentation/screens/RootScreen.kt b/app/src/main/java/com/approagency/pharmacy/presentation/screens/RootScreen.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/screens/RootScreen.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/screens/RootScreen.kt index c60d65f..ec42216 100644 --- a/app/src/main/java/com/approagency/drug/presentation/screens/RootScreen.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/screens/RootScreen.kt @@ -1,124 +1,124 @@ -package com.approagency.drug.presentation.screens - -import android.annotation.SuppressLint -import android.app.Activity -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides -import androidx.compose.foundation.layout.consumeWindowInsets -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.only -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Build -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.rounded.Refresh -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.NavigationBarItemDefaults -import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.LayoutDirection -import androidx.compose.ui.unit.dp -import androidx.navigation.NavHostController -@SuppressLint("ConfigurationScreenWidthHeight") -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun RootScreen(navHostController: NavHostController, modifier: Modifier){ - val pages = listOf( - "دارو" to Icons.Default.Search, - "آزمایش" to Icons.Default.Build, - "سرچ" to Icons.Rounded.Refresh - ) - var seletedTab by remember { mutableStateOf(0) } - val context = LocalContext.current - val activity = context as Activity - - Scaffold ( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, - topBar = { CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl){ - TopAppBar( - colors = TopAppBarDefaults.topAppBarColors( - containerColor = MaterialTheme.colorScheme.primaryContainer, - titleContentColor = MaterialTheme.colorScheme.primary, - ), - title = { - Text("دستیار سلامت" , textAlign = TextAlign.Right , style = MaterialTheme.typography.titleLarge , fontWeight = FontWeight.W700 ) - } - ) - }}, - bottomBar = { - NavigationBar( - containerColor = MaterialTheme.colorScheme.surface, - modifier = Modifier - .fillMaxWidth() - .height(110.dp).padding(bottom = 2.dp).clip(MaterialTheme.shapes.extraLarge), - tonalElevation = 8.dp, // subtle shadow - windowInsets = WindowInsets.navigationBars - .only(WindowInsetsSides.Bottom) - ) { - pages.forEachIndexed { index, item -> - val selected = seletedTab == index - - NavigationBarItem( - colors = NavigationBarItemDefaults.colors( - selectedIconColor = MaterialTheme.colorScheme.onPrimary, - selectedTextColor = MaterialTheme.colorScheme.primary, - indicatorColor = MaterialTheme.colorScheme.primary, - unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant, - unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant - ), - selected = selected, - onClick = { seletedTab = index }, - - icon = { - Icon( - imageVector = item.second, - contentDescription = item.first, - modifier = Modifier.size(16.dp) - ) - }, - - label = { - Text( - item.first, - style = MaterialTheme.typography.labelMedium - ) - }, - - alwaysShowLabel = true - ) - } - } - } - ) { - padding -> when (seletedTab) { - 0 -> HomeScreen( navController = navHostController,Modifier.padding(padding).consumeWindowInsets(padding)) - 1 -> LabScreen(Modifier.padding(padding)) - 2 -> SearchScreen( - navHostController, - modifier = Modifier.padding(padding).consumeWindowInsets(padding), - ) - } - } -} +package com.approagency.pharmacy.presentation.screens + +import android.annotation.SuppressLint +import android.app.Activity +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Build +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.rounded.Refresh +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.ScaffoldDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +@SuppressLint("ConfigurationScreenWidthHeight") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RootScreen(navHostController: NavHostController, modifier: Modifier){ + val pages = listOf( + "دارو" to Icons.Default.Search, + "آزمایش" to Icons.Default.Build, + "سرچ" to Icons.Rounded.Refresh + ) + var seletedTab by remember { mutableStateOf(0) } + val context = LocalContext.current + val activity = context as Activity + + Scaffold ( + contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + topBar = { CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl){ + TopAppBar( + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + titleContentColor = MaterialTheme.colorScheme.primary, + ), + title = { + Text("دستیار سلامت" , textAlign = TextAlign.Right , style = MaterialTheme.typography.titleLarge , fontWeight = FontWeight.W700 ) + } + ) + }}, + bottomBar = { + NavigationBar( + containerColor = MaterialTheme.colorScheme.surface, + modifier = Modifier + .fillMaxWidth() + .height(110.dp).padding(bottom = 2.dp).clip(MaterialTheme.shapes.extraLarge), + tonalElevation = 8.dp, // subtle shadow + windowInsets = WindowInsets.navigationBars + .only(WindowInsetsSides.Bottom) + ) { + pages.forEachIndexed { index, item -> + val selected = seletedTab == index + + NavigationBarItem( + colors = NavigationBarItemDefaults.colors( + selectedIconColor = MaterialTheme.colorScheme.onPrimary, + selectedTextColor = MaterialTheme.colorScheme.primary, + indicatorColor = MaterialTheme.colorScheme.primary, + unselectedIconColor = MaterialTheme.colorScheme.onSurfaceVariant, + unselectedTextColor = MaterialTheme.colorScheme.onSurfaceVariant + ), + selected = selected, + onClick = { seletedTab = index }, + + icon = { + Icon( + imageVector = item.second, + contentDescription = item.first, + modifier = Modifier.size(16.dp) + ) + }, + + label = { + Text( + item.first, + style = MaterialTheme.typography.labelMedium + ) + }, + + alwaysShowLabel = true + ) + } + } + } + ) { + padding -> when (seletedTab) { + 0 -> HomeScreen( navController = navHostController,Modifier.padding(padding).consumeWindowInsets(padding)) + 1 -> LabScreen(Modifier.padding(padding)) + 2 -> SearchScreen( + navHostController, + modifier = Modifier.padding(padding).consumeWindowInsets(padding), + ) + } + } +} diff --git a/app/src/main/java/com/approagency/drug/presentation/screens/SearchScreen.kt b/app/src/main/java/com/approagency/pharmacy/presentation/screens/SearchScreen.kt similarity index 90% rename from app/src/main/java/com/approagency/drug/presentation/screens/SearchScreen.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/screens/SearchScreen.kt index 47403a2..db1267c 100644 --- a/app/src/main/java/com/approagency/drug/presentation/screens/SearchScreen.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/screens/SearchScreen.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.presentation.screens +package com.approagency.pharmacy.presentation.screens import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -24,19 +24,19 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.navigation.NavController -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.navigation.Screen -import com.approagency.drug.presentation.common.CustomTextFilled -import com.approagency.drug.presentation.common.EmptySearchState -import com.approagency.drug.presentation.common.EndOfListIndicator -import com.approagency.drug.presentation.common.ErrorState -import com.approagency.drug.presentation.common.LoadingMoreIndicator -import com.approagency.drug.presentation.common.PrimaryButton -import com.approagency.drug.presentation.components.DaroYabSearchResult -import com.approagency.drug.presentation.components.DrugDetailBottomSheet -import com.approagency.drug.presentation.components.PharmacyBottomSheet -import com.approagency.drug.presentation.viewModel.DrugDetailViewModel -import com.approagency.drug.presentation.viewModel.PharmacyViewModel +import com.approagency.pharmacy.domain.model.DrugSearchResult +import com.approagency.pharmacy.navigation.Screen +import com.approagency.pharmacy.presentation.common.CustomTextFilled +import com.approagency.pharmacy.presentation.common.EmptySearchState +import com.approagency.pharmacy.presentation.common.EndOfListIndicator +import com.approagency.pharmacy.presentation.common.ErrorState +import com.approagency.pharmacy.presentation.common.LoadingMoreIndicator +import com.approagency.pharmacy.presentation.common.PrimaryButton +import com.approagency.pharmacy.presentation.components.DaroYabSearchResult +import com.approagency.pharmacy.presentation.components.DrugDetailBottomSheet +import com.approagency.pharmacy.presentation.components.PharmacyBottomSheet +import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel +import com.approagency.pharmacy.presentation.viewModel.PharmacyViewModel import com.approgency.drug.presentation.viewModel.SearchState import com.approgency.drug.presentation.viewModel.SearchViewModel import com.vada.caller.ui.theme.LocalDime diff --git a/app/src/main/java/com/approagency/drug/presentation/viewModel/DrugDetailViewModel.kt b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/DrugDetailViewModel.kt similarity index 88% rename from app/src/main/java/com/approagency/drug/presentation/viewModel/DrugDetailViewModel.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/viewModel/DrugDetailViewModel.kt index b82e3e9..6a11176 100644 --- a/app/src/main/java/com/approagency/drug/presentation/viewModel/DrugDetailViewModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/DrugDetailViewModel.kt @@ -1,9 +1,9 @@ -package com.approagency.drug.presentation.viewModel +package com.approagency.pharmacy.presentation.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.approagency.drug.domain.model.DrugDetail -import com.approagency.drug.domain.usecase.DrugDetailYabUseCase +import com.approagency.pharmacy.domain.model.DrugDetail +import com.approagency.pharmacy.domain.usecase.DrugDetailYabUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/approagency/drug/presentation/viewModel/HomeViewModel.kt b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/HomeViewModel.kt similarity index 86% rename from app/src/main/java/com/approagency/drug/presentation/viewModel/HomeViewModel.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/viewModel/HomeViewModel.kt index 1cc098e..08953a0 100644 --- a/app/src/main/java/com/approagency/drug/presentation/viewModel/HomeViewModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/HomeViewModel.kt @@ -1,174 +1,170 @@ -package com.approagency.drug.presentation.viewModel - -import android.net.http.HttpException -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.approagency.drug.data.dto.DarmanModel -import com.approagency.drug.data.dto.DrugDetail -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.domain.model.DrugSearchParams -import com.approagency.drug.domain.usecase.GetDarmanUseCase -import com.approagency.drug.domain.usecase.GetDrugDetailUseCase -import com.approagency.drug.domain.usecase.GetDrugSearchUseCase -import com.approagency.drug.presentation.screens.HomeScreen -import com.approagency.drug.utils.retryWithBackoff -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch - -class HomeViewModel ( - private val getDrugSearchUseCase: GetDrugSearchUseCase, - private val getDrugDetailUseCase: GetDrugDetailUseCase, - private val getDarmanUseCase: GetDarmanUseCase -): ViewModel() { - private val _uiState = MutableStateFlow(CombineState()) - val uiState : StateFlow = _uiState - - // Add SharedFlow for one-time events - private val _event = MutableSharedFlow() - val event = _event.asSharedFlow() - init { - getDarmani() - } - fun getDarmani() { - _uiState.update { - it.copy( - darmanState = it.darmanState.copy(isLoading = true), - showDarmanList = true - ) - } - viewModelScope.launch { - try { - val result = getDarmanUseCase.invoke() - _uiState.update { - it.copy( - darmanState = it.darmanState.copy( - isLoading = false, - getDarmani = result - ) - ) - } - }catch (e: Exception) { - handleError(e.message) - }catch (e: Exception) { - handleError(e.localizedMessage ?: "Unknown error") - } - } - } - - fun searchDrugs(drugSearchParams: DrugSearchParams) { - _uiState.update { it.copy(drugSearchState = it.drugSearchState.copy( - isLoading = true - ) , showDarmanList = false) } - viewModelScope.launch { - try { - val result = getDrugSearchUseCase.invoke(drugSearchParams) - println(result) - _uiState.update { it.copy( - drugSearchState = it.drugSearchState.copy( - isLoading = false, - drugsData = result - ) - - ) } - } catch (e: Exception) { - println(e.message) - handleError(e.message) - }catch (e: Exception) { - println(e.message) - handleError(e.localizedMessage ?: "Unknown error") - } - } - } - - fun drugDetail(cod: Int , allDrugs:Result?) { - _uiState.update { it.copy(drugDetailState = it.drugDetailState.copy( - isLoading = true - ) , showDarmanList = false) } - viewModelScope.launch { - try { - val result = getDrugDetailUseCase.invoke(cod) - _uiState.update { - it.copy( - drugDetailState = it.drugDetailState.copy( - isLoading = false, - drugDetail = result, - isDetailVisible = true - ), - drugSearchState = it.drugSearchState.copy( - isLoading = false, - drugsData = allDrugs - ) - ) - } - println(result) - } catch (e: Exception) { - handleError(e.message) - }catch (e: Exception) { - handleError(e.localizedMessage ?: "Unknown error") - } - } - } - fun closeDetail() { - _uiState.update { - it.copy( - drugDetailState = it.drugDetailState.copy( - isDetailVisible = false, - drugDetail = null // optional, depends if you want to keep last detail cached - ) - ) - } - } - - private suspend fun handleError(message: String?) { - _uiState.update { it.copy(drugSearchState = it.drugSearchState.copy( - isLoading = false - ) , drugDetailState = it.drugDetailState.copy( - isLoading = false - )) } - _event.emit(HomeEvent.ShowError(message ?: "Error occurred")) - } - - // Clear error when consumed - fun clearError() { -// _uiState.update { it.copy(error = null) } - } -} - - -sealed class HomeEvent { - data class ShowError(val message: String) : HomeEvent() - data class ShowDetailDrug(val drugDetail:Result?): HomeEvent() -} - -data class CombineState( - val drugSearchState: DrugSearchState = DrugSearchState() , - val drugDetailState: DrugDetailState =DrugDetailState(), - val darmanState: GetDarmaniState = GetDarmaniState(), - val showDarmanList: Boolean = true - ) - -data class DrugSearchState( - val isLoading: Boolean = false, - val drugsData: Result? = null, - val drugDetail: Result? = null, - val error:String? = null -) - -data class DrugDetailState( - val isLoading: Boolean = false, - val drugDetail:Result? = null, - val isDetailVisible: Boolean = false, - val error:String? = null -) - -data class GetDarmaniState( - val isLoading: Boolean = false, - val getDarmani:Result? = null, - val error:String? = null -) - +package com.approagency.pharmacy.presentation.viewModel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.approagency.pharmacy.data.dto.DarmanModel +import com.approagency.pharmacy.data.dto.DrugListResponse +import com.approagency.pharmacy.data.dto.DrugModels +import com.approagency.pharmacy.domain.model.DrugSearchParams +import com.approagency.pharmacy.domain.usecase.GetDarmanUseCase +import com.approagency.pharmacy.domain.usecase.GetDrugDetailUseCase +import com.approagency.pharmacy.domain.usecase.GetDrugSearchUseCase +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class HomeViewModel ( + private val getDrugSearchUseCase: GetDrugSearchUseCase, + private val getDrugDetailUseCase: GetDrugDetailUseCase, + private val getDarmanUseCase: GetDarmanUseCase +): ViewModel() { + private val _uiState = MutableStateFlow(CombineState()) + val uiState : StateFlow = _uiState + + // Add SharedFlow for one-time events + private val _event = MutableSharedFlow() + val event = _event.asSharedFlow() + init { + getDarmani() + } + fun getDarmani() { + _uiState.update { + it.copy( + darmanState = it.darmanState.copy(isLoading = true), + showDarmanList = true + ) + } + viewModelScope.launch { + try { + val result = getDarmanUseCase.invoke() + _uiState.update { + it.copy( + darmanState = it.darmanState.copy( + isLoading = false, + getDarmani = result + ) + ) + } + }catch (e: Exception) { + handleError(e.message) + }catch (e: Exception) { + handleError(e.localizedMessage ?: "Unknown error") + } + } + } + + fun searchDrugs(drugSearchParams: DrugSearchParams) { + _uiState.update { it.copy(drugSearchState = it.drugSearchState.copy( + isLoading = true + ) , showDarmanList = false) } + viewModelScope.launch { + try { + val result = getDrugSearchUseCase.invoke(drugSearchParams) + println(result) + _uiState.update { it.copy( + drugSearchState = it.drugSearchState.copy( + isLoading = false, + drugsData = result + ) + + ) } + } catch (e: Exception) { + println(e.message) + handleError(e.message) + }catch (e: Exception) { + println(e.message) + handleError(e.localizedMessage ?: "Unknown error") + } + } + } + + fun drugDetail(cod: Int , allDrugs:Result?) { + _uiState.update { it.copy(drugDetailState = it.drugDetailState.copy( + isLoading = true + ) , showDarmanList = false) } + viewModelScope.launch { + try { + val result = getDrugDetailUseCase.invoke(cod) + _uiState.update { + it.copy( + drugDetailState = it.drugDetailState.copy( + isLoading = false, + drugDetail = result, + isDetailVisible = true + ), + drugSearchState = it.drugSearchState.copy( + isLoading = false, + drugsData = allDrugs + ) + ) + } + println(result) + } catch (e: Exception) { + handleError(e.message) + }catch (e: Exception) { + handleError(e.localizedMessage ?: "Unknown error") + } + } + } + fun closeDetail() { + _uiState.update { + it.copy( + drugDetailState = it.drugDetailState.copy( + isDetailVisible = false, + drugDetail = null // optional, depends if you want to keep last detail cached + ) + ) + } + } + + private suspend fun handleError(message: String?) { + _uiState.update { it.copy(drugSearchState = it.drugSearchState.copy( + isLoading = false + ) , drugDetailState = it.drugDetailState.copy( + isLoading = false + )) } + _event.emit(HomeEvent.ShowError(message ?: "Error occurred")) + } + + // Clear error when consumed + fun clearError() { +// _uiState.update { it.copy(error = null) } + } +} + + +sealed class HomeEvent { + data class ShowError(val message: String) : HomeEvent() + data class ShowDetailDrug(val drugDetail:Result?): HomeEvent() +} + +data class CombineState( + val drugSearchState: DrugSearchState = DrugSearchState() , + val drugDetailState: DrugDetailState =DrugDetailState(), + val darmanState: GetDarmaniState = GetDarmaniState(), + val showDarmanList: Boolean = true + ) + +data class DrugSearchState( + val isLoading: Boolean = false, + val drugsData: Result? = null, + val drugDetail: Result? = null, + val error:String? = null +) + +data class DrugDetailState( + val isLoading: Boolean = false, + val drugDetail:Result? = null, + val isDetailVisible: Boolean = false, + val error:String? = null +) + +data class GetDarmaniState( + val isLoading: Boolean = false, + val getDarmani:Result? = null, + val error:String? = null +) + diff --git a/app/src/main/java/com/approagency/drug/presentation/viewModel/LabViewModel.kt b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/LabViewModel.kt similarity index 88% rename from app/src/main/java/com/approagency/drug/presentation/viewModel/LabViewModel.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/viewModel/LabViewModel.kt index 07a01ce..669e1e5 100644 --- a/app/src/main/java/com/approagency/drug/presentation/viewModel/LabViewModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/LabViewModel.kt @@ -1,174 +1,172 @@ -package com.approagency.drug.presentation.viewModel - -import android.net.http.HttpException -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.approagency.drug.data.dto.DrugListResponse -import com.approagency.drug.data.dto.DrugModels -import com.approagency.drug.domain.model.TestGroup -import com.approagency.drug.domain.model.TestItem -import com.approagency.drug.domain.usecase.GetTestGroupUseCase -import com.approagency.drug.domain.usecase.GetTestItemByGroupId -import com.approagency.drug.domain.usecase.SearchTestsUseCase -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch - -class LabViewModel ( - private val getTestGroupUseCase: GetTestGroupUseCase, - private val getTestItemByGroupId: GetTestItemByGroupId, - private val searchTestsUseCase: SearchTestsUseCase -) : ViewModel(){ - private val _testGroups = MutableStateFlow(TestGroupItem()) - val testGroups: StateFlow = _testGroups.asStateFlow() - - private val _testItems = MutableStateFlow(TestItemState()) - val testItems: StateFlow = _testItems.asStateFlow() - - - private val _searchResults = MutableStateFlow(SearchResultState()) - val searchResults: StateFlow = _searchResults.asStateFlow() - - private val searchQuery = MutableStateFlow("") - - init { - loadTestGroups() - setupSearch() - } - private fun setupSearch() { - viewModelScope.launch { - searchQuery - .debounce(1000) // Wait 500ms after user stops typing - .distinctUntilChanged() - .collect { query -> - if (query.isNotBlank()) { - performSearch(query) - } else { - _searchResults.update { - SearchResultState( - isLoading = false, - searchResults = null, - query = "" - ) - } - } - } - } - } - - fun updateSearchQuery(query: String) { - searchQuery.value = query - _searchResults.update { - it.copy( - isLoading = query.isNotBlank(), - query = query - ) - } - } - - private fun performSearch(query: String) { - viewModelScope.launch { - try { - val result = searchTestsUseCase.invoke(query) - result.collect { (groups, items) -> - _searchResults.update { - it.copy( - isLoading = false, - searchResults = SearchResult(groups = groups, items = items), - error = null - ) - } - } - } catch (e: Exception) { - _searchResults.update { - it.copy( - isLoading = false, - searchResults = null, - error = e.message ?: "خطا در جستجو" - ) - } - } - } - } - fun loadTestGroups(){ - _testGroups.update { - it.copy( - isLoading = true - ) - } - viewModelScope.launch { - try { - val result = getTestGroupUseCase.invoke(); - _testGroups.update { - it.copy( - isLoading = false, - testGroup = result, - ) - } - } catch (e:HttpException){ - handleError(e.message) - } - - } - } - fun clearSearch() { - searchQuery.value = "" - _searchResults.update { - SearchResultState() - } - } - fun getItemByGroupId(id:Int){ - _testItems.update { it.copy(isLoading = true) } - viewModelScope.launch { - try { - val result = getTestItemByGroupId.invoke(id); - _testItems.update { - it.copy( - isLoading = false, - testItem = result - ) - } - } catch (e:HttpException){ - handleError(e.message) - } - } - } - private suspend fun handleError(message: String?) { - _testGroups.update { - it.copy( - isLoading = false, - testGroup = null, - error = message - ) - } - } - -} - -data class TestGroupItem( - val isLoading: Boolean = false, - val testGroup: Flow>? = null, - val error:String? = null -) - -data class TestItemState( - val isLoading: Boolean = false, - val testItem: Flow>? = null, - val error:String? = null -) -data class SearchResultState( - val isLoading: Boolean = false, - val searchResults: SearchResult? = null, - val error: String? = null, - val query: String = "" -) - -data class SearchResult( - val groups: List, - val items: List -) +package com.approagency.pharmacy.presentation.viewModel + +import android.net.http.HttpException +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.approagency.pharmacy.domain.model.TestGroup +import com.approagency.pharmacy.domain.model.TestItem +import com.approagency.pharmacy.domain.usecase.GetTestGroupUseCase +import com.approagency.pharmacy.domain.usecase.GetTestItemByGroupId +import com.approagency.pharmacy.domain.usecase.SearchTestsUseCase +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class LabViewModel ( + private val getTestGroupUseCase: GetTestGroupUseCase, + private val getTestItemByGroupId: GetTestItemByGroupId, + private val searchTestsUseCase: SearchTestsUseCase +) : ViewModel(){ + private val _testGroups = MutableStateFlow(TestGroupItem()) + val testGroups: StateFlow = _testGroups.asStateFlow() + + private val _testItems = MutableStateFlow(TestItemState()) + val testItems: StateFlow = _testItems.asStateFlow() + + + private val _searchResults = MutableStateFlow(SearchResultState()) + val searchResults: StateFlow = _searchResults.asStateFlow() + + private val searchQuery = MutableStateFlow("") + + init { + loadTestGroups() + setupSearch() + } + private fun setupSearch() { + viewModelScope.launch { + searchQuery + .debounce(1000) // Wait 500ms after user stops typing + .distinctUntilChanged() + .collect { query -> + if (query.isNotBlank()) { + performSearch(query) + } else { + _searchResults.update { + SearchResultState( + isLoading = false, + searchResults = null, + query = "" + ) + } + } + } + } + } + + fun updateSearchQuery(query: String) { + searchQuery.value = query + _searchResults.update { + it.copy( + isLoading = query.isNotBlank(), + query = query + ) + } + } + + private fun performSearch(query: String) { + viewModelScope.launch { + try { + val result = searchTestsUseCase.invoke(query) + result.collect { (groups, items) -> + _searchResults.update { + it.copy( + isLoading = false, + searchResults = SearchResult(groups = groups, items = items), + error = null + ) + } + } + } catch (e: Exception) { + _searchResults.update { + it.copy( + isLoading = false, + searchResults = null, + error = e.message ?: "خطا در جستجو" + ) + } + } + } + } + fun loadTestGroups(){ + _testGroups.update { + it.copy( + isLoading = true + ) + } + viewModelScope.launch { + try { + val result = getTestGroupUseCase.invoke(); + _testGroups.update { + it.copy( + isLoading = false, + testGroup = result, + ) + } + } catch (e:HttpException){ + handleError(e.message) + } + + } + } + fun clearSearch() { + searchQuery.value = "" + _searchResults.update { + SearchResultState() + } + } + fun getItemByGroupId(id:Int){ + _testItems.update { it.copy(isLoading = true) } + viewModelScope.launch { + try { + val result = getTestItemByGroupId.invoke(id); + _testItems.update { + it.copy( + isLoading = false, + testItem = result + ) + } + } catch (e:HttpException){ + handleError(e.message) + } + } + } + private suspend fun handleError(message: String?) { + _testGroups.update { + it.copy( + isLoading = false, + testGroup = null, + error = message + ) + } + } + +} + +data class TestGroupItem( + val isLoading: Boolean = false, + val testGroup: Flow>? = null, + val error:String? = null +) + +data class TestItemState( + val isLoading: Boolean = false, + val testItem: Flow>? = null, + val error:String? = null +) +data class SearchResultState( + val isLoading: Boolean = false, + val searchResults: SearchResult? = null, + val error: String? = null, + val query: String = "" +) + +data class SearchResult( + val groups: List, + val items: List +) diff --git a/app/src/main/java/com/approagency/drug/presentation/viewModel/PharmacyViewModel.kt b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/PharmacyViewModel.kt similarity index 91% rename from app/src/main/java/com/approagency/drug/presentation/viewModel/PharmacyViewModel.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/viewModel/PharmacyViewModel.kt index 4eeb759..fb67f88 100644 --- a/app/src/main/java/com/approagency/drug/presentation/viewModel/PharmacyViewModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/PharmacyViewModel.kt @@ -1,12 +1,12 @@ -package com.approagency.drug.presentation.viewModel +package com.approagency.pharmacy.presentation.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.approagency.drug.domain.model.PharmacyDetail -import com.approagency.drug.domain.model.PharmacyItem -import com.approagency.drug.domain.usecase.GetPharmaciesUseCase -import com.approagency.drug.domain.usecase.GetPharmacyDetailUseCase +import com.approagency.pharmacy.domain.model.PharmacyDetail +import com.approagency.pharmacy.domain.model.PharmacyItem +import com.approagency.pharmacy.domain.usecase.GetPharmaciesUseCase +import com.approagency.pharmacy.domain.usecase.GetPharmacyDetailUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/approagency/drug/presentation/viewModel/SearchViewModel.kt b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/SearchViewModel.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/presentation/viewModel/SearchViewModel.kt rename to app/src/main/java/com/approagency/pharmacy/presentation/viewModel/SearchViewModel.kt index 35a27ad..dae150e 100644 --- a/app/src/main/java/com/approagency/drug/presentation/viewModel/SearchViewModel.kt +++ b/app/src/main/java/com/approagency/pharmacy/presentation/viewModel/SearchViewModel.kt @@ -5,9 +5,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.approagency.drug.domain.model.DrugSearchResult -import com.approagency.drug.domain.usecase.SearchDrugsYabUseCase -import kotlinx.coroutines.delay +import com.approagency.pharmacy.domain.model.DrugSearchResult +import com.approagency.pharmacy.domain.usecase.SearchDrugsYabUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Color.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Color.kt similarity index 75% rename from app/src/main/java/com/approagency/drug/ui/theme/Color.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Color.kt index 2b099e7..78f805a 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Color.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.ui.theme +package com.approagency.pharmacy.ui.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Dimention.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Dimention.kt similarity index 94% rename from app/src/main/java/com/approagency/drug/ui/theme/Dimention.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Dimention.kt index b3a56c9..a4ee43a 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Dimention.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Dimention.kt @@ -1,20 +1,20 @@ -package com.vada.caller.ui.theme - -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp - - -data class Dime ( - val xxs: Dp = 2.dp, - val xs: Dp = 4.dp, - val sm: Dp = 8.dp, - val md: Dp = 12.dp, - val lg: Dp = 16.dp, - val xl: Dp = 20.dp, - val xxl: Dp = 24.dp, - - - val iconSm: Dp = 20.dp, - val iconMd: Dp = 24.dp, - val iconLg: Dp = 32.dp, +package com.vada.caller.ui.theme + +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + + +data class Dime ( + val xxs: Dp = 2.dp, + val xs: Dp = 4.dp, + val sm: Dp = 8.dp, + val md: Dp = 12.dp, + val lg: Dp = 16.dp, + val xl: Dp = 20.dp, + val xxl: Dp = 24.dp, + + + val iconSm: Dp = 20.dp, + val iconMd: Dp = 24.dp, + val iconLg: Dp = 32.dp, ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Local.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Local.kt similarity index 62% rename from app/src/main/java/com/approagency/drug/ui/theme/Local.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Local.kt index d76427e..d64e615 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Local.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Local.kt @@ -1,5 +1,5 @@ -package com.vada.caller.ui.theme - -import androidx.compose.runtime.staticCompositionLocalOf - +package com.vada.caller.ui.theme + +import androidx.compose.runtime.staticCompositionLocalOf + val LocalDime = staticCompositionLocalOf { Dime() } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/ui/theme/MaterialThemeExt.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/MaterialThemeExt.kt similarity index 84% rename from app/src/main/java/com/approagency/drug/ui/theme/MaterialThemeExt.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/MaterialThemeExt.kt index 03c2081..dc456c5 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/MaterialThemeExt.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/MaterialThemeExt.kt @@ -1,8 +1,8 @@ -package com.vada.caller.ui.theme - -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable - -val MaterialTheme.dime: Dime -@Composable +package com.vada.caller.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable + +val MaterialTheme.dime: Dime +@Composable get() =LocalDime.current \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Shape.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Shape.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/ui/theme/Shape.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Shape.kt index c32eb4c..f2f4db7 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Shape.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Shape.kt @@ -1,12 +1,12 @@ -package com.fabirt.podcastapp.ui.theme - -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Shapes -import androidx.compose.ui.unit.dp - -val Shapes = Shapes( - small = RoundedCornerShape(4.dp), - medium = RoundedCornerShape(12.dp), - large = RoundedCornerShape(16.dp), - extraLarge = RoundedCornerShape(20.dp) +package com.fabirt.podcastapp.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Shapes +import androidx.compose.ui.unit.dp + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(12.dp), + large = RoundedCornerShape(16.dp), + extraLarge = RoundedCornerShape(20.dp) ) \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Theme.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Theme.kt similarity index 96% rename from app/src/main/java/com/approagency/drug/ui/theme/Theme.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Theme.kt index a74f0a5..0d60de4 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Theme.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Theme.kt @@ -1,10 +1,8 @@ -package com.approagency.drug.ui.theme +package com.approagency.pharmacy.ui.theme -import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Shapes import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme diff --git a/app/src/main/java/com/approagency/drug/ui/theme/Type.kt b/app/src/main/java/com/approagency/pharmacy/ui/theme/Type.kt similarity index 95% rename from app/src/main/java/com/approagency/drug/ui/theme/Type.kt rename to app/src/main/java/com/approagency/pharmacy/ui/theme/Type.kt index 54efab1..4c2e013 100644 --- a/app/src/main/java/com/approagency/drug/ui/theme/Type.kt +++ b/app/src/main/java/com/approagency/pharmacy/ui/theme/Type.kt @@ -1,7 +1,5 @@ -package com.approagency.drug.ui.theme -import android.content.res.Resources -import androidx.compose.material3.MaterialTheme -import com.approagency.drug.R +package com.approagency.pharmacy.ui.theme +import com.approagency.pharmacy.R import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.Font diff --git a/app/src/main/java/com/approagency/drug/utils/Config.kt b/app/src/main/java/com/approagency/pharmacy/utils/Config.kt similarity index 76% rename from app/src/main/java/com/approagency/drug/utils/Config.kt rename to app/src/main/java/com/approagency/pharmacy/utils/Config.kt index e9ca851..afe5aa8 100644 --- a/app/src/main/java/com/approagency/drug/utils/Config.kt +++ b/app/src/main/java/com/approagency/pharmacy/utils/Config.kt @@ -1,6 +1,6 @@ -package com.approagency.drug.utils - -object Config { - const val BASE_URL = "https://drug.approagency.ir/api/" - const val Darro_Url = "https://www.darooyab.ir/" +package com.approagency.pharmacy.utils + +object Config { + const val BASE_URL = "https://drug.approagency.ir/api/" + const val Darro_Url = "https://www.darooyab.ir/" } \ No newline at end of file diff --git a/app/src/main/java/com/approagency/drug/utils/province.kt b/app/src/main/java/com/approagency/pharmacy/utils/province.kt similarity index 97% rename from app/src/main/java/com/approagency/drug/utils/province.kt rename to app/src/main/java/com/approagency/pharmacy/utils/province.kt index 725802b..d93b54f 100644 --- a/app/src/main/java/com/approagency/drug/utils/province.kt +++ b/app/src/main/java/com/approagency/pharmacy/utils/province.kt @@ -1,4 +1,4 @@ -package com.approagency.drug.utils +package com.approagency.pharmacy.utils val provinces = listOf( diff --git a/app/src/main/java/com/approagency/drug/utils/retry.kt b/app/src/main/java/com/approagency/pharmacy/utils/retry.kt similarity index 92% rename from app/src/main/java/com/approagency/drug/utils/retry.kt rename to app/src/main/java/com/approagency/pharmacy/utils/retry.kt index d55015f..29373cd 100644 --- a/app/src/main/java/com/approagency/drug/utils/retry.kt +++ b/app/src/main/java/com/approagency/pharmacy/utils/retry.kt @@ -1,29 +1,29 @@ -package com.approagency.drug.utils - -import kotlinx.coroutines.delay - -suspend fun retryWithBackoff( - maxRetries: Int = 3, - initialDelayMs: Long = 1000, - maxDelayMs: Long = 5000, - factor: Double = 2.0, - onRetry: ((attempt: Int, delayMs: Long) -> Unit)? = null, - block: suspend () -> T -): Result { - var currentDelay = initialDelayMs - repeat(maxRetries - 1) { attempt -> - try { - return Result.success(block()) - } catch (e: Exception) { - onRetry?.invoke(attempt + 1, currentDelay) - delay(currentDelay) - currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelayMs) - } - } - // Last attempt - return try { - Result.success(block()) - } catch (e: Exception) { - Result.failure(e) - } -} +package com.approagency.pharmacy.utils + +import kotlinx.coroutines.delay + +suspend fun retryWithBackoff( + maxRetries: Int = 3, + initialDelayMs: Long = 1000, + maxDelayMs: Long = 5000, + factor: Double = 2.0, + onRetry: ((attempt: Int, delayMs: Long) -> Unit)? = null, + block: suspend () -> T +): Result { + var currentDelay = initialDelayMs + repeat(maxRetries - 1) { attempt -> + try { + return Result.success(block()) + } catch (e: Exception) { + onRetry?.invoke(attempt + 1, currentDelay) + delay(currentDelay) + currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelayMs) + } + } + // Last attempt + return try { + Result.success(block()) + } catch (e: Exception) { + Result.failure(e) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 65b668e..cef4785 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - drug + داروخانه همراه \ No newline at end of file diff --git a/app/src/test/java/com/approagency/drug/ExampleUnitTest.kt b/app/src/test/java/com/approagency/pharmacy/ExampleUnitTest.kt similarity index 90% rename from app/src/test/java/com/approagency/drug/ExampleUnitTest.kt rename to app/src/test/java/com/approagency/pharmacy/ExampleUnitTest.kt index 8600a3a..f112c2e 100644 --- a/app/src/test/java/com/approagency/drug/ExampleUnitTest.kt +++ b/app/src/test/java/com/approagency/pharmacy/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.approagency.drug +package com.approagency.pharmacy import org.junit.Test