openuispec 0.2.10 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/cli/index.ts +4 -2
- package/cli/init.ts +23 -8
- package/docs/cli.md +13 -8
- package/drift/index.ts +41 -15
- package/mcp-server/index.ts +155 -116
- package/mcp-server/screenshot.ts +19 -4
- package/package.json +5 -2
- package/prepare/index.ts +16 -0
- package/scripts/take-all-screenshots.ts +507 -0
- package/status/index.ts +2 -2
- package/examples/social-app/.mcp.json +0 -10
- package/examples/social-app/AGENTS.md +0 -124
- package/examples/social-app/CLAUDE.md +0 -124
- package/examples/social-app/backend/.gitkeep +0 -1
- package/examples/social-app/generated/android/social-app/app/.paparazzi-hashes.json +0 -3
- package/examples/social-app/generated/android/social-app/app/build.gradle.kts +0 -94
- package/examples/social-app/generated/android/social-app/app/src/main/AndroidManifest.xml +0 -26
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/AppContainer.kt +0 -20
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/MainActivity.kt +0 -35
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/SocialAppApplication.kt +0 -13
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/MockData.kt +0 -98
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/AppPreferences.kt +0 -19
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/DataStorePreferencesRepository.kt +0 -68
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/PreferencesRepository.kt +0 -15
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/model/Models.kt +0 -34
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/MainShell.kt +0 -390
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/Components.kt +0 -234
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/ContractPrimitives.kt +0 -641
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/navigation/RootComponent.kt +0 -113
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ChatDetailScreen.kt +0 -212
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/CreatePostScreen.kt +0 -113
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/DiscoverScreen.kt +0 -137
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/EditProfileScreen.kt +0 -180
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/HomeFeedScreen.kt +0 -169
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/MessagesInboxScreen.kt +0 -85
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/NotificationsScreen.kt +0 -74
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/PostDetailScreen.kt +0 -293
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ProfileSelfScreen.kt +0 -116
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SearchResultsScreen.kt +0 -161
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsScreen.kt +0 -164
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsStore.kt +0 -95
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/UserProfileScreen.kt +0 -123
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Color.kt +0 -33
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Shape.kt +0 -41
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Spacing.kt +0 -20
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Theme.kt +0 -82
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Type.kt +0 -60
- package/examples/social-app/generated/android/social-app/app/src/main/res/drawable/ic_launcher_foreground.xml +0 -9
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/strings.xml +0 -91
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/themes.xml +0 -10
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-ru/strings.xml +0 -79
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-uz/strings.xml +0 -79
- package/examples/social-app/generated/android/social-app/app/src/main/xml/AndroidManifest.xml +0 -23
- package/examples/social-app/generated/android/social-app/app/src/test/kotlin/com/social/app/screenshots/HomeFeedScreenshotTest.kt +0 -34
- package/examples/social-app/generated/android/social-app/build.gradle.kts +0 -7
- package/examples/social-app/generated/android/social-app/gradle/libs.versions.toml +0 -50
- package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.properties +0 -8
- package/examples/social-app/generated/android/social-app/gradle.properties +0 -11
- package/examples/social-app/generated/android/social-app/gradlew +0 -248
- package/examples/social-app/generated/android/social-app/settings.gradle.kts +0 -27
- package/examples/social-app/generated/web/social-app/index.html +0 -12
- package/examples/social-app/generated/web/social-app/package-lock.json +0 -2517
- package/examples/social-app/generated/web/social-app/package.json +0 -27
- package/examples/social-app/generated/web/social-app/src/app/App.tsx +0 -58
- package/examples/social-app/generated/web/social-app/src/components/Shell.tsx +0 -259
- package/examples/social-app/generated/web/social-app/src/components/cards.tsx +0 -317
- package/examples/social-app/generated/web/social-app/src/components/ui.tsx +0 -340
- package/examples/social-app/generated/web/social-app/src/flows/CreatePostFlow.tsx +0 -86
- package/examples/social-app/generated/web/social-app/src/i18n.tsx +0 -59
- package/examples/social-app/generated/web/social-app/src/lib/icons.tsx +0 -85
- package/examples/social-app/generated/web/social-app/src/lib/tokens.ts +0 -70
- package/examples/social-app/generated/web/social-app/src/lib/utils.ts +0 -97
- package/examples/social-app/generated/web/social-app/src/locales/en.json +0 -67
- package/examples/social-app/generated/web/social-app/src/locales/ru.json +0 -67
- package/examples/social-app/generated/web/social-app/src/locales/uz.json +0 -67
- package/examples/social-app/generated/web/social-app/src/main.tsx +0 -16
- package/examples/social-app/generated/web/social-app/src/screens/ChatDetailScreen.tsx +0 -90
- package/examples/social-app/generated/web/social-app/src/screens/DiscoverScreen.tsx +0 -86
- package/examples/social-app/generated/web/social-app/src/screens/EditProfileScreen.tsx +0 -57
- package/examples/social-app/generated/web/social-app/src/screens/HomeFeedScreen.tsx +0 -103
- package/examples/social-app/generated/web/social-app/src/screens/MessagesInboxScreen.tsx +0 -52
- package/examples/social-app/generated/web/social-app/src/screens/NotificationsScreen.tsx +0 -41
- package/examples/social-app/generated/web/social-app/src/screens/PostDetailScreen.tsx +0 -115
- package/examples/social-app/generated/web/social-app/src/screens/ProfileSelfScreen.tsx +0 -57
- package/examples/social-app/generated/web/social-app/src/screens/ProfileUserScreen.tsx +0 -76
- package/examples/social-app/generated/web/social-app/src/screens/SearchResultsScreen.tsx +0 -96
- package/examples/social-app/generated/web/social-app/src/screens/SettingsScreen.tsx +0 -79
- package/examples/social-app/generated/web/social-app/src/state/store.ts +0 -592
- package/examples/social-app/generated/web/social-app/src/styles.css +0 -125
- package/examples/social-app/generated/web/social-app/src/vite-env.d.ts +0 -1
- package/examples/social-app/generated/web/social-app/tsconfig.json +0 -22
- package/examples/social-app/generated/web/social-app/tsconfig.node.json +0 -13
- package/examples/social-app/generated/web/social-app/tsconfig.node.tsbuildinfo +0 -1
- package/examples/social-app/generated/web/social-app/tsconfig.tsbuildinfo +0 -1
- package/examples/social-app/generated/web/social-app/vite.config.d.ts +0 -2
- package/examples/social-app/generated/web/social-app/vite.config.js +0 -6
- package/examples/social-app/generated/web/social-app/vite.config.ts +0 -7
- package/examples/social-app/package.json +0 -13
- package/examples/social-app/take-web-screenshots.ts +0 -97
- package/examples/taskflow/.codex/config.toml +0 -4
- package/examples/taskflow/.mcp.json +0 -10
- package/examples/taskflow/AGENTS.md +0 -124
- package/examples/taskflow/CLAUDE.md +0 -124
- package/examples/taskflow/backend/.gitkeep +0 -1
- package/examples/taskflow/generated/android/TaskFlow/README.md +0 -43
- package/examples/taskflow/generated/android/TaskFlow/app/build.gradle.kts +0 -76
- package/examples/taskflow/generated/android/TaskFlow/app/proguard-rules.pro +0 -1
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/AndroidManifest.xml +0 -21
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/MainActivity.kt +0 -19
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/TaskFlowApp.kt +0 -283
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/DomainModels.kt +0 -106
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/SampleData.kt +0 -57
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/components/Common.kt +0 -109
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/HomeScreen.kt +0 -112
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/ProjectsScreen.kt +0 -61
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/SettingsScreen.kt +0 -82
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/TaskDetailScreen.kt +0 -111
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/sheets/Sheets.kt +0 -77
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Color.kt +0 -30
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Theme.kt +0 -86
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Type.kt +0 -57
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/strings.xml +0 -155
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/themes.xml +0 -4
- package/examples/taskflow/generated/android/TaskFlow/build.gradle.kts +0 -5
- package/examples/taskflow/generated/android/TaskFlow/gradle/gradle-daemon-jvm.properties +0 -12
- package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/examples/taskflow/generated/android/TaskFlow/gradle.properties +0 -4
- package/examples/taskflow/generated/android/TaskFlow/gradlew +0 -18
- package/examples/taskflow/generated/android/TaskFlow/gradlew.bat +0 -12
- package/examples/taskflow/generated/android/TaskFlow/settings.gradle.kts +0 -18
- package/examples/taskflow/generated/ios/TaskFlow/README.md +0 -21
- package/examples/taskflow/generated/ios/TaskFlow/Resources/en.lproj/Localizable.strings +0 -115
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/App/TaskFlowApp.swift +0 -24
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Components/AppChrome.swift +0 -150
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Flows/TaskEditorSheet.swift +0 -220
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Models/DomainModels.swift +0 -122
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/CalendarView.swift +0 -21
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/HomeView.swift +0 -201
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProfileEditView.swift +0 -48
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectDetailView.swift +0 -59
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectsView.swift +0 -63
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/SettingsView.swift +0 -85
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/TaskDetailView.swift +0 -219
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppModel.swift +0 -320
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppSupport.swift +0 -41
- package/examples/taskflow/generated/ios/TaskFlow/project.yml +0 -31
- package/examples/taskflow/generated/web/TaskFlow/README.md +0 -19
- package/examples/taskflow/generated/web/TaskFlow/index.html +0 -12
- package/examples/taskflow/generated/web/TaskFlow/package-lock.json +0 -1908
- package/examples/taskflow/generated/web/TaskFlow/package.json +0 -24
- package/examples/taskflow/generated/web/TaskFlow/src/App.tsx +0 -58
- package/examples/taskflow/generated/web/TaskFlow/src/AppShell.tsx +0 -55
- package/examples/taskflow/generated/web/TaskFlow/src/components/Common.tsx +0 -82
- package/examples/taskflow/generated/web/TaskFlow/src/components/Modals.tsx +0 -191
- package/examples/taskflow/generated/web/TaskFlow/src/components/Nav.tsx +0 -41
- package/examples/taskflow/generated/web/TaskFlow/src/generated/messages.ts +0 -131
- package/examples/taskflow/generated/web/TaskFlow/src/hooks.ts +0 -25
- package/examples/taskflow/generated/web/TaskFlow/src/i18n.ts +0 -39
- package/examples/taskflow/generated/web/TaskFlow/src/locales.en.json +0 -111
- package/examples/taskflow/generated/web/TaskFlow/src/main.tsx +0 -13
- package/examples/taskflow/generated/web/TaskFlow/src/screens/HomeScreen.tsx +0 -111
- package/examples/taskflow/generated/web/TaskFlow/src/screens/ProjectsScreen.tsx +0 -82
- package/examples/taskflow/generated/web/TaskFlow/src/screens/SettingsScreens.tsx +0 -132
- package/examples/taskflow/generated/web/TaskFlow/src/screens/TaskDetail.tsx +0 -105
- package/examples/taskflow/generated/web/TaskFlow/src/store.ts +0 -216
- package/examples/taskflow/generated/web/TaskFlow/src/styles.css +0 -617
- package/examples/taskflow/generated/web/TaskFlow/src/types.ts +0 -64
- package/examples/taskflow/generated/web/TaskFlow/src/utils.ts +0 -78
- package/examples/taskflow/generated/web/TaskFlow/tsconfig.json +0 -21
- package/examples/taskflow/generated/web/TaskFlow/vite.config.ts +0 -6
- package/examples/todo-orbit/.codex/config.toml +0 -4
- package/examples/todo-orbit/.mcp.json +0 -10
- package/examples/todo-orbit/AGENTS.md +0 -124
- package/examples/todo-orbit/CLAUDE.md +0 -124
- package/examples/todo-orbit/backend/.gitkeep +0 -1
- package/examples/todo-orbit/generated/android/Todo Orbit/README.md +0 -14
- package/examples/todo-orbit/generated/android/Todo Orbit/app/build.gradle.kts +0 -58
- package/examples/todo-orbit/generated/android/Todo Orbit/app/proguard-rules.pro +0 -1
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/AndroidManifest.xml +0 -20
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/MainActivity.kt +0 -14
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/TodoOrbitApp.kt +0 -345
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/AppLogic.kt +0 -231
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Models.kt +0 -169
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Strings.kt +0 -8
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/components/CommonComponents.kt +0 -236
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/AnalyticsScreen.kt +0 -193
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/SettingsScreen.kt +0 -102
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/TasksScreen.kt +0 -347
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/sheets/EditorSheets.kt +0 -347
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/theme/TodoOrbitTheme.kt +0 -59
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values/strings.xml +0 -149
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values-ru/strings.xml +0 -155
- package/examples/todo-orbit/generated/android/Todo Orbit/build.gradle.kts +0 -4
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle.properties +0 -4
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew +0 -248
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew.bat +0 -93
- package/examples/todo-orbit/generated/android/Todo Orbit/settings.gradle.kts +0 -18
- package/examples/todo-orbit/generated/ios/Todo Orbit/.screenshot-uitest/Sources/ScreenshotUITest.swift +0 -36
- package/examples/todo-orbit/generated/ios/Todo Orbit/README.md +0 -29
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/en.lproj/Localizable.strings +0 -119
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/ru.lproj/Localizable.strings +0 -119
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/App/TodoOrbitApp.swift +0 -50
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/OrbitChrome.swift +0 -204
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/SchedulePreviewView.swift +0 -126
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/TrendChartView.swift +0 -70
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/RecurringRuleSheet.swift +0 -126
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/TaskEditorSheet.swift +0 -61
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Models/DomainModels.swift +0 -238
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/AnalyticsView.swift +0 -94
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/SettingsView.swift +0 -76
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/TasksHomeView.swift +0 -364
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Support/AppModel.swift +0 -324
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.pbxproj +0 -439
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/xcshareddata/xcschemes/TodoOrbit.xcscheme +0 -89
- package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +0 -32
- package/examples/todo-orbit/generated/web/Todo Orbit/index.html +0 -16
- package/examples/todo-orbit/generated/web/Todo Orbit/package-lock.json +0 -1087
- package/examples/todo-orbit/generated/web/Todo Orbit/package.json +0 -24
- package/examples/todo-orbit/generated/web/Todo Orbit/src/App.tsx +0 -2167
- package/examples/todo-orbit/generated/web/Todo Orbit/src/main.tsx +0 -13
- package/examples/todo-orbit/generated/web/Todo Orbit/src/styles.css +0 -926
- package/examples/todo-orbit/generated/web/Todo Orbit/tsconfig.json +0 -19
- package/examples/todo-orbit/generated/web/Todo Orbit/vite.config.ts +0 -6
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.navigation
|
|
2
|
-
|
|
3
|
-
import com.arkivanov.decompose.ComponentContext
|
|
4
|
-
import com.arkivanov.decompose.router.stack.*
|
|
5
|
-
import com.arkivanov.decompose.value.Value
|
|
6
|
-
import kotlinx.serialization.Serializable
|
|
7
|
-
|
|
8
|
-
interface RootComponent {
|
|
9
|
-
val stack: Value<ChildStack<*, Child>>
|
|
10
|
-
|
|
11
|
-
fun onHomeTabClicked()
|
|
12
|
-
fun onDiscoverTabClicked()
|
|
13
|
-
fun onCreatePostClicked()
|
|
14
|
-
fun onNotificationsTabClicked()
|
|
15
|
-
fun onMessagesTabClicked()
|
|
16
|
-
fun onProfileTabClicked()
|
|
17
|
-
fun onBackClicked()
|
|
18
|
-
fun onPostClicked(postId: String)
|
|
19
|
-
fun onUserClicked(userId: String)
|
|
20
|
-
fun onSearchClicked(query: String)
|
|
21
|
-
fun onEditProfileClicked()
|
|
22
|
-
fun onConversationClicked(conversationId: String)
|
|
23
|
-
fun onSettingsClicked()
|
|
24
|
-
|
|
25
|
-
sealed class Child {
|
|
26
|
-
class Home(val component: Unit) : Child()
|
|
27
|
-
class Discover(val component: Unit) : Child()
|
|
28
|
-
class CreatePost(val component: Unit) : Child()
|
|
29
|
-
class Notifications(val component: Unit) : Child()
|
|
30
|
-
class MessagesInbox(val component: Unit) : Child()
|
|
31
|
-
class Profile(val component: Unit) : Child()
|
|
32
|
-
class PostDetail(val postId: String) : Child()
|
|
33
|
-
class UserProfile(val userId: String) : Child()
|
|
34
|
-
class SearchResults(val query: String) : Child()
|
|
35
|
-
class EditProfile(val component: Unit) : Child()
|
|
36
|
-
class ChatDetail(val conversationId: String) : Child()
|
|
37
|
-
class Settings(val component: Unit) : Child()
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
class DefaultRootComponent(
|
|
42
|
-
componentContext: ComponentContext
|
|
43
|
-
) : RootComponent, ComponentContext by componentContext {
|
|
44
|
-
|
|
45
|
-
private val navigation = StackNavigation<Config>()
|
|
46
|
-
|
|
47
|
-
override val stack: Value<ChildStack<*, RootComponent.Child>> =
|
|
48
|
-
childStack(
|
|
49
|
-
source = navigation,
|
|
50
|
-
serializer = Config.serializer(),
|
|
51
|
-
initialConfiguration = Config.Home,
|
|
52
|
-
handleBackButton = true,
|
|
53
|
-
childFactory = ::child
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
private fun child(config: Config, componentContext: ComponentContext): RootComponent.Child =
|
|
57
|
-
when (config) {
|
|
58
|
-
is Config.Home -> RootComponent.Child.Home(Unit)
|
|
59
|
-
is Config.Discover -> RootComponent.Child.Discover(Unit)
|
|
60
|
-
is Config.CreatePost -> RootComponent.Child.CreatePost(Unit)
|
|
61
|
-
is Config.Notifications -> RootComponent.Child.Notifications(Unit)
|
|
62
|
-
is Config.MessagesInbox -> RootComponent.Child.MessagesInbox(Unit)
|
|
63
|
-
is Config.Profile -> RootComponent.Child.Profile(Unit)
|
|
64
|
-
is Config.PostDetail -> RootComponent.Child.PostDetail(config.postId)
|
|
65
|
-
is Config.UserProfile -> RootComponent.Child.UserProfile(config.userId)
|
|
66
|
-
is Config.SearchResults -> RootComponent.Child.SearchResults(config.query)
|
|
67
|
-
is Config.EditProfile -> RootComponent.Child.EditProfile(Unit)
|
|
68
|
-
is Config.ChatDetail -> RootComponent.Child.ChatDetail(config.conversationId)
|
|
69
|
-
is Config.Settings -> RootComponent.Child.Settings(Unit)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
override fun onHomeTabClicked() = navigation.bringToFront(Config.Home)
|
|
73
|
-
override fun onDiscoverTabClicked() = navigation.bringToFront(Config.Discover)
|
|
74
|
-
override fun onCreatePostClicked() = navigation.push(Config.CreatePost)
|
|
75
|
-
override fun onNotificationsTabClicked() = navigation.bringToFront(Config.Notifications)
|
|
76
|
-
override fun onMessagesTabClicked() = navigation.bringToFront(Config.MessagesInbox)
|
|
77
|
-
override fun onProfileTabClicked() = navigation.bringToFront(Config.Profile)
|
|
78
|
-
override fun onBackClicked() = navigation.pop()
|
|
79
|
-
override fun onPostClicked(postId: String) = navigation.push(Config.PostDetail(postId))
|
|
80
|
-
override fun onUserClicked(userId: String) = navigation.push(Config.UserProfile(userId))
|
|
81
|
-
override fun onSearchClicked(query: String) = navigation.push(Config.SearchResults(query))
|
|
82
|
-
override fun onEditProfileClicked() = navigation.push(Config.EditProfile)
|
|
83
|
-
override fun onConversationClicked(conversationId: String) = navigation.push(Config.ChatDetail(conversationId))
|
|
84
|
-
override fun onSettingsClicked() = navigation.push(Config.Settings)
|
|
85
|
-
|
|
86
|
-
@Serializable
|
|
87
|
-
private sealed interface Config {
|
|
88
|
-
@Serializable
|
|
89
|
-
data object Home : Config
|
|
90
|
-
@Serializable
|
|
91
|
-
data object Discover : Config
|
|
92
|
-
@Serializable
|
|
93
|
-
data object CreatePost : Config
|
|
94
|
-
@Serializable
|
|
95
|
-
data object Notifications : Config
|
|
96
|
-
@Serializable
|
|
97
|
-
data object MessagesInbox : Config
|
|
98
|
-
@Serializable
|
|
99
|
-
data object Profile : Config
|
|
100
|
-
@Serializable
|
|
101
|
-
data class PostDetail(val postId: String) : Config
|
|
102
|
-
@Serializable
|
|
103
|
-
data class UserProfile(val userId: String) : Config
|
|
104
|
-
@Serializable
|
|
105
|
-
data class SearchResults(val query: String) : Config
|
|
106
|
-
@Serializable
|
|
107
|
-
data object EditProfile : Config
|
|
108
|
-
@Serializable
|
|
109
|
-
data class ChatDetail(val conversationId: String) : Config
|
|
110
|
-
@Serializable
|
|
111
|
-
data object Settings : Config
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.screens
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
-
import androidx.compose.foundation.layout.Box
|
|
5
|
-
import androidx.compose.foundation.layout.PaddingValues
|
|
6
|
-
import androidx.compose.foundation.layout.Row
|
|
7
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
8
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
9
|
-
import androidx.compose.foundation.layout.imePadding
|
|
10
|
-
import androidx.compose.foundation.layout.padding
|
|
11
|
-
import androidx.compose.foundation.layout.size
|
|
12
|
-
import androidx.compose.foundation.layout.widthIn
|
|
13
|
-
import androidx.compose.foundation.lazy.LazyColumn
|
|
14
|
-
import androidx.compose.foundation.lazy.items
|
|
15
|
-
import androidx.compose.material.icons.Icons
|
|
16
|
-
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
|
17
|
-
import androidx.compose.material.icons.filled.Send
|
|
18
|
-
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
19
|
-
import androidx.compose.material3.Icon
|
|
20
|
-
import androidx.compose.material3.IconButton
|
|
21
|
-
import androidx.compose.material3.IconButtonDefaults
|
|
22
|
-
import androidx.compose.material3.MaterialTheme
|
|
23
|
-
import androidx.compose.material3.Scaffold
|
|
24
|
-
import androidx.compose.material3.Surface
|
|
25
|
-
import androidx.compose.material3.Text
|
|
26
|
-
import androidx.compose.material3.TopAppBar
|
|
27
|
-
import androidx.compose.material3.TopAppBarDefaults
|
|
28
|
-
import androidx.compose.runtime.Composable
|
|
29
|
-
import androidx.compose.runtime.getValue
|
|
30
|
-
import androidx.compose.runtime.mutableStateOf
|
|
31
|
-
import androidx.compose.runtime.remember
|
|
32
|
-
import androidx.compose.runtime.setValue
|
|
33
|
-
import androidx.compose.ui.Alignment
|
|
34
|
-
import androidx.compose.ui.Modifier
|
|
35
|
-
import androidx.compose.ui.layout.ContentScale
|
|
36
|
-
import androidx.compose.ui.res.stringResource
|
|
37
|
-
import androidx.compose.ui.unit.dp
|
|
38
|
-
import coil3.compose.AsyncImage
|
|
39
|
-
import com.social.app.R
|
|
40
|
-
import com.social.app.data.MockData
|
|
41
|
-
import com.social.app.ui.components.ContractListCard
|
|
42
|
-
import com.social.app.ui.components.ContractTextField
|
|
43
|
-
import com.social.app.ui.theme.Shapes
|
|
44
|
-
import com.social.app.ui.theme.Spacing
|
|
45
|
-
|
|
46
|
-
private data class ChatMessage(
|
|
47
|
-
val body: String,
|
|
48
|
-
val timestamp: String,
|
|
49
|
-
val isMine: Boolean,
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
@OptIn(ExperimentalMaterial3Api::class)
|
|
53
|
-
@Composable
|
|
54
|
-
fun ChatDetailScreen(
|
|
55
|
-
conversationId: String,
|
|
56
|
-
onBackClick: () -> Unit,
|
|
57
|
-
) {
|
|
58
|
-
var messageText by remember { mutableStateOf("") }
|
|
59
|
-
val recipient = MockData.users.find { it.id == conversationId } ?: MockData.users[1]
|
|
60
|
-
val messages =
|
|
61
|
-
remember(conversationId) {
|
|
62
|
-
if (conversationId == "u_4432") {
|
|
63
|
-
emptyList()
|
|
64
|
-
} else {
|
|
65
|
-
listOf(
|
|
66
|
-
ChatMessage("Hey! Did you see the new Neo-Tokyo district?", "09:18", false),
|
|
67
|
-
ChatMessage("Yes. The AR overlays look much cleaner now.", "09:20", true),
|
|
68
|
-
ChatMessage("I’m heading there tomorrow for some shots.", "09:22", false),
|
|
69
|
-
ChatMessage("Send them over when you do.", "09:24", true),
|
|
70
|
-
)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
Scaffold(
|
|
75
|
-
topBar = {
|
|
76
|
-
TopAppBar(
|
|
77
|
-
title = {
|
|
78
|
-
Row(
|
|
79
|
-
verticalAlignment = Alignment.CenterVertically,
|
|
80
|
-
horizontalArrangement = Arrangement.spacedBy(Spacing.SM),
|
|
81
|
-
) {
|
|
82
|
-
Surface(
|
|
83
|
-
modifier = Modifier.size(36.dp),
|
|
84
|
-
shape = Shapes.RoundedCapPrimary,
|
|
85
|
-
color = MaterialTheme.colorScheme.surfaceVariant,
|
|
86
|
-
) {
|
|
87
|
-
if (recipient.avatarUrl != null) {
|
|
88
|
-
AsyncImage(
|
|
89
|
-
model = recipient.avatarUrl,
|
|
90
|
-
contentDescription = recipient.displayName,
|
|
91
|
-
modifier = Modifier.fillMaxSize(),
|
|
92
|
-
contentScale = ContentScale.Crop,
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
androidx.compose.foundation.layout.Column {
|
|
97
|
-
Text(recipient.displayName, style = MaterialTheme.typography.headlineSmall)
|
|
98
|
-
Text(
|
|
99
|
-
text = "@${recipient.handle}",
|
|
100
|
-
style = MaterialTheme.typography.labelSmall,
|
|
101
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
navigationIcon = {
|
|
107
|
-
IconButton(onClick = onBackClick) {
|
|
108
|
-
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),
|
|
112
|
-
)
|
|
113
|
-
},
|
|
114
|
-
bottomBar = {
|
|
115
|
-
Surface(
|
|
116
|
-
tonalElevation = 2.dp,
|
|
117
|
-
modifier = Modifier.imePadding(),
|
|
118
|
-
) {
|
|
119
|
-
Row(
|
|
120
|
-
modifier =
|
|
121
|
-
Modifier
|
|
122
|
-
.fillMaxWidth()
|
|
123
|
-
.padding(Spacing.MD),
|
|
124
|
-
verticalAlignment = Alignment.CenterVertically,
|
|
125
|
-
) {
|
|
126
|
-
ContractTextField(
|
|
127
|
-
value = messageText,
|
|
128
|
-
onValueChange = { messageText = it },
|
|
129
|
-
modifier = Modifier.weight(1f),
|
|
130
|
-
label = stringResource(R.string.chat_message_placeholder),
|
|
131
|
-
placeholder = stringResource(R.string.chat_message_placeholder),
|
|
132
|
-
singleLine = false,
|
|
133
|
-
maxLines = 4,
|
|
134
|
-
trailingAction = {
|
|
135
|
-
IconButton(
|
|
136
|
-
onClick = { messageText = "" },
|
|
137
|
-
enabled = messageText.isNotBlank(),
|
|
138
|
-
colors =
|
|
139
|
-
IconButtonDefaults.iconButtonColors(
|
|
140
|
-
contentColor = MaterialTheme.colorScheme.primary,
|
|
141
|
-
),
|
|
142
|
-
) {
|
|
143
|
-
Icon(Icons.Default.Send, contentDescription = null)
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
)
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
) { padding ->
|
|
151
|
-
LazyColumn(
|
|
152
|
-
modifier =
|
|
153
|
-
Modifier
|
|
154
|
-
.fillMaxSize()
|
|
155
|
-
.padding(padding),
|
|
156
|
-
contentPadding = PaddingValues(Spacing.MD),
|
|
157
|
-
verticalArrangement = Arrangement.spacedBy(Spacing.XS),
|
|
158
|
-
) {
|
|
159
|
-
if (messages.isEmpty()) {
|
|
160
|
-
item {
|
|
161
|
-
ContractListCard(
|
|
162
|
-
title = stringResource(R.string.chat_empty_thread),
|
|
163
|
-
)
|
|
164
|
-
}
|
|
165
|
-
} else {
|
|
166
|
-
items(messages) { message ->
|
|
167
|
-
Box(
|
|
168
|
-
modifier = Modifier.fillMaxWidth(),
|
|
169
|
-
contentAlignment = if (message.isMine) Alignment.CenterEnd else Alignment.CenterStart,
|
|
170
|
-
) {
|
|
171
|
-
Surface(
|
|
172
|
-
color =
|
|
173
|
-
if (message.isMine) {
|
|
174
|
-
MaterialTheme.colorScheme.primary
|
|
175
|
-
} else {
|
|
176
|
-
MaterialTheme.colorScheme.surfaceVariant
|
|
177
|
-
},
|
|
178
|
-
contentColor =
|
|
179
|
-
if (message.isMine) {
|
|
180
|
-
MaterialTheme.colorScheme.onPrimary
|
|
181
|
-
} else {
|
|
182
|
-
MaterialTheme.colorScheme.onSurface
|
|
183
|
-
},
|
|
184
|
-
shape = if (message.isMine) Shapes.RoundedCapPrimary else Shapes.RoundedCapSecondary,
|
|
185
|
-
modifier = Modifier.widthIn(max = 280.dp),
|
|
186
|
-
) {
|
|
187
|
-
androidx.compose.foundation.layout.Column(
|
|
188
|
-
modifier = Modifier.padding(horizontal = 16.dp, vertical = 10.dp),
|
|
189
|
-
verticalArrangement = Arrangement.spacedBy(Spacing.XS),
|
|
190
|
-
) {
|
|
191
|
-
Text(
|
|
192
|
-
text = message.body,
|
|
193
|
-
style = MaterialTheme.typography.bodyLarge,
|
|
194
|
-
)
|
|
195
|
-
Text(
|
|
196
|
-
text = message.timestamp,
|
|
197
|
-
style = MaterialTheme.typography.labelSmall,
|
|
198
|
-
color =
|
|
199
|
-
if (message.isMine) {
|
|
200
|
-
MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.8f)
|
|
201
|
-
} else {
|
|
202
|
-
MaterialTheme.colorScheme.onSurfaceVariant
|
|
203
|
-
},
|
|
204
|
-
)
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.screens
|
|
2
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
3
|
-
import androidx.compose.foundation.layout.Column
|
|
4
|
-
import androidx.compose.foundation.layout.Spacer
|
|
5
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
6
|
-
import androidx.compose.foundation.layout.height
|
|
7
|
-
import androidx.compose.foundation.layout.padding
|
|
8
|
-
import androidx.compose.foundation.rememberScrollState
|
|
9
|
-
import androidx.compose.foundation.verticalScroll
|
|
10
|
-
import androidx.compose.material.icons.Icons
|
|
11
|
-
import androidx.compose.material.icons.filled.Close
|
|
12
|
-
import androidx.compose.material.icons.filled.Image
|
|
13
|
-
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
14
|
-
import androidx.compose.material3.Icon
|
|
15
|
-
import androidx.compose.material3.IconButton
|
|
16
|
-
import androidx.compose.material3.MaterialTheme
|
|
17
|
-
import androidx.compose.material3.Scaffold
|
|
18
|
-
import androidx.compose.material3.Text
|
|
19
|
-
import androidx.compose.material3.TopAppBar
|
|
20
|
-
import androidx.compose.material3.TopAppBarDefaults
|
|
21
|
-
import androidx.compose.runtime.Composable
|
|
22
|
-
import androidx.compose.runtime.getValue
|
|
23
|
-
import androidx.compose.runtime.mutableStateOf
|
|
24
|
-
import androidx.compose.runtime.remember
|
|
25
|
-
import androidx.compose.runtime.setValue
|
|
26
|
-
import androidx.compose.ui.Modifier
|
|
27
|
-
import androidx.compose.ui.res.stringResource
|
|
28
|
-
import com.social.app.R
|
|
29
|
-
import com.social.app.ui.components.ActionTriggerButton
|
|
30
|
-
import com.social.app.ui.components.ActionTriggerVariant
|
|
31
|
-
import com.social.app.ui.components.ChipOption
|
|
32
|
-
import com.social.app.ui.components.ContractSelectField
|
|
33
|
-
import com.social.app.ui.components.ContractTextField
|
|
34
|
-
import com.social.app.ui.theme.Spacing
|
|
35
|
-
|
|
36
|
-
@OptIn(ExperimentalMaterial3Api::class)
|
|
37
|
-
@Composable
|
|
38
|
-
fun CreatePostScreen(
|
|
39
|
-
onDismiss: () -> Unit,
|
|
40
|
-
onPublish: (String, String) -> Unit,
|
|
41
|
-
) {
|
|
42
|
-
var body by remember { mutableStateOf("") }
|
|
43
|
-
var audience by remember { mutableStateOf("public") }
|
|
44
|
-
var expanded by remember { mutableStateOf(false) }
|
|
45
|
-
val audienceOptions =
|
|
46
|
-
listOf(
|
|
47
|
-
ChipOption("public", stringResource(R.string.create_post_audience_public)),
|
|
48
|
-
ChipOption("followers", stringResource(R.string.create_post_audience_followers)),
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
Scaffold(
|
|
52
|
-
topBar = {
|
|
53
|
-
TopAppBar(
|
|
54
|
-
title = { Text(stringResource(R.string.nav_create)) },
|
|
55
|
-
navigationIcon = {
|
|
56
|
-
IconButton(onClick = onDismiss) {
|
|
57
|
-
Icon(Icons.Default.Close, contentDescription = stringResource(R.string.common_cancel))
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surfaceVariant),
|
|
61
|
-
)
|
|
62
|
-
},
|
|
63
|
-
) { padding ->
|
|
64
|
-
Column(
|
|
65
|
-
modifier =
|
|
66
|
-
Modifier
|
|
67
|
-
.fillMaxSize()
|
|
68
|
-
.padding(padding)
|
|
69
|
-
.padding(horizontal = Spacing.MD)
|
|
70
|
-
.verticalScroll(rememberScrollState()),
|
|
71
|
-
verticalArrangement = Arrangement.spacedBy(Spacing.LG),
|
|
72
|
-
) {
|
|
73
|
-
ContractTextField(
|
|
74
|
-
value = body,
|
|
75
|
-
onValueChange = { body = it.take(4000) },
|
|
76
|
-
modifier = Modifier.padding(top = Spacing.SM),
|
|
77
|
-
label = stringResource(R.string.create_post_body_placeholder),
|
|
78
|
-
placeholder = stringResource(R.string.create_post_body_placeholder),
|
|
79
|
-
singleLine = false,
|
|
80
|
-
maxLines = 12,
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
ContractSelectField(
|
|
84
|
-
label = stringResource(R.string.create_post_audience),
|
|
85
|
-
selectedLabel = audienceOptions.first { it.value == audience }.label,
|
|
86
|
-
expanded = expanded,
|
|
87
|
-
onExpandedChange = { expanded = it },
|
|
88
|
-
options = audienceOptions,
|
|
89
|
-
onOptionSelected = { option -> audience = option.value },
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
ActionTriggerButton(
|
|
93
|
-
text = stringResource(R.string.create_post_add_image),
|
|
94
|
-
onClick = {},
|
|
95
|
-
variant = ActionTriggerVariant.Secondary,
|
|
96
|
-
fullWidth = true,
|
|
97
|
-
icon = { Icon(Icons.Default.Image, contentDescription = null) },
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
ActionTriggerButton(
|
|
101
|
-
text = stringResource(R.string.create_post_publish),
|
|
102
|
-
onClick = {
|
|
103
|
-
onPublish(body, audience)
|
|
104
|
-
},
|
|
105
|
-
enabled = body.isNotBlank(),
|
|
106
|
-
variant = ActionTriggerVariant.Primary,
|
|
107
|
-
fullWidth = true,
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
Spacer(modifier = Modifier.height(Spacing.XL))
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.screens
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
4
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
5
|
-
import androidx.compose.foundation.layout.PaddingValues
|
|
6
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
7
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
8
|
-
import androidx.compose.foundation.layout.padding
|
|
9
|
-
import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
|
|
10
|
-
import androidx.compose.foundation.lazy.LazyColumn
|
|
11
|
-
import androidx.compose.foundation.lazy.LazyRow
|
|
12
|
-
import androidx.compose.foundation.lazy.items
|
|
13
|
-
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
14
|
-
import androidx.compose.material.icons.Icons
|
|
15
|
-
import androidx.compose.material.icons.filled.Search
|
|
16
|
-
import androidx.compose.material3.CenterAlignedTopAppBar
|
|
17
|
-
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
18
|
-
import androidx.compose.material3.Icon
|
|
19
|
-
import androidx.compose.material3.IconButton
|
|
20
|
-
import androidx.compose.material3.MaterialTheme
|
|
21
|
-
import androidx.compose.material3.Scaffold
|
|
22
|
-
import androidx.compose.material3.Text
|
|
23
|
-
import androidx.compose.material3.TopAppBarDefaults
|
|
24
|
-
import androidx.compose.runtime.Composable
|
|
25
|
-
import androidx.compose.runtime.getValue
|
|
26
|
-
import androidx.compose.runtime.mutableStateOf
|
|
27
|
-
import androidx.compose.runtime.remember
|
|
28
|
-
import androidx.compose.runtime.setValue
|
|
29
|
-
import androidx.compose.ui.Modifier
|
|
30
|
-
import androidx.compose.ui.res.stringResource
|
|
31
|
-
import com.social.app.R
|
|
32
|
-
import com.social.app.data.MockData
|
|
33
|
-
import com.social.app.ui.components.ChipOption
|
|
34
|
-
import com.social.app.ui.components.ContractChipRow
|
|
35
|
-
import com.social.app.ui.components.ContractListCard
|
|
36
|
-
import com.social.app.ui.components.ContractSectionHeader
|
|
37
|
-
import com.social.app.ui.components.ContractTextField
|
|
38
|
-
import com.social.app.ui.components.CreatorSuggestionCard
|
|
39
|
-
import com.social.app.ui.theme.Spacing
|
|
40
|
-
|
|
41
|
-
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
|
|
42
|
-
@Composable
|
|
43
|
-
fun DiscoverScreen(
|
|
44
|
-
onUserClick: (String) -> Unit,
|
|
45
|
-
onSearchClick: (String) -> Unit
|
|
46
|
-
) {
|
|
47
|
-
var searchQuery by remember { mutableStateOf("") }
|
|
48
|
-
val creatorListState = rememberLazyListState()
|
|
49
|
-
|
|
50
|
-
Scaffold(
|
|
51
|
-
modifier = Modifier.fillMaxSize(),
|
|
52
|
-
topBar = {
|
|
53
|
-
CenterAlignedTopAppBar(
|
|
54
|
-
title = { Text(stringResource(R.string.nav_discover)) },
|
|
55
|
-
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
|
|
56
|
-
containerColor = MaterialTheme.colorScheme.surface
|
|
57
|
-
)
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
) { padding ->
|
|
61
|
-
LazyColumn(
|
|
62
|
-
modifier = Modifier
|
|
63
|
-
.fillMaxSize()
|
|
64
|
-
.padding(padding)
|
|
65
|
-
.padding(bottom = Spacing.LG)
|
|
66
|
-
) {
|
|
67
|
-
item {
|
|
68
|
-
ContractTextField(
|
|
69
|
-
value = searchQuery,
|
|
70
|
-
onValueChange = { searchQuery = it },
|
|
71
|
-
modifier = Modifier
|
|
72
|
-
.padding(Spacing.MD),
|
|
73
|
-
label = stringResource(R.string.discover_search_placeholder),
|
|
74
|
-
placeholder = stringResource(R.string.discover_search_placeholder),
|
|
75
|
-
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
|
|
76
|
-
trailingAction = {
|
|
77
|
-
IconButton(onClick = { onSearchClick(searchQuery) }) {
|
|
78
|
-
Icon(Icons.Default.Search, contentDescription = null)
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
item {
|
|
85
|
-
ContractSectionHeader(stringResource(R.string.discover_trending))
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
items(MockData.trends) { trend ->
|
|
89
|
-
ContractListCard(
|
|
90
|
-
title = trend.label,
|
|
91
|
-
subtitle = trend.postCount.toString(),
|
|
92
|
-
modifier = Modifier.padding(horizontal = Spacing.MD, vertical = Spacing.XS),
|
|
93
|
-
onClick = { onSearchClick(trend.label) },
|
|
94
|
-
)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
item {
|
|
98
|
-
ContractSectionHeader(stringResource(R.string.discover_popular_tags))
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
item {
|
|
102
|
-
ContractChipRow(
|
|
103
|
-
options =
|
|
104
|
-
MockData.trends.map { trend ->
|
|
105
|
-
ChipOption(
|
|
106
|
-
value = trend.id,
|
|
107
|
-
label = "#${trend.label}",
|
|
108
|
-
)
|
|
109
|
-
},
|
|
110
|
-
selectedValue = "",
|
|
111
|
-
onSelect = { option -> onSearchClick(option.label.removePrefix("#")) },
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
item {
|
|
116
|
-
ContractSectionHeader(stringResource(R.string.discover_suggested_creators))
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
item {
|
|
120
|
-
LazyRow(
|
|
121
|
-
state = creatorListState,
|
|
122
|
-
flingBehavior = rememberSnapFlingBehavior(lazyListState = creatorListState),
|
|
123
|
-
contentPadding = PaddingValues(horizontal = Spacing.MD),
|
|
124
|
-
horizontalArrangement = Arrangement.spacedBy(Spacing.SM),
|
|
125
|
-
modifier = Modifier.padding(bottom = Spacing.LG),
|
|
126
|
-
) {
|
|
127
|
-
items(MockData.users.filter { it.id != "user_me" }) { user ->
|
|
128
|
-
CreatorSuggestionCard(
|
|
129
|
-
user = user,
|
|
130
|
-
onClick = { onUserClick(user.id) },
|
|
131
|
-
)
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|