refactor(#82): remove dead SkeletonList/SkeletonCard composables
* ci: prevent concurrency cancellation on rapid main merges The concurrency group used github.ref which is static for main (refs/heads/main). When multiple PRs merged rapidly (~2 min apart), each merge commit cancelled the previous CI run before it could finish. Fix: use github.sha for push events to main (unique per commit) while keeping the ref-based group for PR branches (cancels on new commits to the same PR branch). * refactor(#82): remove dead SkeletonList/SkeletonCard composables --------- Co-authored-by: ronia <ronia@m57> Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
2 files changed
+1
-84
No files matched your search
@@ -105,14 +105,13 @@ status colors (success/warning/error/info) are ALWAYS brand-defined via
|
|||||||
git checkout main && git pull origin main
|
git checkout main && git pull origin main
|
||||||
git checkout -b fix/issue-N-description # or feat/...
|
git checkout -b fix/issue-N-description # or feat/...
|
||||||
# make changes, run ./ktlint --format
|
# make changes, run ./ktlint --format
|
||||||
git -c user.name='ronia' -c user.email='ronia@m57' commit -m "fix(#N): description"
|
git commit -m "fix(#N): description"
|
||||||
git push -u origin HEAD
|
git push -u origin HEAD
|
||||||
gh pr create --title "fix(#N): description" --body "Closes #N"
|
gh pr create --title "fix(#N): description" --body "Closes #N"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Commit Conventions
|
### Commit Conventions
|
||||||
|
|
||||||
- **Author:** `ronia@m57` (set via `-c user.name` / `-c user.email`).
|
|
||||||
- **NO co-author trailer.** No `Co-Authored-By`, no `Generated with ...`. Ever.
|
- **NO co-author trailer.** No `Co-Authored-By`, no `Generated with ...`. Ever.
|
||||||
- **Short commits:** subject line + max 2 lines of body. Split into atomic commits
|
- **Short commits:** subject line + max 2 lines of body. Split into atomic commits
|
||||||
rather than writing long bodies.
|
rather than writing long bodies.
|
||||||
|
|||||||
@@ -1,24 +1,14 @@
|
|||||||
package com.m57.hermescontrol.ui.common
|
package com.m57.hermescontrol.ui.common
|
||||||
|
|
||||||
import androidx.compose.animation.core.RepeatMode
|
|
||||||
import androidx.compose.animation.core.animateFloat
|
|
||||||
import androidx.compose.animation.core.infiniteRepeatable
|
|
||||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
|
||||||
import androidx.compose.animation.core.tween
|
|
||||||
import androidx.compose.foundation.background
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.layout.width
|
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Inbox
|
import androidx.compose.material.icons.filled.Inbox
|
||||||
import androidx.compose.material.icons.filled.Refresh
|
import androidx.compose.material.icons.filled.Refresh
|
||||||
@@ -29,16 +19,12 @@ import androidx.compose.material3.MaterialTheme
|
|||||||
import androidx.compose.material3.OutlinedButton
|
import androidx.compose.material3.OutlinedButton
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
|
||||||
import androidx.compose.ui.graphics.Color
|
|
||||||
import androidx.compose.ui.graphics.vector.ImageVector
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.m57.hermescontrol.theme.LocalSpacing
|
import com.m57.hermescontrol.theme.LocalSpacing
|
||||||
import com.m57.hermescontrol.theme.Motion
|
|
||||||
|
|
||||||
// Unified loading / error / empty / skeleton placeholders so every screen
|
// Unified loading / error / empty / skeleton placeholders so every screen
|
||||||
// shares the same visual language.
|
// shares the same visual language.
|
||||||
@@ -59,74 +45,6 @@ fun LoadingState(modifier: Modifier = Modifier) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Skeleton Shimmer ──────────────────────────────────────────────────
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shimmer placeholder for list-based loading states.
|
|
||||||
* Shows animated placeholder cards while real data loads.
|
|
||||||
*
|
|
||||||
* @param itemCount number of skeleton rows to show
|
|
||||||
*/
|
|
||||||
@Composable
|
|
||||||
fun SkeletonList(
|
|
||||||
itemCount: Int = 6,
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
) {
|
|
||||||
val spacing = LocalSpacing.current
|
|
||||||
val infiniteTransition = rememberInfiniteTransition(label = "shimmer")
|
|
||||||
val shimmerAlpha by infiniteTransition.animateFloat(
|
|
||||||
initialValue = 0.3f,
|
|
||||||
targetValue = 0.7f,
|
|
||||||
animationSpec =
|
|
||||||
infiniteRepeatable(
|
|
||||||
animation = tween(Motion.NORMAL * 2),
|
|
||||||
repeatMode = RepeatMode.Reverse,
|
|
||||||
),
|
|
||||||
label = "shimmerAlpha",
|
|
||||||
)
|
|
||||||
val skeletonColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = shimmerAlpha)
|
|
||||||
|
|
||||||
LazyColumn(
|
|
||||||
modifier = modifier.fillMaxSize(),
|
|
||||||
contentPadding = PaddingValues(horizontal = spacing.md, vertical = spacing.sm),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(spacing.sm),
|
|
||||||
) {
|
|
||||||
items(itemCount) {
|
|
||||||
SkeletonCard(skeletonColor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
private fun SkeletonCard(baseColor: Color) {
|
|
||||||
Column(
|
|
||||||
modifier =
|
|
||||||
Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.clip(RoundedCornerShape(12.dp))
|
|
||||||
.background(baseColor)
|
|
||||||
.padding(16.dp),
|
|
||||||
) {
|
|
||||||
Box(
|
|
||||||
modifier =
|
|
||||||
Modifier
|
|
||||||
.width(180.dp)
|
|
||||||
.height(16.dp)
|
|
||||||
.clip(RoundedCornerShape(4.dp))
|
|
||||||
.background(baseColor.copy(alpha = baseColor.alpha + 0.1f)),
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.height(8.dp))
|
|
||||||
Box(
|
|
||||||
modifier =
|
|
||||||
Modifier
|
|
||||||
.fillMaxWidth(0.7f)
|
|
||||||
.height(12.dp)
|
|
||||||
.clip(RoundedCornerShape(4.dp))
|
|
||||||
.background(baseColor.copy(alpha = baseColor.alpha + 0.05f)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Error ──────────────────────────────────────────────────────────────
|
// ── Error ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
Reference in new issue
Block a user