A cheap attempt at a native Bluesky client for Android

MainView: Fetch timeline on first load

Instead of fetching timeline data when the `TimelineViewModel` is initialized, fetch it when `MainView` is first composed.

This ensures that the data is only loaded when the UI is actually ready to be displayed.

+17 -5
+1
.idea/dictionaries/project.xml
··· 1 1 <component name="ProjectDictionaryState"> 2 2 <dictionary name="project"> 3 3 <words> 4 + <w>appview</w> 4 5 <w>bsky</w> 5 6 <w>rkey</w> 6 7 <w>skeets</w>
+11 -1
app/src/main/java/industries/geesawra/monarch/MainActivity.kt
··· 18 18 import androidx.compose.material3.ExperimentalMaterial3Api 19 19 import androidx.compose.material3.MaterialTheme 20 20 import androidx.compose.material3.Surface 21 + import androidx.compose.runtime.mutableStateOf 22 + import androidx.compose.runtime.remember 21 23 import androidx.compose.runtime.rememberCoroutineScope 22 24 import androidx.compose.ui.Alignment 23 25 import androidx.compose.ui.Modifier ··· 58 60 super.onCreate(savedInstanceState) 59 61 enableEdgeToEdge() 60 62 63 + setContent { 64 + val firstLoadDone = remember { mutableStateOf(false) } 61 65 62 - setContent { 63 66 MonarchTheme { 64 67 val context = LocalContext.current 65 68 SingletonImageLoader.setSafe { ··· 131 134 }, 132 135 onThreadTap = { 133 136 navController.navigate(ViewList.ShowThread.name) 137 + }, 138 + onFirstLoad = { 139 + if (firstLoadDone.value) { 140 + return@MainView 141 + } 142 + timelineViewModel.fetchAllNewData() 143 + firstLoadDone.value = true 134 144 } 135 145 ) 136 146 }
+5
app/src/main/java/industries/geesawra/monarch/MainView.kt
··· 116 116 coroutineScope: CoroutineScope, 117 117 onLoginError: () -> Unit, 118 118 onThreadTap: (SkeetData) -> Unit, 119 + onFirstLoad: () -> Unit, 119 120 ) { 120 121 val scrollState = rememberScrollState() 121 122 val scaffoldState = rememberBottomSheetScaffoldState( ··· 125 126 ) 126 127 val inReplyTo = remember { mutableStateOf<SkeetData?>(null) } 127 128 val isQuotePost = remember { mutableStateOf(false) } 129 + 130 + LaunchedEffect(Unit) { 131 + onFirstLoad() 132 + } 128 133 129 134 BottomSheetScaffold( 130 135 modifier = Modifier
-4
app/src/main/java/industries/geesawra/monarch/datalayer/TimelineViewModel.kt
··· 80 80 private var timelineFetchJob: Job? = null 81 81 private var notificationsFetchJob: Job? = null 82 82 83 - init { 84 - fetchAllNewData() 85 - } 86 - 87 83 fun loadSession() { 88 84 viewModelScope.launch { 89 85 if (!bskyConn.hasSession()) {