- API: GET /app/android/latest reads the latest Gitea release (ANDROID_RELEASES_URL, optional token for a private repo) with the APK's SHA-256 from SHA256SUMS; GET /app/android/apk/:name streams that APK. - App (modules/updater): downloads in the background, checks the SHA-256, and installs through PackageInstaller: quietly once when leaving the app (Android 12+), otherwise from the feed banner or Settings > App version. F-Droid builds leave it out and drop the install permissions. - CI: the release notes come from the fastlane changelog; the app shows the part above ---. - Settings: Create-account and Link Spotify buttons for Last.fm and ListenBrainz. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
import { StyleSheet } from 'react-native';
|
|
import { installUpdate, updaterAvailable, useUpdateState } from '@/lib/updates';
|
|
import { Body, Button, Card, Heading } from './ui';
|
|
|
|
/** "Update ready" on the feed, once a newer version has downloaded (lib/updates.ts). */
|
|
export function UpdateBanner() {
|
|
const state = useUpdateState();
|
|
if (!updaterAvailable || (state.status !== 'ready' && state.status !== 'installing')) return null;
|
|
return (
|
|
<Card highlighted>
|
|
<Heading>musicshare {state.update.version} is ready</Heading>
|
|
{state.update.notes ? (
|
|
<Body muted style={styles.notes} numberOfLines={4}>
|
|
{state.update.notes}
|
|
</Body>
|
|
) : null}
|
|
<Button
|
|
small
|
|
variant="primary"
|
|
title={state.status === 'installing' ? 'Installing…' : 'Install update'}
|
|
disabled={state.status === 'installing'}
|
|
onPress={() => installUpdate(true)}
|
|
style={styles.button}
|
|
/>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
notes: { fontSize: 13 },
|
|
button: { alignSelf: 'flex-start' },
|
|
});
|