Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/src/main/java/com/xpeho/xpeapp/data/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ enum class FeatureFlippingEnum(val value: String) {
EXPENSE_REPORT("expenseReport"),
COLLEAGUES("colleagues"),
QVST("campaign"),
PROFILE("profile")
PROFILE("profile"),
AGENDA("agenda"),
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.xpeho.xpeapp.data.dateConverter

import com.google.gson.*
import java.lang.reflect.Type
import java.time.LocalTime
import java.time.format.DateTimeFormatter

class DateTimeTypeAdapter : JsonSerializer<LocalTime?>, JsonDeserializer<LocalTime?> {
private val formatter = DateTimeFormatter.ofPattern("HH:mm:ss")

override fun serialize(src: LocalTime?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
return if (src == null) JsonNull.INSTANCE else JsonPrimitive(src.format(formatter))
}

override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): LocalTime? {
return if (json == null || json.isJsonNull) null else LocalTime.parse(json.asString, formatter)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.xpeho.xpeapp.data.dateConverter

import com.google.gson.*
import java.lang.reflect.Type
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

class DateTypeAdapter : JsonSerializer<Date>, JsonDeserializer<Date> {
// Format for input dates
private val inputFormats = listOf(
SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.FRENCH),
SimpleDateFormat("yyyy-MM-dd", Locale.FRENCH)
)
// Format for output dates
private val outputFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)

override fun serialize(src: Date?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
return JsonPrimitive(src?.let { outputFormat.format(it) })
}

override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Date? {
val dateStr = json?.asString
if (dateStr != null) {
for (format in inputFormats) {
try {
return format.parse(dateStr)
} catch (e: ParseException) {
// Ignore and try the next format
println(e.message)
}
}
}
throw JsonParseException("Unparseable date in dateTypeAdapter: \"$dateStr\"")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.xpeho.xpeapp.data.model.agenda

import com.google.gson.annotations.SerializedName
import java.util.Date

data class AgendaBirthday(
val id: Int,
@SerializedName("first_name") val firstName: String,
val birthdate: Date,
val email: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.xpeho.xpeapp.data.model.agenda

import com.google.gson.annotations.SerializedName
import java.time.LocalTime
import java.util.Date

data class AgendaEvent(
val id: Int,
val date: Date,
@SerializedName("start_time") val startTime: LocalTime?,
@SerializedName("end_time") val endTime: LocalTime?,
val title: String,
val location: String?,
@SerializedName("type_id") val typeId: String,
val topic: String?
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.xpeho.xpeapp.data.model.agenda

import com.google.gson.annotations.SerializedName

data class AgendaEventType(
val id: Int,
val label: String,
@SerializedName("color_code") val colorCode: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ package com.xpeho.xpeapp.data.service

import android.util.Log
import androidx.annotation.VisibleForTesting
import com.google.api.Page
import com.xpeho.xpeapp.data.entity.AuthentificationBody
import com.xpeho.xpeapp.data.entity.QvstAnswerBody
import com.xpeho.xpeapp.data.entity.QvstCampaignEntity
import com.xpeho.xpeapp.data.entity.user.UserEditPassword
import com.xpeho.xpeapp.data.model.AuthResult
import com.xpeho.xpeapp.data.model.user.UserInfos
import com.xpeho.xpeapp.data.model.WordpressToken
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType
import com.xpeho.xpeapp.data.model.qvst.QvstCampaign
import com.xpeho.xpeapp.data.model.qvst.QvstProgress
import com.xpeho.xpeapp.data.model.qvst.QvstQuestion
Expand Down Expand Up @@ -278,6 +282,50 @@ class WordpressRepository(
)
}

// Agenda features methods

// getAllEvents

suspend fun getAllEvents(page: String): List<AgendaEvent>? {
handleServiceExceptions(
tryBody = {
return api.fetchEvents(page)
},
catchBody = { e ->
Log.e("WordpressRepository: getAllEvents", "Network error: ${e.message}")
return null
}
)
}

// getAllEventsTypes

suspend fun getAllEventsTypes(): List<AgendaEventType>? {
handleServiceExceptions(
tryBody = {
return api.fetchEventTypes()
},
catchBody = { e ->
Log.e("WordpressRepository: getAllEventsTypes", "Network error: ${e.message}")
return null
}
)
}

// getAllBirthdays

suspend fun getAllBirthdays(page: String): List<AgendaBirthday>? {
handleServiceExceptions(
tryBody = {
return api.fetchBirthdays(page)
},
catchBody = { e ->
Log.e("WordpressRepository: getAllBirthdays", "Network error: ${e.message}")
return null
}
)
}

// Exceptions handling

@Suppress("ReturnCount")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import com.xpeho.xpeapp.data.entity.QvstAnswerBody
import com.xpeho.xpeapp.data.entity.user.UserEditPassword
import com.xpeho.xpeapp.data.model.user.UserInfos
import com.xpeho.xpeapp.data.model.WordpressToken
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType
import com.xpeho.xpeapp.data.model.qvst.QvstCampaign
import com.xpeho.xpeapp.data.model.qvst.QvstProgress
import com.xpeho.xpeapp.data.model.qvst.QvstQuestion
Expand Down Expand Up @@ -82,5 +85,27 @@ interface WordpressService {
suspend fun submitOpenAnswer(
@Query("text") text: String,
): Response<Unit>

// Agenda Feature

// Fetch all the events
@Headers("Content-Type: application/json")
@GET ("xpeho/v1/agenda/events")
suspend fun fetchEvents(
@Query("page") page: String = "",
): List<AgendaEvent>

// Fetch all the event types
@Headers("Content-Type: application/json")
@GET ("xpeho/v1/agenda/events-types")
suspend fun fetchEventTypes(): List<AgendaEventType>

// Fetch all birthdays
@Headers("Content-Type: application/json")
@GET ("xpeho/v1/agenda/birthday")
suspend fun fetchBirthdays(
@Query("page") page: String = "",
): List<AgendaBirthday>

}

11 changes: 10 additions & 1 deletion app/src/main/java/com/xpeho/xpeapp/di/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ package com.xpeho.xpeapp.di
import android.content.Context
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.gson.GsonBuilder
import com.google.type.DateTime
import com.xpeho.xpeapp.BuildConfig
import com.xpeho.xpeapp.data.DatastorePref
import com.xpeho.xpeapp.data.dateConverter.DateTimeTypeAdapter
import com.xpeho.xpeapp.data.dateConverter.DateTypeAdapter
import com.xpeho.xpeapp.data.service.FirebaseService
import com.xpeho.xpeapp.data.service.WordpressRepository
import com.xpeho.xpeapp.data.service.WordpressService
Expand All @@ -15,6 +18,8 @@ import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.time.LocalTime
import java.util.Date

interface AppModule {
val authenticationManager: AuthenticationManager
Expand All @@ -33,7 +38,11 @@ class MainAppModule(

private val baseUrl = BuildConfig.BACKEND_URL

private val gson = GsonBuilder().setLenient().create()
private val gson = GsonBuilder()
// Register custom date format for Date and DateTime
.registerTypeAdapter(Date::class.java, DateTypeAdapter())
.registerTypeAdapter(LocalTime::class.java, DateTimeTypeAdapter())
.setLenient().create()

private val logging = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC }
private val authorization by lazy {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.xpeho.xpeapp.ui.components.agenda

import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.xpeho.xpeho_ui_android.CollapsableCard
import com.xpeho.xpeho_ui_android.TagPill
import com.xpeho.xpeapp.R
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import java.text.SimpleDateFormat
import java.util.Locale

@Composable
fun AgendaBirthdayCard(
birthday: AgendaBirthday,
collapsable: Boolean = true,
defaultOpen: Boolean = false
) {
val tagColor = Color(0xFFFF7EEA)
val eventTypeIcon = R.drawable.birthday

CollapsableCard(
label = "Anniversaire de ${birthday.firstName}",
tags = getBirthdayTagsList(birthday, tagColor),
icon = {
Icon(
painter = painterResource(id = eventTypeIcon),
contentDescription = "birthday",
tint = tagColor,
modifier = Modifier.size(22.dp)
)
},
size = 16.sp,
collapsable = collapsable,
defaultOpen = defaultOpen
)
}

@Composable
private fun getBirthdayTagsList(birthday: AgendaBirthday, color: Color): @Composable () -> Unit {
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)

return {
TagPill(
label = dateFormat.format(birthday.birthdate),
backgroundColor = color,
size = 9.sp
)
}
}
Loading
Loading