17
17
18
18
package ru.tech.imageresizershrinker.feature.scan_qr_code.presentation.components
19
19
20
+ import androidx.compose.animation.AnimatedContent
20
21
import androidx.compose.animation.core.animateIntAsState
21
22
import androidx.compose.foundation.background
23
+ import androidx.compose.foundation.layout.Arrangement
22
24
import androidx.compose.foundation.layout.Box
23
25
import androidx.compose.foundation.layout.BoxWithConstraints
24
26
import androidx.compose.foundation.layout.Column
@@ -31,24 +33,32 @@ import androidx.compose.foundation.layout.padding
31
33
import androidx.compose.foundation.layout.size
32
34
import androidx.compose.foundation.layout.width
33
35
import androidx.compose.foundation.shape.RoundedCornerShape
36
+ import androidx.compose.material.icons.Icons
37
+ import androidx.compose.material.icons.rounded.QrCode2
38
+ import androidx.compose.material3.Icon
34
39
import androidx.compose.material3.MaterialTheme
35
40
import androidx.compose.material3.Text
36
41
import androidx.compose.runtime.Composable
37
42
import androidx.compose.ui.Alignment
38
43
import androidx.compose.ui.Modifier
44
+ import androidx.compose.ui.graphics.Color
39
45
import androidx.compose.ui.layout.ContentScale
46
+ import androidx.compose.ui.res.stringResource
40
47
import androidx.compose.ui.text.style.TextAlign
41
48
import androidx.compose.ui.unit.dp
42
49
import androidx.compose.ui.unit.min
43
50
import dev.shreyaspatil.capturable.capturable
44
51
import dev.shreyaspatil.capturable.controller.CaptureController
52
+ import ru.tech.imageresizershrinker.core.resources.R
45
53
import ru.tech.imageresizershrinker.core.ui.theme.Typography
46
54
import ru.tech.imageresizershrinker.core.ui.theme.takeColorFromScheme
47
55
import ru.tech.imageresizershrinker.core.ui.utils.helper.rememberPrevious
48
56
import ru.tech.imageresizershrinker.core.ui.utils.provider.rememberLocalEssentials
49
57
import ru.tech.imageresizershrinker.core.ui.widget.image.Picture
58
+ import ru.tech.imageresizershrinker.core.ui.widget.modifier.container
50
59
import ru.tech.imageresizershrinker.core.ui.widget.other.BoxAnimatedVisibility
51
60
import ru.tech.imageresizershrinker.core.ui.widget.other.QrCode
61
+ import ru.tech.imageresizershrinker.core.ui.widget.text.AutoSizeText
52
62
53
63
@Composable
54
64
internal fun QrCodePreview (
@@ -87,8 +97,9 @@ internal fun QrCodePreview(
87
97
) {
88
98
val essentials = rememberLocalEssentials()
89
99
val previous = rememberPrevious(params)
90
- QrCode (
91
- content = params.content,
100
+
101
+ AnimatedContent (
102
+ targetState = params.content.isEmpty(),
92
103
modifier = Modifier
93
104
.padding(
94
105
top = if (params.imageUri != null ) 36 .dp else 0 .dp,
@@ -101,19 +112,50 @@ internal fun QrCodePreview(
101
112
.aspectRatio(1f )
102
113
} else Modifier
103
114
)
104
- .width(targetSize),
105
- heightRatio = params.heightRatio,
106
- type = params.type,
107
- enforceBlackAndWhite = params.enforceBlackAndWhite,
108
- cornerRadius = animateIntAsState(params.cornersSize).value.dp,
109
- onSuccess = {
110
- essentials.dismissToasts()
111
- },
112
- onFailure = {
113
- essentials.dismissToasts()
114
- if (previous != params) essentials.showFailureToast(it)
115
+ ) { isEmpty ->
116
+ if (isEmpty) {
117
+ Column (
118
+ verticalArrangement = Arrangement .Center ,
119
+ horizontalAlignment = Alignment .CenterHorizontally ,
120
+ modifier = Modifier
121
+ .container(
122
+ resultPadding = 0 .dp,
123
+ color = if (isLandscape) MaterialTheme .colorScheme.surfaceContainerLowest
124
+ else Color .Unspecified
125
+ )
126
+ .padding(12 .dp)
127
+ ) {
128
+ Icon (
129
+ imageVector = Icons .Rounded .QrCode2 ,
130
+ contentDescription = null ,
131
+ modifier = Modifier .size(targetSize / 3 )
132
+ )
133
+ Spacer (Modifier .height(4 .dp))
134
+ AutoSizeText (
135
+ text = stringResource(R .string.generated_barcode_will_be_here),
136
+ textAlign = TextAlign .Center ,
137
+ key = { it.length },
138
+ maxLines = 2
139
+ )
140
+ }
141
+ } else {
142
+ QrCode (
143
+ content = params.content,
144
+ modifier = Modifier .width(targetSize),
145
+ heightRatio = params.heightRatio,
146
+ type = params.type,
147
+ enforceBlackAndWhite = params.enforceBlackAndWhite,
148
+ cornerRadius = animateIntAsState(params.cornersSize).value.dp,
149
+ onSuccess = {
150
+ essentials.dismissToasts()
151
+ },
152
+ onFailure = {
153
+ essentials.dismissToasts()
154
+ if (previous != params) essentials.showFailureToast(it)
155
+ }
156
+ )
115
157
}
116
- )
158
+ }
117
159
118
160
BoxAnimatedVisibility (visible = params.description.isNotEmpty() && params.content.isNotEmpty()) {
119
161
MaterialTheme (
0 commit comments