From 55a3f00a5e8770e6594f040adef333ef2b82868a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 14:50:34 +0800 Subject: [PATCH 1/6] fix: wrong timezone used when saving page on android --- .../omnivore/networking/SavedItemMutations.kt | 17 +++++++++--- .../omnivore/ui/save/SaveSheetActivity.kt | 26 +++++++++++++------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt index b61c20d03..a5d9591ee 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt @@ -17,7 +17,8 @@ import java.util.* suspend fun Networker.deleteSavedItem(itemID: String): Boolean { return try { val input = SetBookmarkArticleInput(itemID, false) - val result = authenticatedApolloClient().mutation(SetBookmarkArticleMutation(input)).execute() + val result = + authenticatedApolloClient().mutation(SetBookmarkArticleMutation(input)).execute() result.data?.setBookmarkArticle?.onSetBookmarkArticleSuccess?.bookmarkedArticle?.id != null } catch (e: java.lang.Exception) { false @@ -32,7 +33,10 @@ suspend fun Networker.unarchiveSavedItem(itemID: String): Boolean { return updateArchiveStatusSavedItem(itemID, false) } -suspend fun Networker.updateArchiveStatusSavedItem(itemID: String, setAsArchived: Boolean): Boolean { +suspend fun Networker.updateArchiveStatusSavedItem( + itemID: String, + setAsArchived: Boolean +): Boolean { return try { val input = ArchiveLinkInput(setAsArchived, itemID) val result = authenticatedApolloClient().mutation(SetLinkArchivedMutation(input)).execute() @@ -42,10 +46,15 @@ suspend fun Networker.updateArchiveStatusSavedItem(itemID: String, setAsArchived } } -suspend fun Networker.saveUrl(url: Uri): Boolean { +suspend fun Networker.saveUrl(url: Uri, timeZone: String): Boolean { return try { val clientRequestId = UUID.randomUUID().toString() - val input = SaveUrlInput(url = url.toString(), clientRequestId = clientRequestId, source = "android") + val input = SaveUrlInput( + url = url.toString(), + clientRequestId = clientRequestId, + source = "android", + timeZone = timeZone + ) val result = authenticatedApolloClient().mutation(SaveUrlMutation(input)).execute() result.data?.saveUrl?.onSaveSuccess?.url != null } catch (e: java.lang.Exception) { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt index bb39e5eb2..88edbb493 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt @@ -45,6 +45,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.time.Duration.Companion.seconds +import java.util.TimeZone // Not sure why we need this class, but directly opening SaveSheetActivity // causes the app to crash. @@ -52,19 +53,22 @@ class SaveSheetActivity : SaveSheetActivityBase() {} @AndroidEntryPoint @OptIn(ExperimentalMaterialApi::class) -abstract class SaveSheetActivityBase: AppCompatActivity() { +abstract class SaveSheetActivityBase : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val viewModel: SaveViewModel by viewModels() var extractedText: String? = null + // get timezone from device + val timezone = TimeZone.getDefault().id + when (intent?.action) { Intent.ACTION_SEND -> { if (intent.type?.startsWith("text/plain") == true) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { extractedText = it - viewModel.saveURL(it) + viewModel.saveURL(it, timezone) Log.d(ContentValues.TAG, "Extracted text: $extractedText") } } @@ -74,6 +78,7 @@ abstract class SaveSheetActivityBase: AppCompatActivity() { } } } + else -> { // Handle other intents, such as being started from the home screen } @@ -110,8 +115,11 @@ abstract class SaveSheetActivityBase: AppCompatActivity() { .clip(RoundedCornerShape(topEnd = 5.dp, topStart = 5.dp)), containerColor = MaterialTheme.colors.background, actions = { - Spacer(modifier = Modifier.width(25.dp)) - Text(message, style = androidx.compose.material3.MaterialTheme.typography.titleMedium) + Spacer(modifier = Modifier.width(25.dp)) + Text( + message, + style = androidx.compose.material3.MaterialTheme.typography.titleMedium + ) }, ) }, @@ -181,7 +189,7 @@ abstract class SaveSheetActivityBase: AppCompatActivity() { ) { coroutineScope.launch { if (withResults) setResult(RESULT_OK) - result?.let { intent = it} + result?.let { intent = it } modalBottomSheetState.hide() // will trigger the LaunchedEffect } } @@ -191,9 +199,11 @@ abstract class SaveSheetActivityBase: AppCompatActivity() { viewModel: SaveViewModel, modalBottomSheetState: ModalBottomSheetState ) { - Box(modifier = Modifier - .height(300.dp) - .background(Color.White)) { + Box( + modifier = Modifier + .height(300.dp) + .background(Color.White) + ) { SaveContent(viewModel, modalBottomSheetState, modifier = Modifier.fillMaxSize()) } } From b56598c20b39f87c1f22e4660c0ae79ce3c55825 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 15:16:35 +0800 Subject: [PATCH 2/6] fix: wrong timezone used when saving item with adding link on web --- .../web/components/templates/homeFeed/AddLinkModal.tsx | 9 ++++++--- packages/web/lib/networking/mutations/saveUrlMutation.ts | 4 +++- packages/web/pages/api/save.ts | 9 +++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/web/components/templates/homeFeed/AddLinkModal.tsx b/packages/web/components/templates/homeFeed/AddLinkModal.tsx index 282033cd6..084e2ac43 100644 --- a/packages/web/components/templates/homeFeed/AddLinkModal.tsx +++ b/packages/web/components/templates/homeFeed/AddLinkModal.tsx @@ -20,9 +20,12 @@ type AddLinkModalProps = { export function AddLinkModal(props: AddLinkModalProps): JSX.Element { const [link, setLink] = useState('') + // get timezone from browser + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone + const handleLinkSubmission = useCallback( - async (link: string) => { - const result = await saveUrlMutation(link) + async (link: string, timezone: string) => { + const result = await saveUrlMutation(link, timezone) if (result) { toast( () => ( @@ -95,7 +98,7 @@ export function AddLinkModal(props: AddLinkModalProps): JSX.Element { setLink(newLink) submitLink = newLink } - handleLinkSubmission(submitLink) + handleLinkSubmission(submitLink, timezone) props.onOpenChange(false) }} > diff --git a/packages/web/lib/networking/mutations/saveUrlMutation.ts b/packages/web/lib/networking/mutations/saveUrlMutation.ts index 524ac2add..299d65c80 100644 --- a/packages/web/lib/networking/mutations/saveUrlMutation.ts +++ b/packages/web/lib/networking/mutations/saveUrlMutation.ts @@ -20,7 +20,8 @@ export type SaveUrlData = { } export async function saveUrlMutation( - url: string + url: string, + timezone?: string ): Promise { const clientRequestId = uuidv4() const mutation = gql` @@ -44,6 +45,7 @@ export async function saveUrlMutation( url, clientRequestId, source: 'add-link', + timezone, }, }) const output = data as SaveResponseData | undefined diff --git a/packages/web/pages/api/save.ts b/packages/web/pages/api/save.ts index 87e8bfbe7..789a66b12 100644 --- a/packages/web/pages/api/save.ts +++ b/packages/web/pages/api/save.ts @@ -7,7 +7,8 @@ const saveUrl = async ( req: NextApiRequest, url: URL, labels: string[] | undefined, - state: string | undefined + state: string | undefined, + timezone?: string ) => { const clientRequestId = uuidv4() const mutation = ` @@ -33,6 +34,7 @@ const saveUrl = async ( source: 'api-save-url', labels: labels?.map((label) => ({ name: label })), state, + timezone, }, }) @@ -60,7 +62,10 @@ export default async ( const labels = req.query['labels'] as string[] | undefined const state = req.query['state'] as string | undefined const url = new URL(urlStr as string) - const saveResult = await saveUrl(req, url, labels, state) + // get timezone from browser + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone + + const saveResult = await saveUrl(req, url, labels, state, timezone) console.log('saveResult: ', saveResult) if (saveResult) { res.redirect(`/article?url=${encodeURIComponent(url.toString())}`) From df58198161a2f9ade01df5a34eae19efeb84a931 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 16:00:49 +0800 Subject: [PATCH 3/6] set locale in saveUrl api request on web --- .../web/components/templates/homeFeed/AddLinkModal.tsx | 10 ++++------ packages/web/lib/dateFormatting.ts | 4 ++-- .../web/lib/networking/mutations/saveUrlMutation.ts | 4 +++- packages/web/pages/api/save.ts | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/web/components/templates/homeFeed/AddLinkModal.tsx b/packages/web/components/templates/homeFeed/AddLinkModal.tsx index 084e2ac43..20b8f300c 100644 --- a/packages/web/components/templates/homeFeed/AddLinkModal.tsx +++ b/packages/web/components/templates/homeFeed/AddLinkModal.tsx @@ -1,5 +1,6 @@ import { useCallback, useState } from 'react' import toast from 'react-hot-toast' +import { locale, timeZone } from '../../../lib/dateFormatting' import { saveUrlMutation } from '../../../lib/networking/mutations/saveUrlMutation' import { showErrorToast } from '../../../lib/toastHelpers' import { Button } from '../../elements/Button' @@ -20,12 +21,9 @@ type AddLinkModalProps = { export function AddLinkModal(props: AddLinkModalProps): JSX.Element { const [link, setLink] = useState('') - // get timezone from browser - const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone - const handleLinkSubmission = useCallback( - async (link: string, timezone: string) => { - const result = await saveUrlMutation(link, timezone) + async (link: string, timezone: string, locale: string) => { + const result = await saveUrlMutation(link, timezone, locale) if (result) { toast( () => ( @@ -98,7 +96,7 @@ export function AddLinkModal(props: AddLinkModalProps): JSX.Element { setLink(newLink) submitLink = newLink } - handleLinkSubmission(submitLink, timezone) + handleLinkSubmission(submitLink, timeZone, locale) props.onOpenChange(false) }} > diff --git a/packages/web/lib/dateFormatting.ts b/packages/web/lib/dateFormatting.ts index 64e91d917..e31384041 100644 --- a/packages/web/lib/dateFormatting.ts +++ b/packages/web/lib/dateFormatting.ts @@ -1,8 +1,8 @@ //https://github.com/you-dont-need/You-Dont-Need-Momentjs -const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US' +export const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US' // get the user's time zone -const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone +export const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone export function formattedLongDate(rawDate: string): string { return new Intl.DateTimeFormat(locale, { diff --git a/packages/web/lib/networking/mutations/saveUrlMutation.ts b/packages/web/lib/networking/mutations/saveUrlMutation.ts index 299d65c80..0f3880d15 100644 --- a/packages/web/lib/networking/mutations/saveUrlMutation.ts +++ b/packages/web/lib/networking/mutations/saveUrlMutation.ts @@ -21,7 +21,8 @@ export type SaveUrlData = { export async function saveUrlMutation( url: string, - timezone?: string + timezone?: string, + locale?: string ): Promise { const clientRequestId = uuidv4() const mutation = gql` @@ -46,6 +47,7 @@ export async function saveUrlMutation( clientRequestId, source: 'add-link', timezone, + locale, }, }) const output = data as SaveResponseData | undefined diff --git a/packages/web/pages/api/save.ts b/packages/web/pages/api/save.ts index 789a66b12..556b674d5 100644 --- a/packages/web/pages/api/save.ts +++ b/packages/web/pages/api/save.ts @@ -1,5 +1,6 @@ import type { NextApiRequest, NextApiResponse } from 'next' import { v4 as uuidv4 } from 'uuid' +import { locale, timeZone } from '../../lib/dateFormatting' import { SaveResponseData } from '../../lib/networking/mutations/saveUrlMutation' import { ssrFetcher } from '../../lib/networking/networkHelpers' @@ -8,7 +9,8 @@ const saveUrl = async ( url: URL, labels: string[] | undefined, state: string | undefined, - timezone?: string + timezone?: string, + locale?: string ) => { const clientRequestId = uuidv4() const mutation = ` @@ -35,6 +37,7 @@ const saveUrl = async ( labels: labels?.map((label) => ({ name: label })), state, timezone, + locale, }, }) @@ -62,10 +65,7 @@ export default async ( const labels = req.query['labels'] as string[] | undefined const state = req.query['state'] as string | undefined const url = new URL(urlStr as string) - // get timezone from browser - const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone - - const saveResult = await saveUrl(req, url, labels, state, timezone) + const saveResult = await saveUrl(req, url, labels, state, timeZone, locale) console.log('saveResult: ', saveResult) if (saveResult) { res.redirect(`/article?url=${encodeURIComponent(url.toString())}`) From aff7da191acd1b3e1a23bd1c64c8df3792364d37 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 16:10:50 +0800 Subject: [PATCH 4/6] set locale in saveUrl api request on android --- .../app/omnivore/omnivore/networking/SavedItemMutations.kt | 5 +++-- .../java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt index a5d9591ee..e283f25ea 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt @@ -46,14 +46,15 @@ suspend fun Networker.updateArchiveStatusSavedItem( } } -suspend fun Networker.saveUrl(url: Uri, timeZone: String): Boolean { +suspend fun Networker.saveUrl(url: Uri, timeZone: String, locale: String): Boolean { return try { val clientRequestId = UUID.randomUUID().toString() val input = SaveUrlInput( url = url.toString(), clientRequestId = clientRequestId, source = "android", - timeZone = timeZone + timeZone = timeZone, + locale = locale ) val result = authenticatedApolloClient().mutation(SaveUrlMutation(input)).execute() result.data?.saveUrl?.onSaveSuccess?.url != null diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt index 88edbb493..325ce5b66 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import app.omnivore.omnivore.R import app.omnivore.omnivore.ui.library.SavedItemAction @@ -60,15 +61,16 @@ abstract class SaveSheetActivityBase : AppCompatActivity() { val viewModel: SaveViewModel by viewModels() var extractedText: String? = null - // get timezone from device + // get locale and timezone from device val timezone = TimeZone.getDefault().id + val locale = Locale.current.toLanguageTag() when (intent?.action) { Intent.ACTION_SEND -> { if (intent.type?.startsWith("text/plain") == true) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { extractedText = it - viewModel.saveURL(it, timezone) + viewModel.saveURL(it, timezone, locale) Log.d(ContentValues.TAG, "Extracted text: $extractedText") } } From e46b3c055015c866e921f60d83c39e720a67adfd Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 18:09:04 +0800 Subject: [PATCH 5/6] fix typo --- .../java/app/omnivore/omnivore/networking/SavedItemMutations.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt index e283f25ea..84601bfc2 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt @@ -53,7 +53,7 @@ suspend fun Networker.saveUrl(url: Uri, timeZone: String, locale: String): Boole url = url.toString(), clientRequestId = clientRequestId, source = "android", - timeZone = timeZone, + timezone = timeZone, locale = locale ) val result = authenticatedApolloClient().mutation(SaveUrlMutation(input)).execute() From ebc8bca9411cb20e775f628a850e397b46e92859 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 13 Jul 2023 18:49:28 +0800 Subject: [PATCH 6/6] update gql schema --- android/Omnivore/app/src/main/graphql/schema.graphqls | 2 ++ .../omnivore/networking/SavedItemMutations.kt | 10 +++++++--- .../omnivore/omnivore/ui/save/SaveSheetActivity.kt | 8 +------- .../app/omnivore/omnivore/ui/save/SaveViewModel.kt | 11 +++++++++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/android/Omnivore/app/src/main/graphql/schema.graphqls b/android/Omnivore/app/src/main/graphql/schema.graphqls index fd10083a7..4f51a59b3 100644 --- a/android/Omnivore/app/src/main/graphql/schema.graphqls +++ b/android/Omnivore/app/src/main/graphql/schema.graphqls @@ -1720,6 +1720,8 @@ input SaveUrlInput { source: String! state: ArticleSavingRequestStatus url: String! + timezone: String + locale: String } type SearchError { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt index 84601bfc2..20ee0a878 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt @@ -3,6 +3,7 @@ package app.omnivore.omnivore.networking import android.content.ContentValues import android.net.Uri import android.util.Log +import androidx.compose.ui.text.intl.Locale import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.Constants import app.omnivore.omnivore.graphql.generated.SaveUrlMutation @@ -46,15 +47,18 @@ suspend fun Networker.updateArchiveStatusSavedItem( } } -suspend fun Networker.saveUrl(url: Uri, timeZone: String, locale: String): Boolean { +suspend fun Networker.saveUrl(url: Uri): Boolean { return try { val clientRequestId = UUID.randomUUID().toString() + // get locale and timezone from device + val timezone = TimeZone.getDefault().id + val locale = Locale.current.toLanguageTag() val input = SaveUrlInput( url = url.toString(), clientRequestId = clientRequestId, source = "android", - timezone = timeZone, - locale = locale + timezone = Optional.present(timezone), + locale = Optional.present(locale) ) val result = authenticatedApolloClient().mutation(SaveUrlMutation(input)).execute() result.data?.saveUrl?.onSaveSuccess?.url != null diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt index 325ce5b66..216958bc8 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import app.omnivore.omnivore.R import app.omnivore.omnivore.ui.library.SavedItemAction @@ -46,7 +45,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.time.Duration.Companion.seconds -import java.util.TimeZone // Not sure why we need this class, but directly opening SaveSheetActivity // causes the app to crash. @@ -61,16 +59,12 @@ abstract class SaveSheetActivityBase : AppCompatActivity() { val viewModel: SaveViewModel by viewModels() var extractedText: String? = null - // get locale and timezone from device - val timezone = TimeZone.getDefault().id - val locale = Locale.current.toLanguageTag() - when (intent?.action) { Intent.ACTION_SEND -> { if (intent.type?.startsWith("text/plain") == true) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { extractedText = it - viewModel.saveURL(it, timezone, locale) + viewModel.saveURL(it) Log.d(ContentValues.TAG, "Extracted text: $extractedText") } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt index b2376d051..5877d8b03 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt @@ -5,6 +5,7 @@ import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.compose.ui.text.intl.Locale import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -14,6 +15,7 @@ import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.graphql.generated.SaveUrlMutation import app.omnivore.omnivore.graphql.generated.type.SaveUrlInput import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.api.Optional import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -31,7 +33,7 @@ enum class SaveState { @HiltViewModel class SaveViewModel @Inject constructor( private val datastoreRepo: DatastoreRepository -): ViewModel() { +) : ViewModel() { val saveState = MutableLiveData(SaveState.NONE) var isLoading by mutableStateOf(false) @@ -81,13 +83,18 @@ class SaveViewModel @Inject constructor( try { clientRequestID = UUID.randomUUID().toString() + // get locale and timezone from device + val timezone = TimeZone.getDefault().id + val locale = Locale.current.toLanguageTag() val response = apolloClient.mutation( SaveUrlMutation( SaveUrlInput( clientRequestId = clientRequestID!!, source = "android", - url = cleanedUrl + url = cleanedUrl, + timezone = Optional.present(timezone), + locale = Optional.present(locale) ) ) ).execute()