├── app
├── .gitignore
└── src
│ ├── main
│ ├── ic_launcher-playstore.png
│ ├── res
│ │ ├── drawable
│ │ │ ├── ic_seugi.png
│ │ │ ├── gradient_background.xml
│ │ │ └── ic_launcher_background.xml
│ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ ├── values
│ │ │ ├── themes.xml
│ │ │ ├── strings.xml
│ │ │ └── colors.xml
│ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ └── xml
│ │ │ ├── backup_rules.xml
│ │ │ ├── meal_widget_info.xml
│ │ │ ├── timetable_widget_info.xml
│ │ │ └── data_extraction_rules.xml
│ └── java
│ │ └── com
│ │ └── seugi
│ │ ├── util
│ │ └── SeugiApplication.kt
│ │ ├── starter
│ │ └── SeugiActivityStarterImpl.kt
│ │ └── di
│ │ └── ActivityStarterModule.kt
│ └── test
│ └── java
│ └── com
│ └── apeun
│ └── gidaechi
│ └── seugi
│ └── ExampleUnitTest.kt
├── common
├── .gitignore
├── src
│ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── common
│ │ ├── utiles
│ │ ├── SeugiActivityStarter.kt
│ │ └── SeugiDispatcher.kt
│ │ └── model
│ │ └── Result.kt
└── build.gradle.kts
├── ui
├── .gitignore
└── build.gradle.kts
├── data
├── core
│ ├── .gitignore
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── data
│ │ └── core
│ │ ├── model
│ │ ├── ChatRoomType.kt
│ │ ├── ChatRoomStatusType.kt
│ │ ├── TokenModel.kt
│ │ ├── MealType.kt
│ │ ├── UserModel.kt
│ │ ├── NotificationEmojiModel.kt
│ │ ├── UserInfoModel.kt
│ │ ├── TimetableModel.kt
│ │ ├── WorkspacePermissionModel.kt
│ │ ├── ChatRoomModel.kt
│ │ ├── ProfileModel.kt
│ │ └── MealModel.kt
│ │ └── mapper
│ │ ├── TokenMapper.kt
│ │ ├── WorkspacePermissionMapper.kt
│ │ └── ProfileMapper.kt
├── file
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── file
│ │ │ ├── model
│ │ │ ├── FileType.kt
│ │ │ └── FileModel.kt
│ │ │ ├── mapper
│ │ │ └── FileMapper.kt
│ │ │ ├── di
│ │ │ └── RepositoryModule.kt
│ │ │ └── FileRepository.kt
│ └── build.gradle.kts
├── member
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── member
│ │ │ ├── di
│ │ │ └── MemberRepositoryModule.kt
│ │ │ └── MemberRepository.kt
│ └── build.gradle.kts
├── oauth
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── oauth
│ │ │ ├── OauthRepository.kt
│ │ │ └── di
│ │ │ └── OauthRepositoryModule.kt
│ └── build.gradle.kts
├── token
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── data
│ │ └── token
│ │ ├── TokenRepository.kt
│ │ └── di
│ │ └── RepositoryModule.kt
├── group-chat
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── data
│ │ └── groupchat
│ │ ├── di
│ │ └── RepositoryModule.kt
│ │ └── GroupChatRepository.kt
├── message
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── message
│ │ │ ├── model
│ │ │ ├── MessageLifeType.kt
│ │ │ ├── MessageStompErrorModel.kt
│ │ │ ├── MessageBotRawKeyword.kt
│ │ │ ├── MessageLoadModel.kt
│ │ │ └── stomp
│ │ │ │ └── MessageStompLifecycleModel.kt
│ │ │ ├── mapper
│ │ │ ├── MessageEmojiMapper.kt
│ │ │ ├── MessageStompErrorMapper.kt
│ │ │ ├── MessageLoadMapper.kt
│ │ │ ├── MessageTypeMapper.kt
│ │ │ └── MessageStompMapper.kt
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
├── profile
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── profile
│ │ │ ├── ProfileRepository.kt
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
├── schedule
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── schedule
│ │ │ ├── model
│ │ │ └── ScheduleModel.kt
│ │ │ ├── ScheduleRepository.kt
│ │ │ ├── mapper
│ │ │ └── ScheduleMapper.kt
│ │ │ └── di
│ │ │ └── ScheduleRepositoryModule.kt
│ └── build.gradle.kts
├── timetable
│ ├── consumer-rules.pro
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── data
│ │ └── timetable
│ │ ├── TimetableRepository.kt
│ │ └── di
│ │ └── RepositoryModule.kt
├── workspace
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── workspace
│ │ │ ├── model
│ │ │ ├── CheckWorkspaceModel.kt
│ │ │ ├── WaitWorkspaceModel.kt
│ │ │ └── WorkspaceModel.kt
│ │ │ ├── mapper
│ │ │ ├── CheckWorkspaceMapper.kt
│ │ │ └── WaitWorkspaceMapper.kt
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
├── assignment
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── assignment
│ │ │ ├── model
│ │ │ ├── AssignmentType.kt
│ │ │ └── AssignmentModel.kt
│ │ │ ├── di
│ │ │ └── RepositoryModule.kt
│ │ │ └── AssignmentRepository.kt
│ └── build.gradle.kts
├── email-sign-in
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── member
│ │ │ ├── model
│ │ │ └── EmailSignInModel.kt
│ │ │ ├── mapper
│ │ │ └── EmailSignInMapper.kt
│ │ │ ├── MemberRepositoryModule.kt
│ │ │ └── MemberRepository.kt
│ └── build.gradle.kts
├── firebase-token
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── firebasetoken
│ │ │ ├── model
│ │ │ └── FirebaseTokenModel.kt
│ │ │ ├── mapper
│ │ │ └── FirebaseTokenMapper.kt
│ │ │ ├── FirebaseTokenRepository.kt
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
├── notification
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── notification
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
├── perosnal-chat
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── data
│ │ └── personalchat
│ │ ├── PersonalChatRepository.kt
│ │ └── di
│ │ └── RepositoryModule.kt
├── catseugi
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── data
│ │ │ └── catseugi
│ │ │ ├── CatSeugiRepository.kt
│ │ │ └── di
│ │ │ └── RepositoryModule.kt
│ └── build.gradle.kts
└── meal
│ ├── build.gradle.kts
│ └── src
│ └── main
│ └── java
│ └── com
│ └── seugi
│ └── data
│ └── meal
│ ├── di
│ └── RepositoryModule.kt
│ └── MealRepository.kt
├── local
└── room
│ ├── .gitignore
│ ├── src
│ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── local
│ │ └── room
│ │ ├── util
│ │ ├── SeugiTable.kt
│ │ └── LongListTypeConverter.kt
│ │ ├── entity
│ │ ├── FirebaseTokenEntity.kt
│ │ ├── TokenEntity.kt
│ │ ├── MealEntity.kt
│ │ ├── WorkspaceEntity.kt
│ │ └── WorkspaceNotificationEntity.kt
│ │ ├── dao
│ │ ├── TokenDao.kt
│ │ └── FirebaseTokenDao.kt
│ │ └── base
│ │ └── BaseDao.kt
│ └── build.gradle.kts
├── network
├── .gitignore
├── core
│ ├── .gitignore
│ ├── consumer-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── network
│ │ └── core
│ │ └── response
│ │ ├── WorkspacePermissionResponse.kt
│ │ ├── UserInfoResponse.kt
│ │ ├── UserResponse.kt
│ │ ├── TokenResponse.kt
│ │ ├── Response.kt
│ │ ├── BaseResponse.kt
│ │ ├── FakeLocalDateResponse.kt
│ │ ├── ProfileResponse.kt
│ │ └── ChatRoomResponse.kt
├── file
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── file
│ │ │ ├── request
│ │ │ └── FileRequest.kt
│ │ │ ├── response
│ │ │ └── FileResponse.kt
│ │ │ ├── di
│ │ │ └── FileSourceModule.kt
│ │ │ └── FileDataSource.kt
│ └── build.gradle.kts
├── message
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── message
│ │ │ ├── response
│ │ │ ├── MessageTypeResponse.kt
│ │ │ ├── message
│ │ │ │ ├── MessageUserResponse.kt
│ │ │ │ ├── MessageLoadResponse.kt
│ │ │ │ ├── MessageEmojiResponse.kt
│ │ │ │ ├── MessageDeleteResponse.kt
│ │ │ │ └── MessageMessageResponse.kt
│ │ │ ├── emoji
│ │ │ │ └── MessageEmojiResponse.kt
│ │ │ ├── stomp
│ │ │ │ ├── MessageStompErrorResponse.kt
│ │ │ │ └── MessageStompLifecycleResponse.kt
│ │ │ ├── room
│ │ │ │ ├── MessageRoomUserResponse.kt
│ │ │ │ ├── MessageRoomMemberResponse.kt
│ │ │ │ └── MessageRoomResponse.kt
│ │ │ └── sub
│ │ │ │ └── MessageSubResponse.kt
│ │ │ ├── request
│ │ │ ├── CatSeugiRequest.kt
│ │ │ ├── EmojiRequest.kt
│ │ │ └── MessageRequest.kt
│ │ │ └── di
│ │ │ └── MessageDataSourceModule.kt
│ └── build.gradle.kts
├── oauth
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── oauth
│ │ │ ├── request
│ │ │ └── OauthRequest.kt
│ │ │ ├── OauthDatasource.kt
│ │ │ └── di
│ │ │ └── OauthDatasourceModule.kt
│ └── build.gradle.kts
├── profile
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── profile
│ │ │ ├── request
│ │ │ └── ProfileRequest.kt
│ │ │ ├── ProfileDataSource.kt
│ │ │ └── di
│ │ │ └── NetworkModule.kt
│ └── build.gradle.kts
├── sign-in
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ ├── request
│ │ │ ├── EditRequest.kt
│ │ │ ├── EmailSignInRequest.kt
│ │ │ └── EmailSignUpRequest.kt
│ │ │ ├── di
│ │ │ └── MemberDatasourceModule.kt
│ │ │ └── MemberDatasource.kt
│ └── build.gradle.kts
├── token
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── token
│ │ │ ├── TokenDatasource.kt
│ │ │ └── di
│ │ │ └── DatasourceModule.kt
│ └── build.gradle.kts
├── group-chat
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── groupchat
│ │ │ ├── request
│ │ │ ├── GroupChatMemberAddRequest.kt
│ │ │ └── GroupChatCreateRequest.kt
│ │ │ ├── di
│ │ │ └── DataSourceModule.kt
│ │ │ └── GroupChatDataSource.kt
│ └── build.gradle.kts
├── notification
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── notification
│ │ │ ├── request
│ │ │ ├── NotificationEmojiRequest.kt
│ │ │ ├── NotificationEditRequest.kt
│ │ │ └── NotificationCreateRequest.kt
│ │ │ ├── response
│ │ │ ├── NotificationEmojiResponse.kt
│ │ │ └── NotificationResponse.kt
│ │ │ └── di
│ │ │ └── DataSourceModule.kt
│ └── build.gradle.kts
├── personal-chat
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── personalchat
│ │ │ ├── request
│ │ │ └── PersonalChatCreateRequest.kt
│ │ │ ├── PersonalChatDataSource.kt
│ │ │ ├── di
│ │ │ └── NetworkModule.kt
│ │ │ └── response
│ │ │ └── PersonalChatRoomResponse.kt
│ └── build.gradle.kts
├── schedule
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── schedule
│ │ │ ├── response
│ │ │ └── ScheduleResponse.kt
│ │ │ ├── ScheduleDataSource.kt
│ │ │ └── di
│ │ │ └── DataSourceModule.kt
│ └── build.gradle.kts
├── workspace
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── workspace
│ │ │ ├── request
│ │ │ ├── WorkspaceApplicationRequest.kt
│ │ │ ├── CreateWorkspaceRequest.kt
│ │ │ └── InviteMemberRequest.kt
│ │ │ ├── response
│ │ │ ├── CheckWorkspaceResponse.kt
│ │ │ ├── WaitWorkspaceResponse.kt
│ │ │ └── WorkspaceResponse.kt
│ │ │ └── di
│ │ │ └── NetworkModule.kt
│ └── build.gradle.kts
├── catseugi
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── catseugi
│ │ │ ├── request
│ │ │ └── CatSeugiRequest.kt
│ │ │ ├── CatSeugiDataSource.kt
│ │ │ └── di
│ │ │ └── DataSourceModule.kt
│ └── build.gradle.kts
├── meal
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── network
│ │ └── meal
│ │ ├── response
│ │ └── MealResponse.kt
│ │ ├── MealDataSource.kt
│ │ └── di
│ │ └── DataSourceModule.kt
├── assignment
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── network
│ │ │ └── assignment
│ │ │ ├── request
│ │ │ └── AssignmentCreateRequest.kt
│ │ │ ├── response
│ │ │ ├── AssignmentResponse.kt
│ │ │ └── AssignmentGoogleResponse.kt
│ │ │ ├── di
│ │ │ └── DataSourceModule.kt
│ │ │ └── AssignmentDataSource.kt
│ └── build.gradle.kts
└── timetable
│ ├── src
│ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── network
│ │ └── timetable
│ │ ├── response
│ │ └── TimetableResponse.kt
│ │ ├── TimetableDataSource.kt
│ │ └── di
│ │ └── DataSourceModule.kt
│ └── build.gradle.kts
├── designsystem
├── .gitignore
├── consumer-rules.pro
├── src
│ └── main
│ │ ├── res
│ │ ├── drawable
│ │ │ ├── ic_taco.png
│ │ │ ├── ic_chicken.png
│ │ │ ├── ic_morning.png
│ │ │ ├── img_school.png
│ │ │ ├── img_student.png
│ │ │ ├── img_teacher.png
│ │ │ ├── ic_appicon_round.png
│ │ │ ├── ic_side_polygon.xml
│ │ │ ├── ic_center_samll_polygon.xml
│ │ │ ├── ic_side_small_polygon.xml
│ │ │ ├── ic_center_polygon.xml
│ │ │ ├── ic_home_fill.xml
│ │ │ ├── img_check.xml
│ │ │ ├── test_icon.xml
│ │ │ ├── ic_expand_down_line.xml
│ │ │ ├── ic_expand_right_line.xml
│ │ │ ├── ic_expand_left_line.xml
│ │ │ ├── ic_refresh_fill.xml
│ │ │ ├── ic_back.xml
│ │ │ └── ic_send_fill.xml
│ │ ├── raw
│ │ │ └── loading_dots.riv
│ │ └── font
│ │ │ ├── pretendard_bold.ttf
│ │ │ ├── pretendard_regular.ttf
│ │ │ └── pretendard_semi_bold.ttf
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── designsystem
│ │ ├── component
│ │ ├── modifier
│ │ │ ├── IfModifier.kt
│ │ │ └── BrushDrawModifier.kt
│ │ └── Brush.kt
│ │ └── animation
│ │ └── NoInteractionSource.kt
└── build.gradle.kts
├── stomp-client
├── .gitignore
├── src
│ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── stompclient
│ │ ├── StompException.java
│ │ ├── pathmatcher
│ │ ├── PathMatcher.java
│ │ └── SimplePathMatcher.java
│ │ └── dto
│ │ └── StompCommand.java
└── build.gradle.kts
├── designsystem-preview
├── .gitignore
└── src
│ └── main
│ ├── res
│ ├── values
│ │ ├── strings.xml
│ │ ├── themes.xml
│ │ └── colors.xml
│ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ ├── mipmap-anydpi
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ └── xml
│ │ ├── backup_rules.xml
│ │ └── data_extraction_rules.xml
│ └── java
│ └── com
│ └── apeun
│ └── gidaechi
│ └── designsystem
│ └── preview
│ └── feature
│ └── Error.kt
├── feature-main
├── chat
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── chat
│ │ │ └── model
│ │ │ └── ChatUiState.kt
│ └── build.gradle.kts
├── home
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ └── AndroidManifest.xml
│ └── build.gradle.kts
├── main
│ ├── .gitignore
│ ├── consumer-rules.pro
│ └── src
│ │ └── main
│ │ └── AndroidManifest.xml
├── profile
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── profile
│ │ │ └── model
│ │ │ ├── ProfileSideEffect.kt
│ │ │ └── ProfileUiState.kt
│ └── build.gradle.kts
├── room
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── room
│ │ │ └── model
│ │ │ └── RoomUiState.kt
│ └── build.gradle.kts
├── chat-datail
│ ├── .gitignore
│ ├── consumer-rules.pro
│ └── src
│ │ └── main
│ │ └── AndroidManifest.xml
├── chat-seugi
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── chatseugi
│ │ │ ├── model
│ │ │ └── ChatSeugiUiState.kt
│ │ │ └── navigation
│ │ │ └── ChatSeugiNavigation.kt
│ └── build.gradle.kts
├── meal-widget
│ ├── .gitignore
│ ├── consumer-rules.pro
│ └── src
│ │ └── main
│ │ ├── res
│ │ ├── drawable
│ │ │ ├── shape18_white.xml
│ │ │ ├── shape100_primary050.xml
│ │ │ └── shape22_neutral.xml
│ │ └── layout
│ │ │ └── item_meal_menu.xml
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── meal
│ │ └── widget
│ │ ├── di
│ │ └── MealWidgetEntryPoint.kt
│ │ └── model
│ │ └── MealWidgetState.kt
├── notification
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── notification
│ │ │ └── model
│ │ │ └── NotificationSideEffect.kt
│ └── build.gradle.kts
├── room-create
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ └── AndroidManifest.xml
│ └── build.gradle.kts
├── workspace
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── workspace
│ │ │ └── feature
│ │ │ ├── joinsuccess
│ │ │ └── model
│ │ │ │ └── JoinSuccessSideEffect.kt
│ │ │ └── schoolcode
│ │ │ └── model
│ │ │ └── SchoolCodeModel.kt
│ └── build.gradle.kts
├── workspace-create
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── workspacecreate
│ │ │ └── model
│ │ │ └── WorkspaceCreateSideEffect.kt
│ └── build.gradle.kts
├── workspace-detail
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── workspacedetail
│ │ │ └── feature
│ │ │ ├── workspacemember
│ │ │ └── model
│ │ │ │ ├── WorkspaceMemberSideEffect.kt
│ │ │ │ └── WorkspaceMemberUiState.kt
│ │ │ ├── invitemember
│ │ │ └── model
│ │ │ │ └── DialogModel.kt
│ │ │ └── workspacedetail
│ │ │ └── model
│ │ │ └── WorkspaceDetailUiState.kt
│ └── build.gradle.kts
├── timetable-widget
│ ├── src
│ │ └── main
│ │ │ ├── res
│ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ ├── drawable
│ │ │ │ ├── shape18_white.xml
│ │ │ │ ├── shape100_primary050.xml
│ │ │ │ └── shape22_neutral.xml
│ │ │ └── layout
│ │ │ │ └── item_meal_menu.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── timetable
│ │ │ └── widget
│ │ │ └── di
│ │ │ └── TimetableWidgetEntryPoint.kt
│ └── build.gradle.kts
├── setting
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── setting
│ │ │ └── model
│ │ │ ├── SettingUiState.kt
│ │ │ └── SettingSideEffect.kt
│ └── build.gradle.kts
├── notification-edit
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── notificationedit
│ │ │ └── model
│ │ │ ├── NotificationEditUiState.kt
│ │ │ └── NotificationSideEffect.kt
│ └── build.gradle.kts
├── notification-create
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── notificationcreate
│ │ │ └── model
│ │ │ ├── NotificationCreateUiState.kt
│ │ │ └── NotificationSideEffect.kt
│ └── build.gradle.kts
├── assignment-create
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── task
│ │ │ └── create
│ │ │ └── model
│ │ │ └── TaskCreateSideEffect.kt
│ └── build.gradle.kts
├── meal
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── meal
│ │ ├── model
│ │ └── MealUiState.kt
│ │ └── navigation
│ │ └── MealNavigation.kt
├── timetable
│ └── build.gradle.kts
└── assignment
│ ├── build.gradle.kts
│ └── src
│ └── main
│ └── java
│ └── com
│ └── seugi
│ └── assignment
│ └── model
│ └── AssignmentUiState.kt
├── feature-onboarding
├── join
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── join
│ │ │ ├── feature
│ │ │ └── emailverification
│ │ │ │ └── model
│ │ │ │ └── EmailVerificationSideEffect.kt
│ │ │ └── navigation
│ │ │ └── OAuthSingUpNavigation.kt
│ └── build.gradle.kts
├── login
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── login
│ │ │ └── model
│ │ │ ├── EmailSignInState.kt
│ │ │ └── EmailSignInSideEffect.kt
│ └── build.gradle.kts
├── start
│ ├── consumer-rules.pro
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── res
│ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ └── drawable
│ │ │ │ └── ic_menu.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── seugi
│ │ │ └── start
│ │ │ └── model
│ │ │ └── StartUiState.kt
│ └── build.gradle.kts
└── onboarding
│ ├── .gitignore
│ ├── consumer-rules.pro
│ ├── src
│ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── seugi
│ │ └── onboarding
│ │ └── navigation
│ │ └── OnboardingNavigation.kt
│ └── build.gradle.kts
├── .idea
├── .gitignore
└── misc.xml
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .github
└── PULL_REQUEST_TEMPLATE.md
└── spotless
└── .editorconfig
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/ui/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/core/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/file/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/member/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/oauth/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/token/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/local/room/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/group-chat/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/member/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/message/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/message/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/profile/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/profile/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/schedule/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/timetable/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/workspace/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/workspace/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/designsystem/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/designsystem/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/core/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/core/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/file/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/message/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/oauth/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/profile/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/sign-in/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/token/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/stomp-client/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/assignment/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/email-sign-in/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/email-sign-in/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/firebase-token/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/notification/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/notification/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/perosnal-chat/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/designsystem-preview/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/chat/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/chat/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/home/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/home/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/main/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/main/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/profile/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/room/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/room/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/group-chat/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/notification/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/personal-chat/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/profile/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/schedule/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/sign-in/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/workspace/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/workspace/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/chat-datail/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/chat-datail/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/chat-seugi/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/chat-seugi/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/meal-widget/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/notification/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/room-create/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/room-create/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/workspace/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-onboarding/join/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-onboarding/join/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-onboarding/login/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-onboarding/login/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-onboarding/start/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/network/notification/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/feature-main/workspace-create/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-main/workspace-detail/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-onboarding/onboarding/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature-onboarding/onboarding/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/feature-onboarding/start/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
3 | seugi-android/feature-onboarding/start/src/main/res/values/*
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_seugi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/drawable/ic_seugi.png
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | SeugiDesignSystem
3 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_taco.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/ic_taco.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/raw/loading_dots.riv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/raw/loading_dots.riv
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_chicken.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/ic_chicken.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_morning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/ic_morning.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/img_school.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/img_school.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/img_student.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/img_student.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/img_teacher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/img_teacher.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/font/pretendard_bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/font/pretendard_bold.ttf
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## 개요 (필수)
2 |
3 | - 개요를 적어주세요.
4 |
5 | ## 필요한 조언
6 |
7 | > 필요한 조언에 대해 적어주세요.
8 |
9 | ## 이슈 번호
10 |
11 | - close #ISSUE_NUMBER
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/data/member/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/font/pretendard_regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/font/pretendard_regular.ttf
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/ChatRoomType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | enum class ChatRoomType {
4 | PERSONAL,
5 | GROUP,
6 | }
7 |
--------------------------------------------------------------------------------
/data/file/src/main/java/com/seugi/data/file/model/FileType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.file.model
2 |
3 | enum class FileType {
4 | IMG,
5 | FILE,
6 | EMOJI,
7 | }
8 |
--------------------------------------------------------------------------------
/data/message/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/profile/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/workspace/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_appicon_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/drawable/ic_appicon_round.png
--------------------------------------------------------------------------------
/designsystem/src/main/res/font/pretendard_semi_bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem/src/main/res/font/pretendard_semi_bold.ttf
--------------------------------------------------------------------------------
/network/core/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/network/profile/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/network/sign-in/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/email-sign-in/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/notification/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/chat/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/home/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/main/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/room/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 0.0
4 |
--------------------------------------------------------------------------------
/network/notification/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/network/workspace/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/common/src/main/java/com/seugi/common/utiles/SeugiActivityStarter.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.common.utiles
2 |
3 | interface SeugiActivityStarter {
4 |
5 | fun reStartActivity()
6 | }
7 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/ChatRoomStatusType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | enum class ChatRoomStatusType {
4 | ALIVE,
5 | DELETE,
6 | }
7 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/feature-main/chat-datail/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/chat-seugi/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/room-create/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-onboarding/join/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-onboarding/login/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-onboarding/start/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/model/MessageLifeType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.model
2 |
3 | enum class MessageLifeType {
4 | ALIVE,
5 | DELETE,
6 | }
7 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/feature-onboarding/onboarding/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/feature-main/setting/src/main/java/com/seugi/setting/model/SettingUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.setting.model
2 |
3 | data class SettingUiState(
4 | val isLoading: Boolean = false,
5 | )
6 |
--------------------------------------------------------------------------------
/data/assignment/src/main/java/com/seugi/data/assignment/model/AssignmentType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.assignment.model
2 |
3 | enum class AssignmentType {
4 | GOOGLE,
5 | WORKSPACE,
6 | }
7 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/TokenModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | data class TokenModel(
4 | val accessToken: String?,
5 | val refreshToken: String?,
6 | )
7 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/apeun-gidaechi/seugi-android/HEAD/designsystem-preview/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/data/file/src/main/java/com/seugi/data/file/model/FileModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.file.model
2 |
3 | data class FileModel(
4 | val url: String,
5 | val name: String,
6 | val byte: Long,
7 | )
8 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/data/firebase-token/src/main/java/com/seugi/data/firebasetoken/model/FirebaseTokenModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.firebasetoken.model
2 |
3 | data class FirebaseTokenModel(
4 | val firebaseToken: String?,
5 | )
6 |
--------------------------------------------------------------------------------
/network/file/src/main/java/com/seugi/file/request/FileRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.file.request
2 |
3 | import io.ktor.http.ContentType
4 |
5 | data class FileRequest(
6 | val file: ContentType.MultiPart,
7 | )
8 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/MessageTypeResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response
2 |
3 | abstract class MessageTypeResponse {
4 | abstract val type: String
5 | }
6 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/request/CatSeugiRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.request
2 |
3 | data class CatSeugiRequest(
4 | val message: String,
5 | val roomId: String,
6 | )
7 |
--------------------------------------------------------------------------------
/data/email-sign-in/src/main/java/com/seugi/data/member/model/EmailSignInModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member.model
2 |
3 | data class EmailSignInModel(
4 | val accessToken: String,
5 | val refreshToken: String,
6 | )
7 |
--------------------------------------------------------------------------------
/network/catseugi/src/main/java/com/seugi/network/catseugi/request/CatSeugiRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.catseugi.request
2 |
3 | data class CatSeugiRequest(
4 | val message: String,
5 | val roomId: String,
6 | )
7 |
--------------------------------------------------------------------------------
/network/sign-in/src/main/java/com/seugi/network/request/EditRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.request
2 |
3 | data class EditRequest(
4 | val name: String,
5 | val picture: String,
6 | val birth: String,
7 | )
8 |
--------------------------------------------------------------------------------
/feature-onboarding/login/src/main/java/com/seugi/login/model/EmailSignInState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.login.model
2 |
3 | data class EmailSignInState(
4 | val accessToken: String = "",
5 | val refreshToken: String = "",
6 | )
7 |
--------------------------------------------------------------------------------
/designsystem/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature-main/notification-edit/src/main/java/com/seugi/notificationedit/model/NotificationEditUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.notificationedit.model
2 |
3 | data class NotificationEditUiState(
4 | val isLoading: Boolean = false,
5 | )
6 |
--------------------------------------------------------------------------------
/feature-onboarding/start/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 820534212409-vrm1s6pe3siohglc4jgrvq4pcg0osa3b.apps.googleusercontent.com
4 |
--------------------------------------------------------------------------------
/network/oauth/src/main/java/com/seugi/network/oauth/request/OauthRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.oauth.request
2 |
3 | data class OauthRequest(
4 | val code: String,
5 | val platform: String,
6 | val token: String,
7 | )
8 |
--------------------------------------------------------------------------------
/feature-main/profile/src/main/java/com/seugi/profile/model/ProfileSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.profile.model
2 |
3 | sealed interface ProfileSideEffect {
4 | data class FailedChange(val throwable: Throwable) : ProfileSideEffect
5 | }
6 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/message/MessageUserResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.message
2 |
3 | data class MessageUserResponse(
4 | val id: Int,
5 | val name: String,
6 | )
7 |
--------------------------------------------------------------------------------
/feature-main/notification-create/src/main/java/com/seugi/notificationcreate/model/NotificationCreateUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.notificationcreate.model
2 |
3 | data class NotificationCreateUiState(
4 | val isLoading: Boolean = false,
5 | )
6 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/request/EmojiRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.request
2 |
3 | data class EmojiRequest(
4 | val messageId: String,
5 | val roomId: String,
6 | val emojiId: Int,
7 | )
8 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/emoji/MessageEmojiResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.emoji
2 |
3 | data class MessageEmojiResponse(
4 | val userId: List,
5 | val emojiId: Int,
6 | )
7 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/WorkspacePermissionResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | enum class WorkspacePermissionResponse {
4 | ADMIN,
5 | MIDDLE_ADMIN,
6 | TEACHER,
7 | STUDENT,
8 | }
9 |
--------------------------------------------------------------------------------
/network/token/src/main/java/com/seugi/network/token/TokenDatasource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.token
2 |
3 | interface TokenDatasource {
4 |
5 | suspend fun refreshToken(refreshToken: String): String
6 |
7 | suspend fun removeCacheToken()
8 | }
9 |
--------------------------------------------------------------------------------
/stomp-client/src/main/java/com/seugi/stompclient/StompException.java:
--------------------------------------------------------------------------------
1 | package com.seugi.stompclient;
2 |
3 | public class StompException extends RuntimeException {
4 |
5 | public StompException(String message) {
6 | super(message);
7 | }
8 | }
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/MealType.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | enum class MealType {
7 | BREAKFAST,
8 | LUNCH,
9 | DINNER,
10 | }
11 |
--------------------------------------------------------------------------------
/feature-main/notification/src/main/java/com/seugi/notification/model/NotificationSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.notification.model
2 |
3 | sealed interface NotificationSideEffect {
4 | data class Error(val throwable: Throwable) : NotificationSideEffect
5 | }
6 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/request/NotificationEmojiRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.request
2 |
3 | data class NotificationEmojiRequest(
4 | val emoji: String,
5 | val notificationId: Long,
6 | )
7 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/response/NotificationEmojiResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.response
2 |
3 | data class NotificationEmojiResponse(
4 | val emoji: String,
5 | val userList: List,
6 | )
7 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/UserModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | data class UserModel(
4 | val id: Long,
5 | val email: String,
6 | val birth: String,
7 | val name: String,
8 | val picture: String,
9 | )
10 |
--------------------------------------------------------------------------------
/network/group-chat/src/main/java/com/seugi/network/groupchat/request/GroupChatMemberAddRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat.request
2 |
3 | data class GroupChatMemberAddRequest(
4 | val chatRoomId: String,
5 | val chatMemberUsers: List,
6 | )
7 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/model/MessageStompErrorModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.model
2 |
3 | data class MessageStompErrorModel(
4 | val status: Int,
5 | val success: Boolean,
6 | val state: String,
7 | val message: String,
8 | )
9 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/UserInfoResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class UserInfoResponse(
6 | val userInfo: UserResponse,
7 | val timestamp: LocalDateTime,
8 | )
9 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/request/NotificationEditRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.request
2 |
3 | data class NotificationEditRequest(
4 | val title: String,
5 | val content: String,
6 | val id: Long,
7 | )
8 |
--------------------------------------------------------------------------------
/stomp-client/src/main/java/com/seugi/stompclient/pathmatcher/PathMatcher.java:
--------------------------------------------------------------------------------
1 | package com.seugi.stompclient.pathmatcher;
2 |
3 | import com.seugi.stompclient.dto.StompMessage;
4 |
5 | public interface PathMatcher {
6 |
7 | boolean matches(String path, StompMessage msg);
8 | }
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/NotificationEmojiModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import kotlinx.collections.immutable.ImmutableList
4 |
5 | data class NotificationEmojiModel(
6 | val emoji: String,
7 | val userList: ImmutableList,
8 | )
9 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Mar 24 16:30:00 KST 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/network/catseugi/src/main/java/com/seugi/network/catseugi/CatSeugiDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.catseugi
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 |
5 | interface CatSeugiDataSource {
6 |
7 | suspend fun sendText(text: String): BaseResponse
8 | }
9 |
--------------------------------------------------------------------------------
/network/file/src/main/java/com/seugi/file/response/FileResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.file.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class FileResponse(
7 | val url: String,
8 | val name: String,
9 | val byte: Long,
10 | )
11 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/request/NotificationCreateRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.request
2 |
3 | data class NotificationCreateRequest(
4 | val title: String,
5 | val content: String,
6 | val workspaceId: String,
7 | )
8 |
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/request/WorkspaceApplicationRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.request
2 |
3 | data class WorkspaceApplicationRequest(
4 | val workspaceId: String,
5 | val workspaceCode: String,
6 | val role: String,
7 | )
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/gradient_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/UserInfoModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class UserInfoModel(
6 | val userInfo: UserModel,
7 | val timestamp: LocalDateTime,
8 | val utcTimeMillis: Long,
9 | )
10 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/UserResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | data class UserResponse(
4 | val id: Long,
5 | val email: String,
6 | val birth: String,
7 | val name: String,
8 | val picture: String,
9 | )
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/designsystem/src/main/java/com/seugi/designsystem/component/modifier/IfModifier.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.designsystem.component.modifier
2 |
3 | import androidx.compose.ui.Modifier
4 |
5 | inline fun Modifier.`if`(enabled: Boolean, modifier: Modifier.() -> Modifier) = if (enabled) modifier() else this
6 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/TokenResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class TokenResponse(
7 | val accessToken: String,
8 | val refreshToken: String,
9 | )
10 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/res/drawable/shape18_white.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/feature-onboarding/login/src/main/java/com/seugi/login/model/EmailSignInSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.login.model
2 |
3 | sealed class EmailSignInSideEffect {
4 | data class FailedLogin(val throwable: Throwable) : EmailSignInSideEffect()
5 | data object SuccessLogin : EmailSignInSideEffect()
6 | }
7 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/model/MessageBotRawKeyword.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.model
2 |
3 | data class MessageBotRawKeyword(
4 | val keyword: String,
5 | )
6 |
7 | data class MessageBotRawKeywordInData(
8 | val keyword: String,
9 | val data: T,
10 | )
11 |
--------------------------------------------------------------------------------
/feature-main/assignment-create/src/main/java/com/seugi/task/create/model/TaskCreateSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.task.create.model
2 |
3 | sealed interface TaskCreateSideEffect {
4 | data object Success : TaskCreateSideEffect
5 | data class Failed(val throwable: Throwable) : TaskCreateSideEffect
6 | }
7 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/res/drawable/shape100_primary050.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/res/drawable/shape22_neutral.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/res/drawable/shape18_white.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/stomp/MessageStompErrorResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.stomp
2 |
3 | data class MessageStompErrorResponse(
4 | val status: Int,
5 | val success: Boolean,
6 | val state: String,
7 | val message: String,
8 | )
9 |
--------------------------------------------------------------------------------
/data/catseugi/src/main/java/com/seugi/data/catseugi/CatSeugiRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.catseugi
2 |
3 | import com.seugi.common.model.Result
4 | import kotlinx.coroutines.flow.Flow
5 |
6 | interface CatSeugiRepository {
7 |
8 | suspend fun sendText(text: String): Flow>
9 | }
10 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/res/drawable/shape100_primary050.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/res/drawable/shape22_neutral.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/network/sign-in/src/main/java/com/seugi/network/request/EmailSignInRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.request
2 |
3 | import kotlinx.serialization.Serializable
4 | @Serializable
5 | data class EmailSignInRequest(
6 | val email: String,
7 | val password: String,
8 | val token: String,
9 | )
10 |
--------------------------------------------------------------------------------
/common/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.kotlin)
3 | alias(libs.plugins.seugi.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 |
8 | dependencies {
9 | implementation(libs.kotlinx.datetime)
10 | implementation(libs.kotlinx.collections.immutable)
11 | }
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/model/MessageLoadModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.model
2 |
3 | import kotlinx.collections.immutable.ImmutableList
4 |
5 | data class MessageLoadModel(
6 | val firstMessageId: String?,
7 | val messages: ImmutableList,
8 | )
9 |
--------------------------------------------------------------------------------
/network/group-chat/src/main/java/com/seugi/network/groupchat/request/GroupChatCreateRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat.request
2 |
3 | data class GroupChatCreateRequest(
4 | val workspaceId: String,
5 | val roomName: String,
6 | val joinUsers: List,
7 | val chatRoomImg: String,
8 | )
9 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/designsystem/src/main/java/com/seugi/designsystem/component/Brush.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.designsystem.component
2 |
3 | import androidx.compose.ui.graphics.Brush
4 | import androidx.compose.ui.graphics.Color
5 |
6 | val GradientPrimary = Brush.verticalGradient(
7 | colors = listOf(Color(0xFF1C8DF4), Color(0xFF21B6E5)),
8 | )
9 |
--------------------------------------------------------------------------------
/network/personal-chat/src/main/java/com/seugi/network/personalchat/request/PersonalChatCreateRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat.request
2 |
3 | data class PersonalChatCreateRequest(
4 | val workspaceId: String,
5 | val roomName: String,
6 | val joinUsers: List,
7 | val chatRoomImg: String,
8 | )
9 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/data/file/src/main/java/com/seugi/data/file/mapper/FileMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.file.mapper
2 |
3 | import com.seugi.data.file.model.FileModel
4 | import com.seugi.file.response.FileResponse
5 |
6 | fun FileResponse.toModel(): FileModel = FileModel(
7 | url = url,
8 | name = name,
9 | byte = byte,
10 | )
11 |
--------------------------------------------------------------------------------
/feature-main/notification-create/src/main/java/com/seugi/notificationcreate/model/NotificationSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.notificationcreate.model
2 |
3 | sealed interface NotificationSideEffect {
4 | data object Success : NotificationSideEffect
5 | data class Error(val throwable: Throwable) : NotificationSideEffect
6 | }
7 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/Response.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Response(
7 | val message: String,
8 | val status: Int,
9 | val state: String,
10 | val success: Boolean,
11 | )
12 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/room/MessageRoomUserResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.room
2 |
3 | data class MessageRoomUserResponse(
4 | val id: Int,
5 | val email: String,
6 | val birth: String,
7 | val name: String,
8 | val picture: String,
9 | )
10 |
--------------------------------------------------------------------------------
/network/profile/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.network.profile"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.network.core)
12 | implementation(projects.common)
13 | }
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/request/CreateWorkspaceRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.request
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class CreateWorkspaceRequest(
7 | val workspaceName: String,
8 | val workspaceImageUrl: String,
9 | )
10 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/model/CheckWorkspaceModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.model
2 |
3 | data class CheckWorkspaceModel(
4 | val workspaceId: String,
5 | val workspaceName: String,
6 | val workspaceImageUrl: String,
7 | val studentCount: Int,
8 | val teacherCount: Int,
9 | )
10 |
--------------------------------------------------------------------------------
/feature-main/workspace-create/src/main/java/com/seugi/workspacecreate/model/WorkspaceCreateSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspacecreate.model
2 |
3 | sealed interface WorkspaceCreateSideEffect {
4 | data object SuccessCreate : WorkspaceCreateSideEffect
5 | data class Error(val throwable: Throwable) : WorkspaceCreateSideEffect
6 | }
7 |
--------------------------------------------------------------------------------
/network/group-chat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.network.groupchat"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.common)
12 | implementation(projects.network.core)
13 | }
--------------------------------------------------------------------------------
/network/sign-in/src/main/java/com/seugi/network/request/EmailSignUpRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.request
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class EmailSignUpRequest(
7 | val name: String,
8 | val email: String,
9 | val password: String,
10 | val code: String,
11 | )
12 |
--------------------------------------------------------------------------------
/feature-main/notification-edit/src/main/java/com/seugi/notificationedit/model/NotificationSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.notificationedit.model
2 |
3 | sealed interface NotificationSideEffect {
4 | data class Success(val message: String) : NotificationSideEffect
5 | data class Error(val throwable: Throwable) : NotificationSideEffect
6 | }
7 |
--------------------------------------------------------------------------------
/network/notification/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.network.notification"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.network.core)
12 | implementation(projects.common)
13 | }
--------------------------------------------------------------------------------
/network/personal-chat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.network.personalchat"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.network.core)
12 | implementation(projects.common)
13 | }
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/request/InviteMemberRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.request
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class InviteMemberRequest(
7 | val workspaceId: String,
8 | val userSet: List,
9 | val role: String,
10 | )
11 |
--------------------------------------------------------------------------------
/feature-main/workspace/src/main/java/com/seugi/workspace/feature/joinsuccess/model/JoinSuccessSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspace.feature.joinsuccess.model
2 |
3 | sealed class JoinSuccessSideEffect {
4 | data object SuccessApplication : JoinSuccessSideEffect()
5 | data class FiledApplication(val throwable: Throwable) : JoinSuccessSideEffect()
6 | }
7 |
--------------------------------------------------------------------------------
/network/meal/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.meal"
9 | }
10 |
11 | dependencies {
12 | api(projects.network.core)
13 | implementation(projects.common)
14 | }
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/room/MessageRoomMemberResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.room
2 |
3 | data class MessageRoomMemberResponse(
4 | val chatRoomId: Int,
5 | val workspaceId: String,
6 | val roomType: String,
7 | val roomAdmin: Int?,
8 | val joinUserId: List,
9 | )
10 |
--------------------------------------------------------------------------------
/network/profile/src/main/java/com/seugi/network/profile/request/ProfileRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.profile.request
2 |
3 | data class ProfileRequest(
4 | val nick: String,
5 | val status: String,
6 | val spot: String,
7 | val belong: String,
8 | val phone: String,
9 | val wire: String,
10 | val location: String,
11 | )
12 |
--------------------------------------------------------------------------------
/common/src/main/java/com/seugi/common/utiles/SeugiDispatcher.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.common.utiles
2 |
3 | import javax.inject.Qualifier
4 |
5 | @Qualifier
6 | @Retention(AnnotationRetention.RUNTIME)
7 | annotation class SeugiDispatcher(val dispatcherType: DispatcherType)
8 |
9 | enum class DispatcherType {
10 | Default,
11 | IO,
12 | Main,
13 | }
14 |
--------------------------------------------------------------------------------
/network/assignment/src/main/java/com/seugi/network/assignment/request/AssignmentCreateRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.assignment.request
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class AssignmentCreateRequest(
6 | val workspaceId: String,
7 | val title: String,
8 | val description: String,
9 | val dueDate: LocalDateTime,
10 | )
11 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/BaseResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class BaseResponse(
7 | val data: T,
8 | val message: String,
9 | val status: Int,
10 | val state: String,
11 | val success: Boolean,
12 | )
13 |
--------------------------------------------------------------------------------
/network/oauth/src/main/java/com/seugi/network/oauth/OauthDatasource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.oauth
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.core.response.TokenResponse
5 |
6 | interface OauthDatasource {
7 |
8 | suspend fun authenticate(code: String, fcmToken: String): BaseResponse
9 | }
10 |
--------------------------------------------------------------------------------
/data/oauth/src/main/java/com/seugi/data/oauth/OauthRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.oauth
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.TokenModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface OauthRepository {
8 |
9 | suspend fun authenticate(code: String, fcmToken: String): Flow>
10 | }
11 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/model/WaitWorkspaceModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.model
2 |
3 | data class WaitWorkspaceModel(
4 | val workspaceId: String = "",
5 | val workspaceName: String = "",
6 | val workspaceImageUrl: String = "",
7 | val studentCount: String = "",
8 | val teacherCount: String = "",
9 | )
10 |
--------------------------------------------------------------------------------
/feature-main/room/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.room"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.data.core)
14 | implementation(projects.data.groupChat)
15 | }
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/message/MessageLoadResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.message
2 |
3 | import com.seugi.network.message.response.MessageRoomEventResponse
4 |
5 | data class MessageLoadResponse(
6 | val firstMessageId: String?,
7 | val messages: List,
8 | )
9 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/sub/MessageSubResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.sub
2 |
3 | import com.seugi.network.message.response.MessageTypeResponse
4 |
5 | data class MessageSubResponse(
6 | override val type: String,
7 | val userId: Int,
8 | val eventList: List,
9 | ) : MessageTypeResponse()
10 |
--------------------------------------------------------------------------------
/network/assignment/src/main/java/com/seugi/network/assignment/response/AssignmentResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.assignment.response
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class AssignmentResponse(
6 | val id: Long,
7 | val workspaceId: String,
8 | val title: String,
9 | val description: String?,
10 | val dueDate: LocalDateTime?,
11 | )
12 |
--------------------------------------------------------------------------------
/network/file/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 |
6 | }
7 |
8 | android {
9 | namespace = "com.seugi.network.file"
10 | }
11 |
12 | dependencies {
13 | implementation(projects.common)
14 | api(projects.network.core)
15 | }
--------------------------------------------------------------------------------
/feature-main/meal/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.meal"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 |
12 | implementation(projects.common)
13 | implementation(projects.data.meal)
14 |
15 | implementation(libs.kotlinx.datetime)
16 |
17 | }
--------------------------------------------------------------------------------
/network/assignment/src/main/java/com/seugi/network/assignment/response/AssignmentGoogleResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.assignment.response
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class AssignmentGoogleResponse(
6 | val id: Long,
7 | val title: String,
8 | val description: String?,
9 | val link: String,
10 | val dueDate: LocalDateTime?,
11 | )
12 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/message/MessageEmojiResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.message
2 |
3 | import com.seugi.network.message.response.MessageTypeResponse
4 |
5 | data class MessageEmojiResponse(
6 | override val type: String,
7 | val emojiId: Int,
8 | val userId: List,
9 | ) : MessageTypeResponse()
10 |
--------------------------------------------------------------------------------
/data/email-sign-in/src/main/java/com/seugi/data/member/mapper/EmailSignInMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member.mapper
2 |
3 | import com.seugi.data.member.model.EmailSignInModel
4 | import com.seugi.network.response.EmailSignInResponse
5 |
6 | internal fun EmailSignInResponse.toModel() = EmailSignInModel(
7 | accessToken = accessToken,
8 | refreshToken = refreshToken,
9 | )
10 |
--------------------------------------------------------------------------------
/feature-main/timetable/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.timetable"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.data.timetable)
14 | implementation(libs.kotlinx.datetime)
15 | }
--------------------------------------------------------------------------------
/network/assignment/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.task"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 | }
--------------------------------------------------------------------------------
/network/catseugi/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 |
6 | }
7 |
8 | android {
9 | namespace = "com.seugi.network.catseugi"
10 | }
11 |
12 | dependencies {
13 | implementation(projects.common)
14 | api(projects.network.core)
15 | }
--------------------------------------------------------------------------------
/data/firebase-token/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.firebasetoken"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.local.room)
15 | }
--------------------------------------------------------------------------------
/data/firebase-token/src/main/java/com/seugi/data/firebasetoken/mapper/FirebaseTokenMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.firebasetoken.mapper
2 |
3 | import com.seugi.data.firebasetoken.model.FirebaseTokenModel
4 | import com.seugi.local.room.entity.FirebaseTokenEntity
5 |
6 | fun FirebaseTokenEntity?.toModel(): FirebaseTokenModel = FirebaseTokenModel(
7 | firebaseToken = this?.firebaseToken,
8 | )
9 |
--------------------------------------------------------------------------------
/feature-main/workspace-detail/src/main/java/com/seugi/workspacedetail/feature/workspacemember/model/WorkspaceMemberSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspacedetail.feature.workspacemember.model
2 |
3 | sealed interface WorkspaceMemberSideEffect {
4 | data class SuccessCreateRoom(val roomUid: String) : WorkspaceMemberSideEffect
5 | data object FailedCreateRoom : WorkspaceMemberSideEffect
6 | }
7 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/message/MessageDeleteResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.message
2 |
3 | import com.seugi.network.message.response.MessageTypeResponse
4 |
5 | data class MessageDeleteResponse(
6 | override val type: String,
7 | val eventList: List,
8 | val messageId: String,
9 | ) : MessageTypeResponse()
10 |
--------------------------------------------------------------------------------
/feature-main/setting/src/main/java/com/seugi/setting/model/SettingSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.setting.model
2 |
3 | sealed interface SettingSideEffect {
4 | data object SuccessLogout : SettingSideEffect
5 | data object SuccessWithdraw : SettingSideEffect
6 | data object SuccessEdit : SettingSideEffect
7 | data class FailedWithdraw(val throwable: Throwable) : SettingSideEffect
8 | }
9 |
--------------------------------------------------------------------------------
/network/schedule/src/main/java/com/seugi/network/schedule/response/ScheduleResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.schedule.response
2 |
3 | import kotlinx.datetime.LocalDate
4 |
5 | data class ScheduleResponse(
6 | val id: Long,
7 | val workspaceId: String,
8 | val date: LocalDate,
9 | val eventName: String,
10 | val eventContent: String,
11 | val grade: List,
12 | )
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 스기
3 | 스기 급식
4 | 스기 시간표 위젯
5 | seugi_default_channle
6 | Seugi Default Channle
7 |
--------------------------------------------------------------------------------
/ui/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.compose)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.ui"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 | dependencies {
15 | implementation(projects.designsystem)
16 | }
--------------------------------------------------------------------------------
/data/file/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.file"
9 | }
10 |
11 | dependencies {
12 | api(projects.network.file)
13 | implementation(projects.common)
14 | implementation(libs.kotlinx.coroutines.android)
15 | }
--------------------------------------------------------------------------------
/feature-onboarding/start/src/main/res/drawable/ic_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-anydpi/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_side_polygon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/feature-main/workspace-detail/src/main/java/com/seugi/workspacedetail/feature/invitemember/model/DialogModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspacedetail.feature.invitemember.model
2 |
3 | data class DialogModel(
4 | val title: String = "",
5 | val content: String? = null,
6 | val lText: String = "",
7 | val rText: String = "",
8 | val icon: Int? = null,
9 | val onClick: () -> Unit = {},
10 | )
11 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/TimetableModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import kotlinx.datetime.LocalDate
4 |
5 | data class TimetableModel(
6 | val id: Long,
7 | val workspaceId: String,
8 | val grade: String,
9 | val classNum: String,
10 | val time: String,
11 | val subject: String,
12 | val date: LocalDate,
13 | val weekday: String,
14 | )
15 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/mipmap-anydpi/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_center_samll_polygon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_side_small_polygon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/feature-main/profile/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.profile"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.ui)
14 | implementation(projects.data.profile)
15 | implementation(projects.data.core)
16 | }
--------------------------------------------------------------------------------
/feature-main/workspace/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.workspace"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 | implementation(projects.data.member)
12 | implementation(projects.data.workspace)
13 | implementation(projects.common)
14 | implementation(projects.ui)
15 | }
--------------------------------------------------------------------------------
/feature-onboarding/join/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.join"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 | implementation(projects.data.member)
12 | implementation(projects.data.workspace)
13 | implementation(projects.common)
14 | implementation(projects.ui)
15 |
16 | }
--------------------------------------------------------------------------------
/network/meal/src/main/java/com/seugi/network/meal/response/MealResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.meal.response
2 |
3 | import kotlinx.datetime.LocalDate
4 |
5 | data class MealResponse(
6 | val id: Long,
7 | val workspaceId: String,
8 | val mealType: String,
9 | val menu: List,
10 | val calorie: String,
11 | val mealInfo: List,
12 | val mealDate: LocalDate,
13 | )
14 |
--------------------------------------------------------------------------------
/network/schedule/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.schedule"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.core)
15 | api(projects.data.core)
16 | }
--------------------------------------------------------------------------------
/network/timetable/src/main/java/com/seugi/network/timetable/response/TimetableResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.timetable.response
2 |
3 | import kotlinx.datetime.LocalDate
4 |
5 | data class TimetableResponse(
6 | val id: Long,
7 | val workspaceId: String,
8 | val grade: String,
9 | val classNum: String,
10 | val time: String,
11 | val subject: String,
12 | val date: LocalDate,
13 | )
14 |
--------------------------------------------------------------------------------
/data/assignment/src/main/java/com/seugi/data/assignment/model/AssignmentModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.assignment.model
2 |
3 | import kotlinx.datetime.LocalDateTime
4 |
5 | data class AssignmentModel(
6 | val id: Long,
7 | val workspaceId: String?,
8 | val title: String,
9 | val type: AssignmentType,
10 | val link: String?,
11 | val description: String?,
12 | val dueDate: LocalDateTime?,
13 | )
14 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_center_polygon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/FakeLocalDateResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import kotlinx.datetime.LocalDate
4 |
5 | /**
6 | * It use Date "yyyyMMdd" Format
7 | */
8 | class FakeLocalDateResponse(
9 | val data: String,
10 | ) {
11 | fun getLocalDate() = LocalDate(data.substring(0, 4).toInt(), data.substring(4, 6).toInt(), data.substring(6, 8).toInt())
12 | }
13 |
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/response/CheckWorkspaceResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class CheckWorkspaceResponse(
7 | val workspaceId: String,
8 | val workspaceName: String,
9 | val workspaceImageUrl: String,
10 | val studentCount: Int,
11 | val teacherCount: Int,
12 | )
13 |
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/response/WaitWorkspaceResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class WaitWorkspaceResponse(
7 | val workspaceId: String,
8 | val workspaceName: String,
9 | val workspaceImageUrl: String,
10 | val studentCount: String,
11 | val teacherCount: String,
12 | )
13 |
--------------------------------------------------------------------------------
/data/email-sign-in/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.data.member"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.network.signIn)
12 | implementation(projects.network.core)
13 | implementation(projects.common)
14 | implementation(libs.kotlinx.coroutines.android)
15 | }
--------------------------------------------------------------------------------
/feature-main/chat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.chat"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(libs.kotlinx.collections.immutable)
13 | implementation(projects.data.perosnalChat)
14 | implementation(projects.common)
15 | implementation(projects.data.core)
16 | }
--------------------------------------------------------------------------------
/feature-onboarding/onboarding/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.onboarding"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 |
12 | implementation(projects.featureOnboarding.login)
13 | implementation(projects.featureOnboarding.start)
14 | implementation(projects.featureOnboarding.join)
15 |
16 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/data/schedule/src/main/java/com/seugi/data/schedule/model/ScheduleModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.schedule.model
2 |
3 | import kotlinx.collections.immutable.ImmutableList
4 | import kotlinx.datetime.LocalDate
5 |
6 | data class ScheduleModel(
7 | val id: Long,
8 | val workspaceId: String,
9 | val date: LocalDate,
10 | val eventName: String,
11 | val eventContent: String,
12 | val grade: ImmutableList,
13 | )
14 |
--------------------------------------------------------------------------------
/feature-main/notification-create/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.notificationcreate"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.ui)
14 | implementation(projects.data.notification)
15 | implementation(projects.data.core)
16 | }
--------------------------------------------------------------------------------
/network/oauth/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.oauth"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 | implementation(libs.kotlinx.coroutines.android)
15 | }
--------------------------------------------------------------------------------
/network/sign-in/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.emailsignin"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 | implementation(libs.kotlinx.coroutines.android)
15 | }
--------------------------------------------------------------------------------
/network/workspace/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.workspace"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 | implementation(libs.kotlinx.coroutines.android)
15 | }
--------------------------------------------------------------------------------
/feature-onboarding/start/src/main/java/com/seugi/start/model/StartUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.start.model
2 |
3 | data class StartUiState(
4 | val loginState: LoginState = LoginState.Init,
5 | )
6 |
7 | sealed interface LoginState {
8 | data object Success : LoginState
9 | data object Loading : LoginState
10 | data object Error : LoginState
11 | data object Init : LoginState
12 | }
13 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/mapper/MessageEmojiMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.mapper
2 |
3 | import com.seugi.data.message.model.MessageEmojiModel
4 | import com.seugi.network.message.response.message.MessageEmojiResponse
5 | import kotlinx.collections.immutable.toImmutableList
6 |
7 | internal fun MessageEmojiResponse.toModel() = MessageEmojiModel(
8 | userId = userId.toImmutableList(),
9 | emojiId = emojiId,
10 | )
11 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/mapper/MessageStompErrorMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.mapper
2 |
3 | import com.seugi.data.message.model.MessageStompErrorModel
4 | import com.seugi.network.message.response.stomp.MessageStompErrorResponse
5 |
6 | internal fun MessageStompErrorResponse.toModel() = MessageStompErrorModel(
7 | status = status,
8 | success = success,
9 | state = state,
10 | message = message,
11 | )
12 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/data/assignment/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.task"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.core)
15 | implementation(projects.network.assignment)
16 | api(projects.data.core)
17 | }
--------------------------------------------------------------------------------
/data/profile/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.profile"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.profile)
15 | implementation(projects.network.core)
16 | api(projects.data.core)
17 | }
--------------------------------------------------------------------------------
/data/schedule/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.schedule"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.core)
15 | implementation(projects.network.schedule)
16 | api(projects.data.core)
17 | }
--------------------------------------------------------------------------------
/data/token/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.token"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.local.room)
15 | implementation(projects.network.token)
16 | implementation(projects.data.core)
17 | }
--------------------------------------------------------------------------------
/feature-onboarding/join/src/main/java/com/seugi/join/feature/emailverification/model/EmailVerificationSideEffect.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.join.feature.emailverification.model
2 |
3 | sealed class EmailVerificationSideEffect {
4 | data object SuccessGetCode : EmailVerificationSideEffect()
5 | data object SuccessJoin : EmailVerificationSideEffect()
6 | data object FiledJoin : EmailVerificationSideEffect()
7 | data object Error : EmailVerificationSideEffect()
8 | }
9 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/util/SeugiTable.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.util
2 |
3 | object SeugiTable {
4 | const val SEUGI_TABLE = "SEUGI_TABLE"
5 | const val TOKEN_TABLE = "TOKEN_TABLE"
6 | const val WORKSPACE_TABLE = "WORKSPACE_TABLE"
7 | const val WORKSPACE_NOTIFICATION_TABLE = "WORKSPACE_NOTIFICATION_TABLE"
8 | const val MEAL_TABLE = "MEAL_TABLE"
9 | const val FIREBASE_TOKEN_TABLE = "FIREBASE_TOKEN_TABLE"
10 | }
11 |
--------------------------------------------------------------------------------
/data/member/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.data.member"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.network.signIn)
12 | implementation(projects.network.core)
13 | implementation(projects.data.core)
14 | implementation(projects.common)
15 | implementation(libs.kotlinx.coroutines.android)
16 | }
--------------------------------------------------------------------------------
/data/timetable/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.timetable"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.core)
15 | implementation(projects.network.timetable)
16 | api(projects.data.core)
17 | }
--------------------------------------------------------------------------------
/feature-main/workspace-create/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.workspacecreate"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 | implementation(projects.data.member)
12 | implementation(projects.data.workspace)
13 | implementation(projects.data.file)
14 | implementation(projects.common)
15 | implementation(projects.ui)
16 | }
--------------------------------------------------------------------------------
/app/src/test/java/com/apeun/gidaechi/seugi/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.seugi
2 |
3 | import org.junit.Assert.assertEquals
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/feature-main/notification-edit/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.notificationedit"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.ui)
14 | implementation(projects.data.notification)
15 | implementation(projects.data.core)
16 | implementation(projects.data.workspace)
17 | }
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/entity/FirebaseTokenEntity.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.entity
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 | import com.seugi.local.room.util.SeugiTable
6 |
7 | @Entity(tableName = SeugiTable.FIREBASE_TOKEN_TABLE)
8 | data class FirebaseTokenEntity(
9 | @PrimaryKey val idx: Int,
10 | val firebaseToken: String,
11 | ) {
12 | constructor(firebaseToken: String) : this(0, firebaseToken)
13 | }
14 |
--------------------------------------------------------------------------------
/network/token/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.token"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 | implementation(libs.kotlinx.coroutines.android)
15 | implementation(libs.ktor.client.auth)
16 | }
--------------------------------------------------------------------------------
/designsystem/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.compose)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.designsystem"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 | dependencies {
14 | api(libs.androidx.compose.material)
15 | implementation(libs.coil.compose)
16 | implementation(libs.rive)
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/seugi/util/SeugiApplication.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.util
2 |
3 | import android.app.Application
4 | import android.os.StrictMode
5 | import dagger.hilt.android.HiltAndroidApp
6 |
7 | @HiltAndroidApp
8 | class SeugiApplication : Application() {
9 |
10 | override fun onCreate() {
11 | super.onCreate()
12 | // emulate URI exposure fix
13 | val builder = StrictMode.VmPolicy.Builder()
14 | StrictMode.setVmPolicy(builder.build())
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/network/meal/src/main/java/com/seugi/network/meal/MealDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.meal
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.meal.response.MealResponse
5 | import kotlinx.datetime.LocalDate
6 |
7 | interface MealDataSource {
8 |
9 | suspend fun getDateMeal(workspaceId: String, date: LocalDate): BaseResponse>
10 |
11 | suspend fun getMonthMeal(workspaceId: String): BaseResponse>
12 | }
13 |
--------------------------------------------------------------------------------
/network/timetable/src/main/java/com/seugi/network/timetable/TimetableDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.timetable
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.timetable.response.TimetableResponse
5 |
6 | interface TimetableDataSource {
7 |
8 | suspend fun getTimetableDay(workspaceId: String): BaseResponse>
9 |
10 | suspend fun getTimetableWeekend(workspaceId: String): BaseResponse>
11 | }
12 |
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/response/WorkspaceResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.response
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class WorkspaceResponse(
7 | val workspaceId: String,
8 | val workspaceName: String,
9 | val workspaceImageUrl: String,
10 | val workspaceAdmin: Long,
11 | val middleAdmin: List,
12 | val teacher: List,
13 | val student: List,
14 |
15 | )
16 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/mapper/MessageLoadMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.mapper
2 |
3 | import com.seugi.data.message.model.MessageLoadModel
4 | import com.seugi.network.message.response.message.MessageLoadResponse
5 | import kotlinx.collections.immutable.toImmutableList
6 |
7 | fun MessageLoadResponse.toModel(userId: Long) = MessageLoadModel(
8 | firstMessageId = firstMessageId,
9 | messages = messages.map { it.toModel(userId) }.toImmutableList(),
10 | )
11 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/entity/TokenEntity.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.entity
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 | import com.seugi.local.room.util.SeugiTable
6 |
7 | @Entity(tableName = SeugiTable.TOKEN_TABLE)
8 | data class TokenEntity(
9 | @PrimaryKey val idx: Int,
10 | val token: String,
11 | val refreshToken: String,
12 | ) {
13 | constructor(token: String, refreshToken: String) : this(0, token, refreshToken)
14 | }
15 |
--------------------------------------------------------------------------------
/data/catseugi/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.catseugi"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.catseugi)
17 | implementation(projects.data.core)
18 | implementation(projects.common)
19 | }
--------------------------------------------------------------------------------
/data/firebase-token/src/main/java/com/seugi/data/firebasetoken/FirebaseTokenRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.firebasetoken
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.firebasetoken.model.FirebaseTokenModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface FirebaseTokenRepository {
8 | suspend fun insertToken(firebaseToken: String)
9 |
10 | suspend fun getToken(): Flow>
11 |
12 | suspend fun deleteToken(): Flow>
13 | }
14 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/model/stomp/MessageStompLifecycleModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.model.stomp
2 |
3 | sealed interface MessageStompLifecycleModel {
4 | data object Open : MessageStompLifecycleModel
5 | data object Closed : MessageStompLifecycleModel
6 | data object FailedServerHeartbeat : MessageStompLifecycleModel
7 | data object Connected : MessageStompLifecycleModel
8 | data class Error(val exception: Exception) : MessageStompLifecycleModel
9 | }
10 |
--------------------------------------------------------------------------------
/feature-main/workspace-detail/src/main/java/com/seugi/workspacedetail/feature/workspacemember/model/WorkspaceMemberUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspacedetail.feature.workspacemember.model
2 |
3 | import com.seugi.data.core.model.ProfileModel
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 |
7 | data class WorkspaceMemberUiState(
8 | val isLoading: Boolean = false,
9 | val member: ImmutableList = persistentListOf(),
10 | )
11 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/WorkspacePermissionModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | enum class WorkspacePermissionModel {
4 | ADMIN,
5 | MIDDLE_ADMIN,
6 | TEACHER,
7 | STUDENT,
8 | }
9 |
10 | fun WorkspacePermissionModel.isAdmin() = when (this) {
11 | WorkspacePermissionModel.ADMIN -> true
12 | WorkspacePermissionModel.MIDDLE_ADMIN -> true
13 | else -> false
14 | }
15 |
16 | fun WorkspacePermissionModel.isTeacher() = this != WorkspacePermissionModel.STUDENT
17 |
--------------------------------------------------------------------------------
/local/room/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | alias(libs.plugins.seugi.android.hilt)
6 | alias(libs.plugins.ksp)
7 | }
8 |
9 | android {
10 | namespace = "com.seugi.local.room"
11 | }
12 |
13 | dependencies{
14 | implementation(libs.room.runtime)
15 | implementation(libs.room.ktx)
16 | implementation(libs.gson)
17 | ksp(libs.room.compiler)
18 |
19 |
20 | }
--------------------------------------------------------------------------------
/stomp-client/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.stompclient"
8 | }
9 |
10 | dependencies {
11 | implementation("io.reactivex.rxjava2:rxjava:2.2.5")
12 | // Supported transports
13 | api("org.java-websocket:Java-WebSocket:1.3.6")
14 | api(libs.okhttp3)
15 | // api("com.squareup.okhttp3:okhttp:3.12.1")
16 | implementation("com.android.support:support-annotations:28.0.0")
17 | }
--------------------------------------------------------------------------------
/feature-main/notification/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.notification"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.ui)
14 | implementation(projects.data.core)
15 | implementation(projects.data.notification)
16 | implementation(projects.data.workspace)
17 | implementation(libs.compose.emoji.picker)
18 | }
--------------------------------------------------------------------------------
/feature-main/workspace-detail/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.workspacecdetail"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 | implementation(projects.data.member)
12 | implementation(projects.data.profile)
13 | implementation(projects.data.workspace)
14 | implementation(projects.data.perosnalChat)
15 | implementation(projects.common)
16 | implementation(projects.ui)
17 | }
--------------------------------------------------------------------------------
/data/token/src/main/java/com/seugi/data/token/TokenRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.token
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.TokenModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface TokenRepository {
8 | suspend fun insertToken(accessToken: String, refreshToken: String)
9 |
10 | suspend fun getToken(): Flow>
11 |
12 | suspend fun newToken(): Flow>
13 |
14 | suspend fun deleteToken(): Flow>
15 | }
16 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/mapper/CheckWorkspaceMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.mapper
2 |
3 | import com.seugi.data.workspace.model.CheckWorkspaceModel
4 | import com.seugi.network.workspace.response.CheckWorkspaceResponse
5 |
6 | fun CheckWorkspaceResponse.toModel() = CheckWorkspaceModel(
7 | workspaceId = workspaceId,
8 | workspaceName = workspaceName,
9 | workspaceImageUrl = workspaceImageUrl,
10 | studentCount = studentCount,
11 | teacherCount = teacherCount,
12 | )
13 |
--------------------------------------------------------------------------------
/feature-main/chat-seugi/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.chatseugi"
7 | }
8 |
9 | dependencies {
10 |
11 | implementation(projects.designsystem)
12 | implementation(projects.common)
13 | implementation(projects.data.message)
14 | implementation(projects.data.profile)
15 | implementation(projects.data.core)
16 | implementation(projects.data.catseugi)
17 | implementation(libs.kotlinx.collections.immutable)
18 | }
--------------------------------------------------------------------------------
/network/message/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | }
5 |
6 | android {
7 | namespace = "com.seugi.network.chatdetail"
8 | }
9 |
10 | dependencies {
11 | implementation(projects.common)
12 | implementation(projects.network.core)
13 | implementation(projects.stompClient)
14 | implementation(projects.data.token)
15 | implementation(libs.kotlinx.coroutines.android)
16 | implementation(libs.kotlinx.coroutines.rx)
17 | }
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/room/MessageRoomResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.room
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class MessageRoomResponse(
6 | val id: String,
7 | val workspaceId: String,
8 | val type: String,
9 | val chatName: String,
10 | val roomAdmin: Int,
11 | val chatRoomImg: String?,
12 | val createdAt: LocalDateTime,
13 | val chatStatusEnum: String,
14 | val joinUserId: List,
15 | )
16 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/request/MessageRequest.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.request
2 |
3 | data class MessageRequest(
4 | val roomId: String,
5 | val type: String,
6 | val message: String,
7 | val mention: List,
8 | val mentionAll: Boolean,
9 | val emotion: String?,
10 | val uuid: String,
11 | ) {
12 | constructor(roomId: String, message: String, uuid: String, type: String, mention: List) : this(roomId, type, message, mention, false, null, uuid)
13 | }
14 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/response/NotificationResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.response
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class NotificationResponse(
6 | val id: Long,
7 | val workspaceId: String,
8 | val userId: Long,
9 | val userName: String,
10 | val title: String,
11 | val content: String,
12 | val emoji: List,
13 | val creationDate: LocalDateTime,
14 | val lastModifiedDate: LocalDateTime,
15 | )
16 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/mapper/TokenMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.mapper
2 |
3 | import com.seugi.data.core.model.TokenModel
4 | import com.seugi.local.room.entity.TokenEntity
5 | import com.seugi.network.core.response.TokenResponse
6 |
7 | fun TokenResponse.toModel(): TokenModel = TokenModel(
8 | accessToken = this.accessToken,
9 | refreshToken = this.refreshToken,
10 | )
11 |
12 | fun TokenEntity?.toModel() = TokenModel(
13 | accessToken = this?.token,
14 | refreshToken = this?.refreshToken,
15 | )
16 |
--------------------------------------------------------------------------------
/data/profile/src/main/java/com/seugi/data/profile/ProfileRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.profile
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.ProfileModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface ProfileRepository {
8 | suspend fun getProfile(workspaceId: String): Flow>
9 |
10 | suspend fun patchProfile(workspaceId: String, nick: String, status: String, spot: String, belong: String, phone: String, wire: String, location: String): Flow>
11 | }
12 |
--------------------------------------------------------------------------------
/network/schedule/src/main/java/com/seugi/network/schedule/ScheduleDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.schedule
2 |
3 | import androidx.annotation.IntRange
4 | import com.seugi.network.core.response.BaseResponse
5 | import com.seugi.network.schedule.response.ScheduleResponse
6 |
7 | interface ScheduleDataSource {
8 | suspend fun getMonthSchedule(workspaceId: String, @IntRange(1, 12) month: Int): BaseResponse>
9 |
10 | suspend fun getYearSchedule(workspaceId: String): BaseResponse>
11 | }
12 |
--------------------------------------------------------------------------------
/stomp-client/src/main/java/com/seugi/stompclient/pathmatcher/SimplePathMatcher.java:
--------------------------------------------------------------------------------
1 | package com.seugi.stompclient.pathmatcher;
2 |
3 | import com.seugi.stompclient.dto.StompHeader;
4 | import com.seugi.stompclient.dto.StompMessage;
5 |
6 | public class SimplePathMatcher implements PathMatcher {
7 |
8 | @Override
9 | public boolean matches(String path, StompMessage msg) {
10 | String dest = msg.findHeader(StompHeader.DESTINATION);
11 | if (dest == null) return false;
12 | else return path.equals(dest);
13 | }
14 | }
--------------------------------------------------------------------------------
/data/oauth/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.oauth"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.oauth)
17 | implementation(projects.data.core)
18 | implementation(projects.network.core)
19 | implementation(projects.common)
20 | }
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/entity/MealEntity.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.entity
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 | import com.seugi.local.room.util.SeugiTable
6 |
7 | @Entity(tableName = SeugiTable.MEAL_TABLE)
8 | data class MealEntity(
9 | @PrimaryKey(autoGenerate = false)
10 | val id: Long,
11 | val workspaceId: String,
12 | val mealType: String,
13 | val menu: String,
14 | val calorie: String,
15 | val mealInfo: String,
16 | val mealDate: String,
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/ProfileResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | data class ProfileResponse(
4 | val status: String,
5 | val workspaceId: String,
6 | val member: UserResponse,
7 | val nick: String,
8 | val spot: String,
9 | val belong: String,
10 | val phone: String,
11 | val wire: String,
12 | val location: String,
13 | val permission: WorkspacePermissionResponse,
14 | val schGrade: Int,
15 | val schClass: Int,
16 | val schNumber: Int,
17 | )
18 |
--------------------------------------------------------------------------------
/data/group-chat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.groupchat"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.core)
17 | implementation(projects.network.groupChat)
18 | implementation(projects.data.core)
19 | implementation(projects.common)
20 | }
--------------------------------------------------------------------------------
/data/timetable/src/main/java/com/seugi/data/timetable/TimetableRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.timetable
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.TimetableModel
5 | import kotlinx.collections.immutable.ImmutableList
6 | import kotlinx.coroutines.flow.Flow
7 |
8 | interface TimetableRepository {
9 |
10 | suspend fun getTimetableDay(workspaceId: String): Flow>>
11 |
12 | suspend fun getTimetableWeekend(workspaceId: String): Flow>>
13 | }
14 |
--------------------------------------------------------------------------------
/feature-main/assignment/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.task"
9 | }
10 | dependencies {
11 | implementation(libs.kotlinx.collections.immutable)
12 | implementation(libs.kotlinx.datetime)
13 |
14 | implementation(projects.designsystem)
15 | implementation(projects.common)
16 | implementation(projects.ui)
17 | implementation(projects.data.assignment)
18 | }
--------------------------------------------------------------------------------
/data/notification/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.notification"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.core)
17 | implementation(projects.network.notification)
18 | implementation(projects.data.core)
19 | implementation(projects.common)
20 | }
--------------------------------------------------------------------------------
/data/perosnal-chat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.personalchat"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.core)
17 | implementation(projects.network.personalChat)
18 | implementation(projects.data.core)
19 | implementation(projects.common)
20 | }
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/feature-onboarding/login/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.login"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 | implementation(projects.featureOnboarding.join)
12 | implementation(projects.data.member)
13 | implementation(projects.network.signIn)
14 | implementation(projects.common)
15 | implementation(projects.data.token)
16 | implementation(projects.data.core)
17 | implementation(projects.data.firebaseToken)
18 | }
--------------------------------------------------------------------------------
/app/src/main/res/xml/meal_widget_info.xml:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/data/workspace/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.workspace"
9 | }
10 |
11 | dependencies {
12 |
13 | implementation(projects.common)
14 | implementation(projects.network.workspace)
15 | implementation(projects.network.core)
16 | implementation(projects.data.core)
17 | implementation(projects.local.room)
18 | implementation(libs.kotlinx.coroutines.android)
19 | }
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_home_fill.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/feature-main/assignment-create/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.task.create"
9 | }
10 | dependencies {
11 | implementation(libs.kotlinx.collections.immutable)
12 | implementation(libs.kotlinx.datetime)
13 |
14 | implementation(projects.designsystem)
15 | implementation(projects.common)
16 | implementation(projects.ui)
17 | implementation(projects.data.assignment)
18 | }
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/stomp/MessageStompLifecycleResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.stomp
2 |
3 | import java.lang.Exception
4 |
5 | sealed interface MessageStompLifecycleResponse {
6 | data object Open : MessageStompLifecycleResponse
7 | data object Closed : MessageStompLifecycleResponse
8 | data object FailedServerHeartbeat : MessageStompLifecycleResponse
9 | data object Connected : MessageStompLifecycleResponse
10 | data class Error(val exception: Exception) : MessageStompLifecycleResponse
11 | }
12 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/dao/TokenDao.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.dao
2 |
3 | import androidx.room.Dao
4 | import androidx.room.Query
5 | import com.seugi.local.room.base.BaseDao
6 | import com.seugi.local.room.entity.TokenEntity
7 | import com.seugi.local.room.util.SeugiTable
8 |
9 | @Dao
10 | interface TokenDao : BaseDao {
11 | @Query("SELECT * FROM ${SeugiTable.TOKEN_TABLE} WHERE idx = 0")
12 | suspend fun getToken(): TokenEntity?
13 |
14 | @Query("DELETE FROM ${SeugiTable.TOKEN_TABLE}")
15 | suspend fun deleteToken()
16 | }
17 |
--------------------------------------------------------------------------------
/network/profile/src/main/java/com/seugi/network/profile/ProfileDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.profile
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.core.response.ProfileResponse
5 | import com.seugi.network.core.response.Response
6 |
7 | interface ProfileDataSource {
8 | suspend fun loadUserInfo(workspaceId: String): BaseResponse
9 |
10 | suspend fun patchProfile(workspaceId: String, nick: String, status: String, spot: String, belong: String, phone: String, wire: String, location: String): Response
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/timetable_widget_info.xml:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/data/email-sign-in/src/main/java/com/seugi/data/member/MemberRepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member
2 |
3 | import com.seugi.data.member.repository.MemberRepositoryImpl
4 | import dagger.Binds
5 | import dagger.Module
6 | import dagger.hilt.InstallIn
7 | import dagger.hilt.components.SingletonComponent
8 | import javax.inject.Singleton
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | interface MemberRepositoryModule {
13 |
14 | @Binds
15 | @Singleton
16 | fun provideMemberRepository(memberRepositoryImpl: MemberRepositoryImpl): MemberRepository
17 | }
18 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/img_check.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/network/file/src/main/java/com/seugi/file/di/FileSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.file.di
2 |
3 | import com.seugi.file.FileDataSource
4 | import com.seugi.file.datasource.FileDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface FileSourceModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun providesFileDataSource(fileDataSourceImpl: FileDataSourceImpl): FileDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/data/meal/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | alias(libs.plugins.seugi.android.kotlin)
6 |
7 | }
8 |
9 | android {
10 | namespace = "com.seugi.data.meal"
11 | defaultConfig {
12 | consumerProguardFiles("consumer-rules.pro")
13 | }
14 | }
15 |
16 |
17 | dependencies {
18 | implementation(projects.network.meal)
19 | api(projects.data.core)
20 | implementation(projects.local.room)
21 | implementation(projects.common)
22 | }
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/java/com/seugi/timetable/widget/di/TimetableWidgetEntryPoint.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.timetable.widget.di
2 |
3 | import com.seugi.data.timetable.TimetableRepository
4 | import com.seugi.data.workspace.WorkspaceRepository
5 | import dagger.hilt.EntryPoint
6 | import dagger.hilt.InstallIn
7 | import dagger.hilt.components.SingletonComponent
8 |
9 | @EntryPoint
10 | @InstallIn(SingletonComponent::class)
11 | interface TimetableWidgetEntryPoint {
12 | fun timetableRepository(): TimetableRepository
13 | fun workspaceRepository(): WorkspaceRepository
14 | }
15 |
--------------------------------------------------------------------------------
/feature-main/workspace/src/main/java/com/seugi/workspace/feature/schoolcode/model/SchoolCodeModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspace.feature.schoolcode.model
2 |
3 | data class SchoolCodeModel(
4 | val workspaceId: String = "",
5 | val workspaceName: String = "",
6 | val workspaceImageUrl: String = "",
7 | val studentCount: Int = 0,
8 | val teacherCount: Int = 0,
9 | )
10 |
11 | sealed class SchoolCodeSideEffect {
12 | data object SuccessSearchWorkspace : SchoolCodeSideEffect()
13 | data class FiledSearchWorkspace(val throwable: Throwable) : SchoolCodeSideEffect()
14 | }
15 |
--------------------------------------------------------------------------------
/data/file/src/main/java/com/seugi/data/file/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.file.di
2 |
3 | import com.seugi.data.file.FileRepository
4 | import com.seugi.data.file.repository.FileRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 | @Singleton
15 | @Binds
16 | fun provideFileRepository(fileRepositoryImpl: FileRepositoryImpl): FileRepository
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/seugi/starter/SeugiActivityStarterImpl.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.starter
2 |
3 | import android.content.Context
4 | import android.content.Intent
5 | import com.seugi.MainActivity
6 | import com.seugi.common.utiles.SeugiActivityStarter
7 |
8 | class SeugiActivityStarterImpl(
9 | private val context: Context,
10 | ) : SeugiActivityStarter {
11 | override fun reStartActivity() {
12 | val intent = Intent(context, MainActivity::class.java).apply {
13 | flags = Intent.FLAG_ACTIVITY_NEW_TASK
14 | }
15 | context.startActivity(intent)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/data/meal/src/main/java/com/seugi/data/meal/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.meal.di
2 |
3 | import com.seugi.data.meal.MealRepository
4 | import com.seugi.data.meal.repository.MealRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsMealRepository(mealRepositoryImpl: MealRepositoryImpl): MealRepository
18 | }
19 |
--------------------------------------------------------------------------------
/feature-main/home/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.home"
7 | }
8 |
9 | dependencies {
10 | implementation(libs.coil.compose)
11 | implementation(libs.kotlinx.datetime)
12 |
13 | implementation(projects.designsystem)
14 | implementation(projects.data.workspace)
15 | implementation(projects.data.meal)
16 | implementation(projects.data.timetable)
17 | implementation(projects.data.schedule)
18 | implementation(projects.data.assignment)
19 | implementation(projects.common)
20 | }
--------------------------------------------------------------------------------
/stomp-client/src/main/java/com/seugi/stompclient/dto/StompCommand.java:
--------------------------------------------------------------------------------
1 | package com.seugi.stompclient.dto;
2 |
3 | public class StompCommand {
4 |
5 | public static final String CONNECT = "CONNECT";
6 | public static final String CONNECTED = "CONNECTED";
7 | public static final String SEND = "SEND";
8 | public static final String MESSAGE = "MESSAGE";
9 | public static final String SUBSCRIBE = "SUBSCRIBE";
10 | public static final String UNSUBSCRIBE = "UNSUBSCRIBE";
11 | public static final String ERROR = "ERROR";
12 |
13 | public static final String UNKNOWN = "UNKNOWN";
14 | }
--------------------------------------------------------------------------------
/data/email-sign-in/src/main/java/com/seugi/data/member/MemberRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.member.model.EmailSignInModel
5 | import com.seugi.network.request.EmailSignInRequest
6 | import kotlinx.coroutines.flow.Flow
7 |
8 | interface MemberRepository {
9 | suspend fun emailSignIn(body: EmailSignInRequest): Flow>
10 | suspend fun getCode(email: String): Flow>
11 |
12 | suspend fun emailSignUp(name: String, email: String, password: String, code: String): Flow>
13 | }
14 |
--------------------------------------------------------------------------------
/data/token/src/main/java/com/seugi/data/token/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.token.di
2 |
3 | import com.seugi.data.token.TokenRepository
4 | import com.seugi.data.token.repository.TokenRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 | @Singleton
15 | @Binds
16 | fun provideTokenRepository(tokenRepositoryImpl: TokenRepositoryImpl): TokenRepository
17 | }
18 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/mapper/WaitWorkspaceMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.mapper
2 |
3 | import com.seugi.data.workspace.model.WaitWorkspaceModel
4 | import com.seugi.network.workspace.response.WaitWorkspaceResponse
5 |
6 | fun List.toModels() = map {
7 | it.toModel()
8 | }
9 |
10 | fun WaitWorkspaceResponse.toModel() = WaitWorkspaceModel(
11 | workspaceId = workspaceId,
12 | workspaceName = workspaceName,
13 | workspaceImageUrl = workspaceImageUrl,
14 | studentCount = studentCount,
15 | teacherCount = teacherCount,
16 | )
17 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/entity/WorkspaceEntity.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.entity
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 | import com.seugi.local.room.util.SeugiTable
6 |
7 | @Entity(tableName = SeugiTable.WORKSPACE_TABLE)
8 | data class WorkspaceEntity(
9 | @PrimaryKey
10 | var idx: Long = 0,
11 | val workspaceId: String,
12 | val workspaceName: String,
13 | val workspaceImageUrl: String,
14 | val workspaceAdmin: Long,
15 | val middleAdmin: List,
16 | val teacher: List,
17 | val student: List,
18 | )
19 |
--------------------------------------------------------------------------------
/network/personal-chat/src/main/java/com/seugi/network/personalchat/PersonalChatDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.core.response.ChatRoomResponse
5 |
6 | interface PersonalChatDataSource {
7 |
8 | suspend fun getAllChat(workspaceId: String): BaseResponse>
9 |
10 | suspend fun createChat(workspaceId: String, roomName: String, joinUsers: List, chatRoomImg: String): BaseResponse
11 |
12 | suspend fun getChat(roomId: String): BaseResponse
13 | }
14 |
--------------------------------------------------------------------------------
/data/perosnal-chat/src/main/java/com/seugi/data/personalchat/PersonalChatRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.personalchat
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.ChatRoomModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface PersonalChatRepository {
8 |
9 | suspend fun getAllChat(workspaceId: String): Flow>>
10 |
11 | suspend fun createChat(workspaceId: String, roomName: String, joinUsers: List, chatRoomImg: String): Flow>
12 |
13 | suspend fun getChat(roomId: String): Flow>
14 | }
15 |
--------------------------------------------------------------------------------
/network/core/src/main/java/com/seugi/network/core/response/ChatRoomResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.core.response
2 |
3 | import java.time.LocalDateTime
4 |
5 | data class ChatRoomResponse(
6 | val id: String,
7 | val workspaceId: String,
8 | val type: String,
9 | val roomAdmin: Long,
10 | val chatName: String?,
11 | val chatRoomImg: String?,
12 | val createdAt: LocalDateTime,
13 | val chatStatusEnum: String,
14 | val joinUserInfo: List,
15 | val lastMessage: String?,
16 | val lastMessageTimestamp: LocalDateTime?,
17 | val notReadCnt: Int,
18 | )
19 |
--------------------------------------------------------------------------------
/network/meal/src/main/java/com/seugi/network/meal/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.meal.di
2 |
3 | import com.seugi.network.meal.MealDataSource
4 | import com.seugi.network.meal.datasource.MealDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsMealDataSource(mealDataSourceImpl: MealDataSourceImpl): MealDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/data/oauth/src/main/java/com/seugi/data/oauth/di/OauthRepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.oauth.di
2 |
3 | import com.seugi.data.oauth.OauthRepository
4 | import com.seugi.data.oauth.repository.OauthRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface OauthRepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun bindsOauthRepository(oauthRepositoryImpl: OauthRepositoryImpl): OauthRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/schedule/src/main/java/com/seugi/data/schedule/ScheduleRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.schedule
2 |
3 | import androidx.annotation.IntRange
4 | import com.seugi.common.model.Result
5 | import com.seugi.data.schedule.model.ScheduleModel
6 | import kotlinx.collections.immutable.ImmutableList
7 | import kotlinx.coroutines.flow.Flow
8 |
9 | interface ScheduleRepository {
10 |
11 | suspend fun getMonthSchedule(workspaceId: String, @IntRange(1, 12) month: Int): Flow>>
12 |
13 | suspend fun yearSchedule(workspaceId: String): Flow>>
14 | }
15 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/model/WorkspaceModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.model
2 |
3 | import kotlinx.collections.immutable.ImmutableList
4 | import kotlinx.collections.immutable.persistentListOf
5 |
6 | data class WorkspaceModel(
7 | val workspaceId: String = "",
8 | val workspaceName: String = "",
9 | val workspaceImageUrl: String = "",
10 | val workspaceAdmin: Long = 0,
11 | val middleAdmin: ImmutableList = persistentListOf(),
12 | val teacher: ImmutableList = persistentListOf(),
13 | val student: ImmutableList = persistentListOf(),
14 | )
15 |
--------------------------------------------------------------------------------
/designsystem/src/main/java/com/seugi/designsystem/animation/NoInteractionSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.designsystem.animation
2 |
3 | import androidx.compose.foundation.interaction.Interaction
4 | import androidx.compose.foundation.interaction.MutableInteractionSource
5 | import kotlinx.coroutines.flow.Flow
6 | import kotlinx.coroutines.flow.emptyFlow
7 |
8 | class NoInteractionSource : MutableInteractionSource {
9 | override val interactions: Flow = emptyFlow()
10 |
11 | override suspend fun emit(interaction: Interaction) {}
12 |
13 | override fun tryEmit(interaction: Interaction): Boolean = false
14 | }
15 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/test_icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.timetable.widget"
9 | }
10 | dependencies {
11 | implementation(libs.kotlinx.collections.immutable)
12 | implementation(libs.kotlinx.datetime)
13 |
14 | implementation(projects.designsystem)
15 | implementation(projects.common)
16 | implementation(projects.ui)
17 | implementation(projects.data.timetable)
18 | implementation(projects.data.workspace)
19 | }
--------------------------------------------------------------------------------
/network/sign-in/src/main/java/com/seugi/network/di/MemberDatasourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.di
2 |
3 | import com.seugi.network.MemberDatasource
4 | import com.seugi.network.datasource.MemberDatasourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | interface MemberDatasourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun provideMemberDataSource(memberDatasourceImpl: MemberDatasourceImpl): MemberDatasource
18 | }
19 |
--------------------------------------------------------------------------------
/network/token/src/main/java/com/seugi/network/token/di/DatasourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.token.di
2 |
3 | import com.seugi.network.token.TokenDatasource
4 | import com.seugi.network.token.datasource.TokenDatasourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DatasourceModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun bindsTokenDatasource(tokenDatasourceImpl: TokenDatasourceImpl): TokenDatasource
18 | }
19 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_expand_down_line.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_expand_right_line.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/network/file/src/main/java/com/seugi/file/FileDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.file
2 |
3 | import com.seugi.file.response.FileResponse
4 | import com.seugi.network.core.response.BaseResponse
5 | import java.io.InputStream
6 |
7 | interface FileDataSource {
8 | suspend fun fileUpload(type: String, file: String): BaseResponse
9 |
10 | suspend fun fileUpload(type: String, fileName: String, fileMimeType: String, byteArray: ByteArray): BaseResponse
11 |
12 | suspend fun fileUpload(type: String, fileName: String, fileMimeType: String, fileInputStream: InputStream): BaseResponse
13 | }
14 |
--------------------------------------------------------------------------------
/spotless/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_size = 4
6 | max_line_length = 200
7 |
8 | [*.{kt,kts}]
9 | max_line_length = 200
10 | ktlint_code_style = android_studio
11 | ktlint_standard_function-naming = disabled
12 | ktlint_standard_annotation = disabled
13 | ij_kotlin_allow_trailing_comma_on_call_site=true
14 | ij_kotlin_allow_trailing_comma=true
15 | ktlint_no-wildcard-imports = disabled
16 |
17 |
18 | [**/test/**.kt]
19 | max_line_length = off
20 | ktlint_ignore_back_ticked_identifier = true
21 |
22 | [**/androidTest/**.kt]
23 | max_line_length = off
24 | ktlint_ignore_back_ticked_identifier = true
--------------------------------------------------------------------------------
/data/member/src/main/java/com/seugi/data/member/di/MemberRepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member.di
2 |
3 | import com.seugi.data.member.MemberRepository
4 | import com.seugi.data.member.repository.MemberRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface MemberRepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun provideMemberRepository(memberRepositoryImpl: MemberRepositoryImpl): MemberRepository
18 | }
19 |
--------------------------------------------------------------------------------
/feature-main/meal/src/main/java/com/seugi/meal/model/MealUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.meal.model
2 |
3 | import com.seugi.data.core.model.MealModel
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 |
7 | data class MealUiState(
8 | val isLoading: Boolean = true,
9 | val mealData: ImmutableList = persistentListOf(),
10 | val filterMealData: MealFilterUiState = MealFilterUiState(),
11 | )
12 |
13 | data class MealFilterUiState(
14 | val breakfast: MealModel? = null,
15 | val lunch: MealModel? = null,
16 | val dinner: MealModel? = null,
17 | )
18 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/entity/WorkspaceNotificationEntity.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.entity
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 | import com.seugi.local.room.util.SeugiTable
6 |
7 | @Entity(tableName = SeugiTable.WORKSPACE_NOTIFICATION_TABLE)
8 | data class WorkspaceNotificationEntity(
9 | @PrimaryKey(autoGenerate = true)
10 | val idx: Long,
11 | val workspaceId: String,
12 | val isReceiveFCM: Boolean,
13 | ) {
14 | constructor(
15 | workspaceId: String,
16 | isReceiveFCM: Boolean,
17 | ) : this(0, workspaceId, isReceiveFCM)
18 | }
19 |
--------------------------------------------------------------------------------
/network/oauth/src/main/java/com/seugi/network/oauth/di/OauthDatasourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.oauth.di
2 |
3 | import com.seugi.network.oauth.OauthDatasource
4 | import com.seugi.network.oauth.datasource.OauthDatasourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | interface OauthDatasourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsOauthDataSource(oauthDatasourceImpl: OauthDatasourceImpl): OauthDatasource
18 | }
19 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/mapper/WorkspacePermissionMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.mapper
2 |
3 | import com.seugi.data.core.model.WorkspacePermissionModel
4 | import com.seugi.network.core.response.WorkspacePermissionResponse
5 |
6 | fun WorkspacePermissionResponse.toModel() = when (this) {
7 | WorkspacePermissionResponse.ADMIN -> WorkspacePermissionModel.ADMIN
8 | WorkspacePermissionResponse.STUDENT -> WorkspacePermissionModel.STUDENT
9 | WorkspacePermissionResponse.TEACHER -> WorkspacePermissionModel.TEACHER
10 | WorkspacePermissionResponse.MIDDLE_ADMIN -> WorkspacePermissionModel.MIDDLE_ADMIN
11 | }
12 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_expand_left_line.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/res/layout/item_meal_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
14 |
15 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/dao/FirebaseTokenDao.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.dao
2 |
3 | import androidx.room.Dao
4 | import androidx.room.Query
5 | import com.seugi.local.room.base.BaseDao
6 | import com.seugi.local.room.entity.FirebaseTokenEntity
7 | import com.seugi.local.room.util.SeugiTable
8 |
9 | @Dao
10 | interface FirebaseTokenDao : BaseDao {
11 |
12 | @Query("SELECT * FROM ${SeugiTable.FIREBASE_TOKEN_TABLE} WHERE idx = 0")
13 | suspend fun getToken(): FirebaseTokenEntity?
14 |
15 | @Query("DELETE FROM ${SeugiTable.FIREBASE_TOKEN_TABLE}")
16 | suspend fun deleteToken()
17 | }
18 |
--------------------------------------------------------------------------------
/data/catseugi/src/main/java/com/seugi/data/catseugi/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.catseugi.di
2 |
3 | import com.seugi.data.catseugi.CatSeugiRepository
4 | import com.seugi.data.catseugi.repository.CatSeugiRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsCatSeugiRepository(catSeugiRepositoryImpl: CatSeugiRepositoryImpl): CatSeugiRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.di
2 |
3 | import com.seugi.data.message.MessageRepository
4 | import com.seugi.data.message.repository.MessageRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | internal interface RepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun provideMessageRepository(chatDetailRepositoryImpl: MessageRepositoryImpl): MessageRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/schedule/src/main/java/com/seugi/data/schedule/mapper/ScheduleMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.schedule.mapper
2 |
3 | import com.seugi.data.schedule.model.ScheduleModel
4 | import com.seugi.network.schedule.response.ScheduleResponse
5 | import kotlinx.collections.immutable.toImmutableList
6 |
7 | internal fun ScheduleResponse.toModel() = ScheduleModel(
8 | id = id,
9 | workspaceId = workspaceId,
10 | date = date,
11 | eventName = eventName,
12 | eventContent = eventContent,
13 | grade = grade.toImmutableList(),
14 | )
15 |
16 | internal fun List.toModels() = this.map {
17 | it.toModel()
18 | }
19 |
--------------------------------------------------------------------------------
/feature-main/timetable-widget/src/main/res/layout/item_meal_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
14 |
15 |
--------------------------------------------------------------------------------
/data/profile/src/main/java/com/seugi/data/profile/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.profile.di
2 |
3 | import com.seugi.data.profile.ProfileRepository
4 | import com.seugi.data.profile.repository.ProfileRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | abstract class RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | abstract fun providesProfileRepository(profileRepositoryImpl: ProfileRepositoryImpl): ProfileRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/timetable/src/main/java/com/seugi/data/timetable/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.timetable.di
2 |
3 | import com.seugi.data.timetable.TimetableRepository
4 | import com.seugi.data.timetable.repository.TimetableRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsTimetableRepository(timetableRepositoryImpl: TimetableRepositoryImpl): TimetableRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/workspace/src/main/java/com/seugi/data/workspace/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.workspace.di
2 |
3 | import com.seugi.data.workspace.WorkspaceRepository
4 | import com.seugi.data.workspace.repository.WorkspaceRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun provideWorkspaceRepository(workspaceRepositoryImpl: WorkspaceRepositoryImpl): WorkspaceRepository
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/data/assignment/src/main/java/com/seugi/data/assignment/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.assignment.di
2 |
3 | import com.seugi.data.assignment.AssignmentRepository
4 | import com.seugi.data.assignment.repository.AssignmentRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun bindsAssignmentRepository(taskRepositoryImpl: AssignmentRepositoryImpl): AssignmentRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/group-chat/src/main/java/com/seugi/data/groupchat/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.groupchat.di
2 |
3 | import com.seugi.data.groupchat.GroupChatRepository
4 | import com.seugi.data.groupchat.repository.GroupChatRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun providesGroupChatRepository(groupChatRepositoryImpl: GroupChatRepositoryImpl): GroupChatRepository
18 | }
19 |
--------------------------------------------------------------------------------
/data/meal/src/main/java/com/seugi/data/meal/MealRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.meal
2 |
3 | import androidx.annotation.IntRange
4 | import com.seugi.common.model.Result
5 | import com.seugi.data.core.model.MealModel
6 | import kotlinx.collections.immutable.ImmutableList
7 | import kotlinx.coroutines.flow.Flow
8 | import kotlinx.datetime.LocalDate
9 |
10 | interface MealRepository {
11 |
12 | suspend fun getDateMeal(workspaceId: String, date: LocalDate): Flow>>
13 |
14 | suspend fun getMonthMeal(workspaceId: String, @IntRange(1970) year: Int, @IntRange(1, 12) month: Int): Flow>>
15 | }
16 |
--------------------------------------------------------------------------------
/data/schedule/src/main/java/com/seugi/data/schedule/di/ScheduleRepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.schedule.di
2 |
3 | import com.seugi.data.schedule.ScheduleRepository
4 | import com.seugi.data.schedule.repository.ScheduleRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface ScheduleRepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsScheduleRepository(scheduleRepositoryImpl: ScheduleRepositoryImpl): ScheduleRepository
18 | }
19 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_refresh_fill.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/network/catseugi/src/main/java/com/seugi/network/catseugi/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.catseugi.di
2 |
3 | import com.seugi.network.catseugi.CatSeugiDataSource
4 | import com.seugi.network.catseugi.datasource.CatSeugiDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsCatSeugiDataSource(catSeugiDataSourceImpl: CatSeugiDataSourceImpl): CatSeugiDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/network/profile/src/main/java/com/seugi/network/profile/di/NetworkModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.profile.di
2 |
3 | import com.seugi.network.profile.ProfileDataSource
4 | import com.seugi.network.profile.datasource.ProfileDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | abstract class NetworkModule {
14 |
15 | @Binds
16 | @Singleton
17 | abstract fun providesProfileDataSource(profileDataSourceImpl: ProfileDataSourceImpl): ProfileDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/network/schedule/src/main/java/com/seugi/network/schedule/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.schedule.di
2 |
3 | import com.seugi.network.schedule.ScheduleDataSource
4 | import com.seugi.network.schedule.datasource.ScheduleDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsScheduleDataSource(scheduleDataSourceImpl: ScheduleDataSourceImpl): ScheduleDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/base/BaseDao.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.base
2 |
3 | import androidx.room.Dao
4 | import androidx.room.Delete
5 | import androidx.room.Insert
6 | import androidx.room.OnConflictStrategy
7 | import androidx.room.Update
8 |
9 | @Dao
10 | interface BaseDao {
11 |
12 | @Insert(onConflict = OnConflictStrategy.REPLACE)
13 | suspend fun insert(entity: ENTITY)
14 |
15 | @Insert(onConflict = OnConflictStrategy.REPLACE)
16 | suspend fun insert(entity: List)
17 |
18 | @Update
19 | suspend fun update(entity: ENTITY)
20 |
21 | @Delete
22 | suspend fun delete(entity: ENTITY)
23 | }
24 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/di/MessageDataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.di
2 |
3 | import com.seugi.network.message.MessageDataSource
4 | import com.seugi.network.message.datasource.MessageDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | interface MessageDataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun provideMessageDataSource(chatDetailDataSourceImpl: MessageDataSourceImpl): MessageDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/network/workspace/src/main/java/com/seugi/network/workspace/di/NetworkModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.workspace.di
2 |
3 | import com.seugi.network.workspace.WorkspaceDataSource
4 | import com.seugi.network.workspace.datasource.WorkspaceDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface NetworkModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun providesWorkSpaceDataSource(workspaceDataSourceImpl: WorkspaceDataSourceImpl): WorkspaceDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/ChatRoomModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import java.time.LocalDateTime
4 | import kotlinx.collections.immutable.ImmutableList
5 |
6 | data class ChatRoomModel(
7 | val id: String,
8 | val workspaceId: String,
9 | val type: ChatRoomType,
10 | val roomAdmin: Long,
11 | val chatName: String,
12 | val createdAt: LocalDateTime,
13 | val chatRoomImg: String?,
14 | val chatStatusEnum: ChatRoomStatusType,
15 | val memberList: ImmutableList,
16 | val lastMessage: String?,
17 | val lastMessageTimestamp: LocalDateTime?,
18 | val notReadCnt: Int,
19 | )
20 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/java/com/seugi/meal/widget/di/MealWidgetEntryPoint.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.meal.widget.di
2 |
3 | import androidx.glance.appwidget.GlanceAppWidgetManager
4 | import com.seugi.data.meal.MealRepository
5 | import com.seugi.data.workspace.WorkspaceRepository
6 | import dagger.hilt.EntryPoint
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 |
10 | @EntryPoint
11 | @InstallIn(SingletonComponent::class)
12 | interface MealWidgetEntryPoint {
13 | fun mealRepository(): MealRepository
14 | fun workspaceRepository(): WorkspaceRepository
15 | fun glanceAppWidgetManager(): GlanceAppWidgetManager
16 | }
17 |
--------------------------------------------------------------------------------
/network/group-chat/src/main/java/com/seugi/network/groupchat/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.groupchat.di
2 |
3 | import com.seugi.network.groupchat.GroupChatDataSource
4 | import com.seugi.network.groupchat.datasource.GroupChatDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 | @Singleton
15 | @Binds
16 | fun providesGroupChatDataSource(groupChatDataSourceImpl: GroupChatDataSourceImpl): GroupChatDataSource
17 | }
18 |
--------------------------------------------------------------------------------
/network/timetable/src/main/java/com/seugi/network/timetable/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.timetable.di
2 |
3 | import com.seugi.network.timetable.TimetableDataSource
4 | import com.seugi.network.timetable.datasource.TimetableDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsTimetableDataSource(timetableDataSourceImpl: TimetableDataSourceImpl): TimetableDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/network/assignment/src/main/java/com/seugi/network/assignment/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.assignment.di
2 |
3 | import com.seugi.network.assignment.AssignmentDataSource
4 | import com.seugi.network.assignment.datasource.AssignmentDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Binds
16 | @Singleton
17 | fun bindsAssignmentDataSource(taskDataSourceImpl: AssignmentDataSourceImpl): AssignmentDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/common/src/main/java/com/seugi/common/model/Result.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.common.model
2 |
3 | import kotlinx.coroutines.flow.Flow
4 | import kotlinx.coroutines.flow.catch
5 | import kotlinx.coroutines.flow.map
6 | import kotlinx.coroutines.flow.onStart
7 |
8 | sealed interface Result {
9 | data class Success(val data: T) : Result
10 | data class Error(val throwable: Throwable) : Result
11 | data object Loading : Result
12 | }
13 |
14 | fun Flow.asResult(): Flow> = map> { Result.Success(it) }
15 | .onStart { emit(Result.Loading) }
16 | .catch { error ->
17 | emit(Result.Error(error))
18 | }
19 |
--------------------------------------------------------------------------------
/data/notification/src/main/java/com/seugi/data/notification/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.notification.di
2 |
3 | import com.seugi.data.notification.NotificationRepository
4 | import com.seugi.data.notification.repository.NotificationRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun bindsNotificationRepository(noticeRepositoryImpl: NotificationRepositoryImpl): NotificationRepository
18 | }
19 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/feature-main/chat/src/main/java/com/seugi/chat/model/ChatUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.chat.model
2 |
3 | import com.seugi.data.core.model.ChatRoomModel
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 | import kotlinx.collections.immutable.toImmutableList
7 |
8 | data class ChatUiState(
9 | val isRefresh: Boolean = false,
10 | val filterMessage: String = "",
11 | private val _chatItems: ImmutableList = persistentListOf(),
12 | ) {
13 | val chatItems = _chatItems
14 | .filter {
15 | it.chatName.contains(filterMessage)
16 | }
17 | .toImmutableList()
18 | }
19 |
--------------------------------------------------------------------------------
/feature-main/room/src/main/java/com/seugi/room/model/RoomUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.room.model
2 |
3 | import com.seugi.data.core.model.ChatRoomModel
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 | import kotlinx.collections.immutable.toImmutableList
7 |
8 | data class RoomUiState(
9 | val isRefresh: Boolean = false,
10 | val filterMessage: String = "",
11 | private val _chatItems: ImmutableList = persistentListOf(),
12 | ) {
13 | val chatItems = _chatItems
14 | .filter {
15 | it.chatName.contains(filterMessage)
16 | }
17 | .toImmutableList()
18 | }
19 |
--------------------------------------------------------------------------------
/network/sign-in/src/main/java/com/seugi/network/MemberDatasource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.core.response.Response
5 | import com.seugi.network.core.response.TokenResponse
6 | import com.seugi.network.request.EmailSignInRequest
7 |
8 | interface MemberDatasource {
9 | suspend fun emailSignIn(body: EmailSignInRequest): BaseResponse
10 | suspend fun getCode(email: String): Response
11 | suspend fun emailSignUp(name: String, email: String, password: String, code: String): Response
12 | suspend fun editProfile(name: String, picture: String, birth: String): Response
13 | }
14 |
--------------------------------------------------------------------------------
/data/perosnal-chat/src/main/java/com/seugi/data/personalchat/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.personalchat.di
2 |
3 | import com.seugi.data.personalchat.PersonalChatRepository
4 | import com.seugi.data.personalchat.repository.PersonalChatRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun providesPersonalChatRepository(personalChatRepositoryImpl: PersonalChatRepositoryImpl): PersonalChatRepository
18 | }
19 |
--------------------------------------------------------------------------------
/network/notification/src/main/java/com/seugi/network/notification/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.notification.di
2 |
3 | import com.seugi.network.notification.NotificationDataSource
4 | import com.seugi.network.notification.datasource.NotificationDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface DataSourceModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun bindsNoticeDataSource(noticeDataSourceImpl: NotificationDataSourceImpl): NotificationDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/data/firebase-token/src/main/java/com/seugi/data/firebasetoken/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.firebasetoken.di
2 |
3 | import com.seugi.data.firebasetoken.FirebaseTokenRepository
4 | import com.seugi.data.firebasetoken.repository.FirebaseTokenRepositoryImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface RepositoryModule {
14 | @Singleton
15 | @Binds
16 | fun bindsFirebaseTokenRepository(firebaseTokenRepositoryImpl: FirebaseTokenRepositoryImpl): FirebaseTokenRepository
17 | }
18 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_back.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/feature-onboarding/start/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | }
4 |
5 | android {
6 | namespace = "com.seugi.start"
7 | }
8 |
9 | dependencies {
10 | implementation(projects.designsystem)
11 |
12 |
13 | implementation(projects.featureOnboarding.login)
14 | implementation(projects.featureOnboarding.join)
15 | implementation(projects.data.oauth)
16 | implementation(projects.common)
17 | implementation(projects.data.token)
18 | implementation(projects.data.core)
19 | implementation(projects.data.firebaseToken)
20 |
21 |
22 | implementation(libs.firebase.auth)
23 | implementation(libs.google.play.auth)
24 |
25 | }
--------------------------------------------------------------------------------
/feature-main/setting/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.setting"
9 | }
10 | dependencies {
11 | implementation(libs.kotlinx.collections.immutable)
12 |
13 | implementation(projects.designsystem)
14 | implementation(projects.common)
15 | implementation(projects.ui)
16 | implementation(projects.data.profile)
17 | implementation(projects.data.token)
18 | implementation(projects.data.member)
19 | implementation(projects.data.workspace)
20 | implementation(projects.data.file)
21 |
22 | }
--------------------------------------------------------------------------------
/network/personal-chat/src/main/java/com/seugi/network/personalchat/di/NetworkModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat.di
2 |
3 | import com.seugi.network.personalchat.PersonalChatDataSource
4 | import com.seugi.network.personalchat.datasource.PersonalChatDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | interface NetworkModule {
14 |
15 | @Singleton
16 | @Binds
17 | fun providesPersonalChatDataSource(personalChatDataSourceImpl: PersonalChatDataSourceImpl): PersonalChatDataSource
18 | }
19 |
--------------------------------------------------------------------------------
/network/personal-chat/src/main/java/com/seugi/network/personalchat/response/PersonalChatRoomResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.personalchat.response
2 |
3 | import com.seugi.network.core.response.UserResponse
4 | import java.time.LocalDateTime
5 |
6 | data class PersonalChatRoomResponse(
7 | val id: String,
8 | val workspaceId: String,
9 | val type: String,
10 | val chatName: String,
11 | val roomAdmin: Int,
12 | val chatRoomImg: String,
13 | val createdAt: LocalDateTime,
14 | val chatStatusEnum: String,
15 | val joinUserId: List,
16 | val lastMessage: String,
17 | val lastMessageTimestamp: LocalDateTime,
18 | val notReadCnt: Int,
19 | )
20 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/mapper/MessageTypeMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.mapper
2 |
3 | import com.seugi.data.message.model.MessageType
4 |
5 | internal fun String.toMessageType(): MessageType = when (this) {
6 | "MESSAGE" -> MessageType.MESSAGE
7 | "FILE" -> MessageType.FILE
8 | "IMG" -> MessageType.IMG
9 | "ENTER" -> MessageType.ENTER
10 | "LEFT" -> MessageType.LEFT
11 | "SUB" -> MessageType.SUB
12 | "DELETE_MESSAGE" -> MessageType.DELETE_MESSAGE
13 | "ADD_EMOJI" -> MessageType.ADD_EMOJI
14 | "REMOVE_EMOJI" -> MessageType.REMOVE_EMOJI
15 | "TRANSFER_ADMIN" -> MessageType.TRANSFER_ADMIN
16 | else -> MessageType.MESSAGE
17 | }
18 |
--------------------------------------------------------------------------------
/feature-main/room-create/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.android.kotlin)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.roomcreate"
9 | }
10 | dependencies {
11 | implementation(libs.kotlinx.collections.immutable)
12 |
13 | implementation(projects.designsystem)
14 | implementation(projects.common)
15 | implementation(projects.data.core)
16 | implementation(projects.data.workspace)
17 | implementation(projects.data.perosnalChat)
18 | implementation(projects.data.groupChat)
19 | implementation(projects.network.core)
20 | implementation(projects.ui)
21 | }
--------------------------------------------------------------------------------
/data/file/src/main/java/com/seugi/data/file/FileRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.file
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.file.model.FileModel
5 | import com.seugi.data.file.model.FileType
6 | import java.io.InputStream
7 | import kotlinx.coroutines.flow.Flow
8 |
9 | interface FileRepository {
10 |
11 | suspend fun fileUpload(file: String, type: FileType): Flow>
12 |
13 | suspend fun fileUpload(type: FileType, fileName: String, fileMimeType: String, fileByteArray: ByteArray): Flow>
14 |
15 | suspend fun fileUpload(type: FileType, fileName: String, fileMimeType: String, fileInputStream: InputStream): Flow>
16 | }
17 |
--------------------------------------------------------------------------------
/designsystem-preview/src/main/java/com/apeun/gidaechi/designsystem/preview/feature/Error.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.designsystem.preview.feature
2 |
3 | import androidx.compose.foundation.layout.Column
4 | import androidx.compose.runtime.Composable
5 | import com.seugi.designsystem.component.SeugiError
6 | import com.seugi.designsystem.preview.R
7 |
8 | @Composable
9 | fun Error() {
10 | Column {
11 | SeugiError(
12 | resId = com.seugi.designsystem.R.drawable.ic_emoji_sad,
13 | text = "페이지를 찾을 수 없습니다.",
14 | )
15 | SeugiError(
16 | resId = com.seugi.designsystem.R.drawable.ic_emoji_happy,
17 | text = "페이지를 찾을 수 없습니다.",
18 | )
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/feature-main/chat-seugi/src/main/java/com/seugi/chatseugi/model/ChatSeugiUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.chatseugi.model
2 |
3 | import java.time.LocalDateTime
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 |
7 | data class ChatSeugiUiState(
8 | val isLoading: Boolean = false,
9 | val chatMessage: ImmutableList = persistentListOf(),
10 | )
11 |
12 | sealed interface ChatData {
13 | data class AI(val message: String, val timestamp: LocalDateTime, val isFirst: Boolean, val isLast: Boolean) :
14 | ChatData
15 | data class User(val message: String, val timestamp: LocalDateTime, val isLast: Boolean) :
16 | ChatData
17 | }
18 |
--------------------------------------------------------------------------------
/designsystem/src/main/java/com/seugi/designsystem/component/modifier/BrushDrawModifier.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.designsystem.component.modifier
2 |
3 | import androidx.compose.ui.Modifier
4 | import androidx.compose.ui.draw.drawWithCache
5 | import androidx.compose.ui.graphics.BlendMode
6 | import androidx.compose.ui.graphics.Brush
7 | import androidx.compose.ui.graphics.graphicsLayer
8 |
9 | fun Modifier.brushDraw(brush: Brush): Modifier = this
10 | .graphicsLayer(alpha = 0.99f)
11 | .drawWithCache {
12 | onDrawWithContent {
13 | drawContent()
14 | drawRect(
15 | brush = brush,
16 | blendMode = BlendMode.SrcAtop,
17 | )
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/network/timetable/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android.feature)
3 | alias(libs.plugins.seugi.android.hilt)
4 | alias(libs.plugins.seugi.kotlin.serialization)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.network.timetable"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.common)
13 | implementation(projects.network.core)
14 |
15 | androidTestImplementation(libs.kotlinx.serialization.json)
16 | androidTestImplementation(libs.ktor.client.mock)
17 | androidTestImplementation(libs.junit)
18 | androidTestImplementation(libs.kotlin.test)
19 | androidTestImplementation(libs.kotlinx.coroutines.test)
20 | // androidTestImplementation(libs.testng)
21 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/seugi/di/ActivityStarterModule.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.di
2 |
3 | import android.content.Context
4 | import com.seugi.common.utiles.SeugiActivityStarter
5 | import com.seugi.starter.SeugiActivityStarterImpl
6 | import dagger.Module
7 | import dagger.Provides
8 | import dagger.hilt.InstallIn
9 | import dagger.hilt.android.qualifiers.ApplicationContext
10 | import dagger.hilt.components.SingletonComponent
11 | import javax.inject.Singleton
12 |
13 | @Module
14 | @InstallIn(SingletonComponent::class)
15 | object ActivityStarterModule {
16 |
17 | @Provides
18 | @Singleton
19 | fun providesSeugiActivityStarter(@ApplicationContext context: Context): SeugiActivityStarter = SeugiActivityStarterImpl(context)
20 | }
21 |
--------------------------------------------------------------------------------
/data/assignment/src/main/java/com/seugi/data/assignment/AssignmentRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.assignment
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.assignment.model.AssignmentModel
5 | import java.time.LocalDateTime
6 | import kotlinx.collections.immutable.ImmutableList
7 | import kotlinx.coroutines.flow.Flow
8 |
9 | interface AssignmentRepository {
10 |
11 | suspend fun getWorkspaceTaskAll(workspaceId: String): Flow>>
12 |
13 | suspend fun getGoogleTaskAll(): Flow>>
14 |
15 | suspend fun createTask(workspaceId: String, title: String, description: String, dueDate: LocalDateTime): Flow>
16 | }
17 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/mapper/ProfileMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.mapper
2 |
3 | import com.seugi.data.core.model.ProfileModel
4 | import com.seugi.network.core.response.ProfileResponse
5 |
6 | fun List.toModels() = this.map {
7 | it.toModel()
8 | }
9 |
10 | fun ProfileResponse.toModel() = ProfileModel(
11 | status = status,
12 | member = member.toModel(),
13 | workspaceId = workspaceId,
14 | nick = nick,
15 | spot = spot,
16 | belong = belong,
17 | phone = phone,
18 | wire = wire,
19 | location = location,
20 | permission = permission.toModel(),
21 | schGrade = schGrade,
22 | schClass = schClass,
23 | schNumber = schNumber,
24 | )
25 |
--------------------------------------------------------------------------------
/data/member/src/main/java/com/seugi/data/member/MemberRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.member
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.TokenModel
5 | import com.seugi.network.request.EmailSignInRequest
6 | import kotlinx.coroutines.flow.Flow
7 |
8 | interface MemberRepository {
9 | suspend fun emailSignIn(body: EmailSignInRequest): Flow>
10 | suspend fun getCode(email: String): Flow>
11 | suspend fun emailSignUp(name: String, email: String, password: String, code: String): Flow>
12 | suspend fun remove(): Flow>
13 | suspend fun editProfile(name: String, picture: String, birth: String): Flow>
14 | }
15 |
--------------------------------------------------------------------------------
/feature-main/meal-widget/src/main/java/com/seugi/meal/widget/model/MealWidgetState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.meal.widget.model
2 |
3 | import com.seugi.data.core.model.MealModel
4 | import kotlinx.datetime.LocalDateTime
5 | import kotlinx.serialization.Serializable
6 |
7 | @Serializable
8 | sealed interface MealWidgetState {
9 |
10 | @Serializable
11 | data object Loading : MealWidgetState
12 |
13 | @Serializable
14 | data object Error : MealWidgetState
15 |
16 | @Serializable
17 | data class Success(
18 | val timestamp: LocalDateTime,
19 | val data: List,
20 | ) : MealWidgetState
21 |
22 | //
23 | // 유저 타임 스템프 저장[0, 14323, 3123213, 464543]
24 | }
25 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/ProfileModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | data class ProfileModel(
4 | val status: String,
5 | val member: UserModel,
6 | val workspaceId: String,
7 | val nick: String,
8 | val spot: String,
9 | val belong: String,
10 | val phone: String,
11 | val wire: String,
12 | val location: String,
13 | val permission: WorkspacePermissionModel,
14 | val schGrade: Int,
15 | val schClass: Int,
16 | val schNumber: Int,
17 | ) {
18 | val nameAndNick
19 | get() =
20 | if (nick.isEmpty()) {
21 | member.name
22 | } else {
23 | "${member.name} ($nick)"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/feature-main/meal/src/main/java/com/seugi/meal/navigation/MealNavigation.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.meal.navigation
2 |
3 | import androidx.navigation.NavController
4 | import androidx.navigation.NavGraphBuilder
5 | import androidx.navigation.NavOptions
6 | import androidx.navigation.compose.composable
7 | import com.seugi.meal.MealScreen
8 |
9 | const val MEAL_ROUTE = "meal"
10 |
11 | fun NavController.navigateToMeal(navOptions: NavOptions? = null) = this.navigate(MEAL_ROUTE)
12 |
13 | fun NavGraphBuilder.mealScreen(workspaceId: String, popBackStack: () -> Unit) {
14 | composable(MEAL_ROUTE) {
15 | MealScreen(
16 | workspaceId = workspaceId,
17 | popBackStack = popBackStack,
18 | )
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/designsystem/src/main/res/drawable/ic_send_fill.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/data/message/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.seugi.android)
3 | alias(libs.plugins.seugi.android.kotlin)
4 | alias(libs.plugins.seugi.android.hilt)
5 | }
6 |
7 | android {
8 | namespace = "com.seugi.data.chatdetail"
9 | defaultConfig {
10 | consumerProguardFiles("consumer-rules.pro")
11 | }
12 | }
13 |
14 |
15 | dependencies {
16 | implementation(projects.network.core)
17 | implementation(projects.network.message)
18 | implementation(projects.data.core)
19 | implementation(projects.network.meal)
20 | implementation(projects.network.notification)
21 | implementation(projects.network.timetable)
22 | implementation(projects.common)
23 | implementation(projects.local.room)
24 | }
--------------------------------------------------------------------------------
/feature-onboarding/onboarding/src/main/java/com/seugi/onboarding/navigation/OnboardingNavigation.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.onboarding.navigation
2 |
3 | import androidx.navigation.NavController
4 | import androidx.navigation.NavGraphBuilder
5 | import androidx.navigation.NavOptions
6 | import androidx.navigation.compose.composable
7 | import com.seugi.onboarding.OnboardingScreen
8 |
9 | const val ONBOARDING_ROUTE = "onboarding"
10 |
11 | fun NavController.navigateToOnboarding(navOptions: NavOptions? = null) = navigate(ONBOARDING_ROUTE, navOptions)
12 |
13 | fun NavGraphBuilder.onboardingScreen(onboardingToMain: () -> Unit) {
14 | composable(route = ONBOARDING_ROUTE) {
15 | OnboardingScreen(onboardingToMain = onboardingToMain)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/feature-main/profile/src/main/java/com/seugi/profile/model/ProfileUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.profile.model
2 |
3 | import com.seugi.data.core.model.ProfileModel
4 | import com.seugi.data.core.model.UserModel
5 | import com.seugi.data.core.model.WorkspacePermissionModel
6 |
7 | data class ProfileUiState(
8 | val profileInfo: ProfileModel = ProfileModel(
9 | status = "",
10 | UserModel(0, "", "", "", ""),
11 | workspaceId = "",
12 | nick = "",
13 | spot = "",
14 | belong = "",
15 | phone = "",
16 | wire = "",
17 | location = "",
18 | permission = WorkspacePermissionModel.STUDENT,
19 | schGrade = 0,
20 | schClass = 0,
21 | schNumber = 0,
22 | ),
23 | )
24 |
--------------------------------------------------------------------------------
/feature-main/assignment/src/main/java/com/seugi/assignment/model/AssignmentUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.assignment.model
2 |
3 | import com.seugi.data.assignment.model.AssignmentModel
4 | import kotlinx.collections.immutable.ImmutableList
5 |
6 | data class AssignmentUiState(
7 | val classroomTaskState: CommonUiState> = CommonUiState.Loading,
8 | val workspaceTaskState: CommonUiState> = CommonUiState.Loading,
9 | )
10 |
11 | sealed interface CommonUiState {
12 | data class Success(val data: T) : CommonUiState
13 | data object Loading : CommonUiState
14 | data object Error : CommonUiState
15 | data object NotFound : CommonUiState
16 | }
17 |
--------------------------------------------------------------------------------
/network/assignment/src/main/java/com/seugi/network/assignment/AssignmentDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.assignment
2 |
3 | import com.seugi.network.assignment.response.AssignmentGoogleResponse
4 | import com.seugi.network.assignment.response.AssignmentResponse
5 | import com.seugi.network.core.response.BaseResponse
6 | import com.seugi.network.core.response.Response
7 | import java.time.LocalDateTime
8 |
9 | interface AssignmentDataSource {
10 |
11 | suspend fun getWorkspaceTaskAll(workspaceId: String): BaseResponse>
12 |
13 | suspend fun getClassroomAll(): BaseResponse>
14 |
15 | suspend fun createTask(workspaceId: String, title: String, description: String, dueDate: LocalDateTime): Response
16 | }
17 |
--------------------------------------------------------------------------------
/local/room/src/main/java/com/seugi/local/room/util/LongListTypeConverter.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.local.room.util
2 |
3 | import android.util.Log
4 | import androidx.room.TypeConverter
5 | import com.google.gson.Gson
6 |
7 | class LongListTypeConverter {
8 |
9 | @TypeConverter
10 | fun listLongToString(value: List): String {
11 | val json = Gson().toJson(value)
12 | Log.d("LongListTypeConverter", "Converted List to JSON: $json")
13 | return json
14 | }
15 |
16 | @TypeConverter
17 | fun stringToListLong(value: String): List {
18 | val list = Gson().fromJson(value, Array::class.java).toList()
19 | Log.d("LongListTypeConverter", "Converted JSON to List: $list")
20 | return list
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/network/group-chat/src/main/java/com/seugi/network/groupchat/GroupChatDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.groupchat
2 |
3 | import com.seugi.network.core.response.BaseResponse
4 | import com.seugi.network.core.response.ChatRoomResponse
5 |
6 | interface GroupChatDataSource {
7 |
8 | suspend fun getGroupRoomList(workspaceId: String): BaseResponse>
9 |
10 | suspend fun createChat(workspaceId: String, roomName: String, joinUsers: List, chatRoomImg: String): BaseResponse
11 |
12 | suspend fun getChat(roomId: String): BaseResponse
13 |
14 | suspend fun leftRoom(chatRoomId: String): BaseResponse
15 |
16 | suspend fun addMembers(chatRoomId: String, chatMemberUsers: List): BaseResponse
17 | }
18 |
--------------------------------------------------------------------------------
/network/message/src/main/java/com/seugi/network/message/response/message/MessageMessageResponse.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.network.message.response.message
2 |
3 | import com.seugi.network.message.response.MessageTypeResponse
4 | import java.time.LocalDateTime
5 |
6 | data class MessageMessageResponse(
7 | val id: String,
8 | val chatRoomId: String,
9 | override val type: String,
10 | val userId: Int,
11 | val message: String,
12 | val emoticon: String?,
13 | val eventList: List?,
14 | val emojiList: List,
15 | val mention: List,
16 | val mentionAll: Boolean,
17 | val timestamp: LocalDateTime,
18 | val read: List,
19 | val messageStatus: String,
20 | val uuid: String?,
21 | ) : MessageTypeResponse()
22 |
--------------------------------------------------------------------------------
/data/group-chat/src/main/java/com/seugi/data/groupchat/GroupChatRepository.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.groupchat
2 |
3 | import com.seugi.common.model.Result
4 | import com.seugi.data.core.model.ChatRoomModel
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface GroupChatRepository {
8 |
9 | suspend fun getGroupRoomList(workspaceId: String): Flow>>
10 |
11 | suspend fun createChat(workspaceId: String, roomName: String, joinUsers: List, chatRoomImg: String): Flow>
12 |
13 | suspend fun getGroupRoom(roomId: String): Flow>
14 |
15 | suspend fun leftRoom(chatRoomId: String): Flow>
16 |
17 | suspend fun addMembers(chatRoomId: String, chatMemberUsers: List): Flow>
18 | }
19 |
--------------------------------------------------------------------------------
/feature-main/chat-seugi/src/main/java/com/seugi/chatseugi/navigation/ChatSeugiNavigation.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.chatseugi.navigation
2 |
3 | import androidx.navigation.NavController
4 | import androidx.navigation.NavGraphBuilder
5 | import androidx.navigation.NavOptions
6 | import androidx.navigation.compose.composable
7 | import androidx.navigation.navigation
8 | import com.seugi.chatseugi.ChatSeugiScreen
9 |
10 | const val CHAT_SEUGI_ROUTE = "chat_seugi"
11 |
12 | fun NavController.navigateToChatSeugi(navOptions: NavOptions? = null) = navigate(CHAT_SEUGI_ROUTE, navOptions)
13 |
14 | fun NavGraphBuilder.chatSeugiScreen(popBackStack: () -> Unit) {
15 | composable(CHAT_SEUGI_ROUTE) {
16 | ChatSeugiScreen(
17 | popBackStack = popBackStack,
18 | )
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/feature-main/workspace-detail/src/main/java/com/seugi/workspacedetail/feature/workspacedetail/model/WorkspaceDetailUiState.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.workspacedetail.feature.workspacedetail.model
2 |
3 | import com.seugi.data.workspace.model.WaitWorkspaceModel
4 | import com.seugi.data.workspace.model.WorkspaceModel
5 | import kotlinx.collections.immutable.ImmutableList
6 | import kotlinx.collections.immutable.persistentListOf
7 |
8 | data class WorkspaceDetailUiState(
9 | val loading: Boolean = false,
10 | val myWorkspace: ImmutableList = persistentListOf(),
11 | val waitWorkspace: ImmutableList = persistentListOf(),
12 | )
13 |
14 | sealed interface WorkspaceDetailSideEffect {
15 | data class Error(val throwable: Throwable) : WorkspaceDetailSideEffect
16 | }
17 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/data/core/src/main/java/com/seugi/data/core/model/MealModel.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.core.model
2 |
3 | import com.seugi.common.utiles.ImmutableListSerializer
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.datetime.LocalDate
6 | import kotlinx.datetime.serializers.LocalDateIso8601Serializer
7 | import kotlinx.serialization.Serializable
8 |
9 | @Serializable
10 | data class MealModel(
11 | val id: Long,
12 | val workspaceId: String,
13 | val mealType: MealType,
14 | @Serializable(with = ImmutableListSerializer::class) val menu: ImmutableList,
15 | val calorie: String,
16 | @Serializable(with = ImmutableListSerializer::class) val mealInfo: ImmutableList,
17 | @Serializable(with = LocalDateIso8601Serializer::class) val mealDate: LocalDate,
18 | )
19 |
--------------------------------------------------------------------------------
/data/message/src/main/java/com/seugi/data/message/mapper/MessageStompMapper.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.data.message.mapper
2 |
3 | import com.seugi.data.message.model.stomp.MessageStompLifecycleModel
4 | import com.seugi.network.message.response.stomp.MessageStompLifecycleResponse
5 |
6 | internal fun MessageStompLifecycleResponse.toModel() = when (this) {
7 | is MessageStompLifecycleResponse.Error -> MessageStompLifecycleModel.Error(this.exception)
8 | is MessageStompLifecycleResponse.Open -> MessageStompLifecycleModel.Open
9 | is MessageStompLifecycleResponse.FailedServerHeartbeat -> MessageStompLifecycleModel.FailedServerHeartbeat
10 | is MessageStompLifecycleResponse.Closed -> MessageStompLifecycleModel.Closed
11 | is MessageStompLifecycleResponse.Connected -> MessageStompLifecycleModel.Connected
12 | }
13 |
--------------------------------------------------------------------------------
/feature-onboarding/join/src/main/java/com/seugi/join/navigation/OAuthSingUpNavigation.kt:
--------------------------------------------------------------------------------
1 | package com.seugi.join.navigation
2 |
3 | import androidx.navigation.NavController
4 | import androidx.navigation.NavGraphBuilder
5 | import androidx.navigation.NavOptions
6 | import androidx.navigation.compose.composable
7 | import com.seugi.join.feature.OAuthSignUpScreen
8 |
9 | const val OAUTH_SIGN_UP = "oauthSignUp"
10 |
11 | fun NavController.navigateToOAuthSignUp(navOptions: NavOptions? = null) = navigate(
12 | OAUTH_SIGN_UP,
13 | navOptions,
14 | )
15 |
16 | fun NavGraphBuilder.oauthSignUp(popBackStack: () -> Unit, navigateToEmailSignUp: () -> Unit) {
17 | composable(route = OAUTH_SIGN_UP) {
18 | OAuthSignUpScreen(popBackStack = popBackStack, navigateToEmailSignUp = navigateToEmailSignUp)
19 | }
20 | }
21 |
--------------------------------------------------------------------------------