mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-03-13 22:46:02 +00:00
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { useCallback, useEffect, useState } from 'react';
|
|
import { Platform } from 'react-native';
|
|
import { mmkvStorage } from '../services/mmkvStorage';
|
|
import * as Updates from 'expo-updates';
|
|
import { getDisplayedAppVersion } from '../utils/version';
|
|
import { fetchLatestGithubRelease, isAnyUpgrade } from '../services/githubReleaseService';
|
|
|
|
const DISMISSED_KEY = '@github_major_update_dismissed_version';
|
|
|
|
import { GithubReleaseInfo } from '../services/githubReleaseService';
|
|
|
|
export interface MajorUpdateData {
|
|
visible: boolean;
|
|
latestTag?: string;
|
|
releaseNotes?: string;
|
|
releaseUrl?: string;
|
|
releaseData?: GithubReleaseInfo;
|
|
onDismiss: () => void;
|
|
onLater: () => void;
|
|
refresh: () => void;
|
|
}
|
|
|
|
export function useGithubMajorUpdate(): MajorUpdateData {
|
|
const [visible, setVisible] = useState(false);
|
|
const [latestTag, setLatestTag] = useState<string | undefined>();
|
|
const [releaseNotes, setReleaseNotes] = useState<string | undefined>();
|
|
const [releaseUrl, setReleaseUrl] = useState<string | undefined>();
|
|
const [releaseData, setReleaseData] = useState<GithubReleaseInfo | undefined>();
|
|
|
|
const check = useCallback(async () => {
|
|
if (Platform.OS === 'ios') return;
|
|
try {
|
|
// Check if major update alerts are disabled
|
|
const majorAlertsEnabled = await mmkvStorage.getItem('@major_updates_alerts_enabled');
|
|
if (majorAlertsEnabled === 'false') {
|
|
return; // Major update alerts are disabled by user
|
|
}
|
|
|
|
// Always compare with Settings screen version
|
|
const current = getDisplayedAppVersion() || Updates.runtimeVersion || '0.0.0';
|
|
const info = await fetchLatestGithubRelease();
|
|
if (!info?.tag_name) return;
|
|
|
|
const dismissed = await mmkvStorage.getItem(DISMISSED_KEY);
|
|
if (dismissed === info.tag_name) return;
|
|
|
|
// "Later" is session-only now, no persisted snooze
|
|
|
|
const shouldShow = isAnyUpgrade(current, info.tag_name);
|
|
if (shouldShow) {
|
|
setLatestTag(info.tag_name);
|
|
setReleaseNotes(info.body);
|
|
setReleaseUrl(info.html_url);
|
|
setReleaseData(info);
|
|
setVisible(true);
|
|
}
|
|
} catch {
|
|
// ignore
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
check();
|
|
}, [check]);
|
|
|
|
const onDismiss = useCallback(async () => {
|
|
if (latestTag) await mmkvStorage.setItem(DISMISSED_KEY, latestTag);
|
|
setVisible(false);
|
|
}, [latestTag]);
|
|
|
|
const onLater = useCallback(async () => {
|
|
setVisible(false);
|
|
}, []);
|
|
|
|
return { visible, latestTag, releaseNotes, releaseUrl, releaseData, onDismiss, onLater, refresh: check };
|
|
}
|
|
|
|
|