feat: Windows support - auto-update system + proper app icon
Some checks failed
CI / run (push) Has been cancelled
Some checks failed
CI / run (push) Has been cancelled
- PowerShell silent installer with UAC elevation - Smart asset detection (x64 priority for .exe) - Cross-platform restart after update - Auto-check updates on launch (5 sec delay) - Multi-layer .ico with 6 sizes (16-256px) - Windows build documentation added
This commit is contained in:
@@ -18,12 +18,73 @@ class RemoteVersionEntity with _$RemoteVersionEntity {
|
||||
@Default([]) List<ReleaseAsset> assets,
|
||||
}) = _RemoteVersionEntity;
|
||||
|
||||
String get presentVersion =>
|
||||
flavor == Environment.prod ? version : "$version ${flavor.name}";
|
||||
String get presentVersion => flavor == Environment.prod ? version : "$version ${flavor.name}";
|
||||
|
||||
/// Найти asset по расширению файла
|
||||
/// Найти asset по расширению файла с умным определением
|
||||
String? findAssetByExtension(String extension) {
|
||||
try {
|
||||
// Для Linux используем приоритет: .deb > .rpm > .AppImage
|
||||
if (extension == '.deb' || extension == '.rpm' || extension == '.AppImage') {
|
||||
final priorities = ['.deb', '.rpm', '.AppImage'];
|
||||
|
||||
for (final ext in priorities) {
|
||||
try {
|
||||
final asset = assets.firstWhere((asset) => asset.name.endsWith(ext));
|
||||
return asset.downloadUrl;
|
||||
} catch (_) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Для Windows - ищем .exe с приоритетом x64
|
||||
if (extension == '.exe') {
|
||||
// Сначала ищем x64 setup/installer
|
||||
for (final pattern in ['x64', 'amd64', 'win64', 'setup', 'installer']) {
|
||||
try {
|
||||
final asset = assets.firstWhere(
|
||||
(asset) => asset.name.toLowerCase().contains(pattern) && asset.name.endsWith('.exe'),
|
||||
);
|
||||
return asset.downloadUrl;
|
||||
} catch (_) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Если не нашли специфичный - берём любой .exe
|
||||
try {
|
||||
final asset = assets.firstWhere((asset) => asset.name.endsWith('.exe'));
|
||||
return asset.downloadUrl;
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Для macOS - ищем .dmg
|
||||
if (extension == '.dmg') {
|
||||
// Сначала ищем universal или arm64 (для M1/M2)
|
||||
for (final pattern in ['universal', 'arm64', 'apple-silicon']) {
|
||||
try {
|
||||
final asset = assets.firstWhere(
|
||||
(asset) => asset.name.toLowerCase().contains(pattern) && asset.name.endsWith('.dmg'),
|
||||
);
|
||||
return asset.downloadUrl;
|
||||
} catch (_) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Если не нашли - берём любой .dmg
|
||||
try {
|
||||
final asset = assets.firstWhere((asset) => asset.name.endsWith('.dmg'));
|
||||
return asset.downloadUrl;
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Для других расширений - прямой поиск
|
||||
return assets.firstWhere((asset) => asset.name.endsWith(extension)).downloadUrl;
|
||||
} catch (_) {
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user