fix: version compatability check (#29405)

This commit is contained in:
Brandon Wees 2026-06-30 13:44:53 -05:00 committed by GitHub
parent deeb042a9e
commit d4b994301f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 14 deletions

View file

@ -1,6 +1,6 @@
import 'package:immich_mobile/utils/semver.dart';
String? getVersionCompatibilityMessage(SemVer serverVersion, SemVer appVersion) {
String? getVersionCompatibilityMessage({required SemVer serverVersion, required SemVer appVersion}) {
// Add latest compat info up top
// ensure mobile app major version is not behind server major version

View file

@ -91,7 +91,7 @@ class LoginForm extends HookConsumerWidget {
final packageInfo = await PackageInfo.fromPlatform();
final appSemVer = SemVer.fromString(packageInfo.version);
final serverSemVer = serverInfo.serverVersion;
warningMessage.value = getVersionCompatibilityMessage(appSemVer, serverSemVer);
warningMessage.value = getVersionCompatibilityMessage(serverVersion: serverSemVer, appVersion: appSemVer);
} catch (error) {
warningMessage.value = 'Error checking version compatibility';
}
@ -377,11 +377,21 @@ class LoginForm extends HookConsumerWidget {
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: context.isDarkTheme ? Colors.red.shade700 : Colors.red.shade100,
borderRadius: const BorderRadius.all(Radius.circular(8)),
border: Border.all(color: context.isDarkTheme ? Colors.red.shade900 : Colors.red[200]!),
color: context.isDarkTheme ? Colors.amber.shade700 : Colors.amber.shade100,
borderRadius: const BorderRadius.all(Radius.circular(12)),
border: Border.all(color: context.isDarkTheme ? Colors.amber.shade800 : Colors.amber[200]!, width: 2),
),
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(Icons.warning_amber_rounded, color: Colors.amber.shade800),
const SizedBox(width: 8),
Expanded(
child: Padding(padding: const EdgeInsets.only(top: 2), child: Text(warningMessage.value!)),
),
],
),
child: Text(warningMessage.value!, textAlign: TextAlign.center),
),
);
}

View file

@ -9,16 +9,16 @@ void main() {
test('returns message when app major is behind server major', () {
final result = getVersionCompatibilityMessage(
const SemVer(major: 2, minor: 0, patch: 0),
const SemVer(major: 1, minor: 200, patch: 0),
serverVersion: const SemVer(major: 2, minor: 0, patch: 0),
appVersion: const SemVer(major: 1, minor: 200, patch: 0),
);
expect(result, message);
});
test('returns null when app major matches server major', () {
final result = getVersionCompatibilityMessage(
const SemVer(major: 2, minor: 0, patch: 0),
const SemVer(major: 2, minor: 0, patch: 0),
serverVersion: const SemVer(major: 2, minor: 0, patch: 0),
appVersion: const SemVer(major: 2, minor: 0, patch: 0),
);
expect(result, null);
});
@ -30,16 +30,16 @@ void main() {
test('returns message when app major is more than one ahead of server', () {
final result = getVersionCompatibilityMessage(
const SemVer(major: 1, minor: 200, patch: 0),
const SemVer(major: 3, minor: 0, patch: 0),
serverVersion: const SemVer(major: 1, minor: 200, patch: 0),
appVersion: const SemVer(major: 3, minor: 0, patch: 0),
);
expect(result, message);
});
test('returns null when app major is exactly one ahead of server', () {
final result = getVersionCompatibilityMessage(
const SemVer(major: 1, minor: 200, patch: 0),
const SemVer(major: 2, minor: 0, patch: 0),
serverVersion: const SemVer(major: 1, minor: 200, patch: 0),
appVersion: const SemVer(major: 2, minor: 0, patch: 0),
);
expect(result, null);
});