diff --git a/build.py b/build.py index bd9fe7e..7faf658 100644 --- a/build.py +++ b/build.py @@ -71,7 +71,8 @@ def update_version_in_expo(version: str): def main(): - API_URL = 'http://192.168.1.101:5000/application' + #API_URL = 'http://192.168.1.101:5000/application' + API_URL = 'https://assemblr.denco.store/application' API_KEY = 'AF9A20DD9264C134CDA0ADACED834368' APPLICATION_NAME = 'assemblr' diff --git a/src/api/apiClient.ts b/src/api/apiClient.ts index 2b93087..20ad3a9 100644 --- a/src/api/apiClient.ts +++ b/src/api/apiClient.ts @@ -3,10 +3,10 @@ import * as SecureStore from 'expo-secure-store'; import {useDispatch} from "react-redux"; import {logout} from "../features/auth/authSlice"; import {store} from "../redux/store"; - +export const baseUrl = 'https://assemblr.denco.store'; +// export const baseUrl = 'http://192.168.1.101:5000'; const apiClient = axios.create({ - // baseURL: 'https://assemblr.denco.store', - baseURL: 'http://192.168.1.101:5000', + baseURL: baseUrl }); apiClient.interceptors.request.use(async (config) => { diff --git a/src/api/applicationApi.ts b/src/api/applicationApi.ts index c0bc4ce..6190e7c 100644 --- a/src/api/applicationApi.ts +++ b/src/api/applicationApi.ts @@ -1,4 +1,11 @@ -import apiClient from "./apiClient"; +import apiClient, {baseUrl} from "./apiClient"; +import * as FileSystem from 'expo-file-system'; +import { + DownloadProgressData, + FileSystemDownloadResult, + FileSystemNetworkTaskProgressCallback +} from "expo-file-system"; + const router = '/application'; const api_key = 'AF9A20DD9264C134CDA0ADACED834368'; @@ -7,12 +14,8 @@ const applicationApi = { let response = await apiClient.get(`${router}/${name}/version`, {headers: {Authorization: api_key}}); return response.data; }, - download: async (name: string, version: string): Promise => { - let response = await apiClient.get(`${router}/${name}/download/${version}`, { - headers: {Authorization: api_key}, - responseType: "arraybuffer" - }); - return response.data; + download: async (fileUri: string, name: string, version: string, callback: FileSystemNetworkTaskProgressCallback): Promise => { + return FileSystem.createDownloadResumable(`${baseUrl}${router}/${name}/download/${version}`, fileUri, {headers: {Authorization: api_key}}, callback).downloadAsync(); } } diff --git a/src/components/Modals/LoadingModal/LoadingModal.tsx b/src/components/Modals/LoadingModal/LoadingModal.tsx index a2ec0dc..f91545a 100644 --- a/src/components/Modals/LoadingModal/LoadingModal.tsx +++ b/src/components/Modals/LoadingModal/LoadingModal.tsx @@ -10,19 +10,20 @@ import * as Progress from 'react-native-progress'; import {RFPercentage} from "react-native-responsive-fontsize"; const LoadingModal: FC = () => { - const isVisible = useSelector((state: RootState) => state.loadingModal.isVisible); - const loadingText = useSelector((state: RootState) => state.loadingModal.loadingText); + const state = useSelector((state: RootState) => state.loadingModal); const [ch, sCh] = useState(false); return ( - + - {loadingText} + {state.loadingText} diff --git a/src/features/loadingModal/loadingModalSlice.ts b/src/features/loadingModal/loadingModalSlice.ts index c054705..8642b31 100644 --- a/src/features/loadingModal/loadingModalSlice.ts +++ b/src/features/loadingModal/loadingModalSlice.ts @@ -1,13 +1,17 @@ -import {createSlice} from "@reduxjs/toolkit"; +import {createSlice, PayloadAction} from "@reduxjs/toolkit"; export interface LoadingModalState { isVisible: boolean; - loadingText: string + loadingText: string; + indeterminate: boolean; + progress: number; } const initialState: LoadingModalState = { isVisible: false, - loadingText: "Подождите..." + loadingText: "Подождите...", + indeterminate: true, + progress: 0 } export const loadingModalSlice = createSlice({ @@ -22,9 +26,24 @@ export const loadingModalSlice = createSlice({ }, setLoadingText: (state, action) => { state.loadingText = action.payload; + }, + setProgress: (state, action: PayloadAction) => { + state.progress = action.payload; + }, + setIndeterminate: (state, action: PayloadAction) => { + state.indeterminate = action.payload; + }, + reset: (state) => { + state = initialState; } } }) -export const {openLoadingModal, closeLoadingModal, setLoadingText} = loadingModalSlice.actions; +export const { + openLoadingModal, + closeLoadingModal, + setLoadingText, + setProgress, + setIndeterminate +} = loadingModalSlice.actions; export default loadingModalSlice.reducer; \ No newline at end of file diff --git a/src/screens/CommonPage/CommonPage.tsx b/src/screens/CommonPage/CommonPage.tsx index 6b8b989..7da5c62 100644 --- a/src/screens/CommonPage/CommonPage.tsx +++ b/src/screens/CommonPage/CommonPage.tsx @@ -23,6 +23,13 @@ import * as FileSystem from 'expo-file-system'; import applicationApi from "../../api/applicationApi"; import {ActivityAction, startActivityAsync} from "expo-intent-launcher"; import {RenderTargetOptions} from "@shopify/flash-list"; +import KeyEvent from 'react-native-keyevent'; +import { + openLoadingModal, + setIndeterminate, + setLoadingText, + setProgress +} from "../../features/loadingModal/loadingModalSlice"; function CommonPage() { const dim = useSelector((state: RootState) => state.interface.dim); @@ -56,54 +63,33 @@ function CommonPage() { const checkUpdates = async () => { - - return; - // // - // let packageName = Constants.manifest2?.extra?.expoClient?.android?.package; // Замените на имя пакета вашего приложения - // const uri = `package:${packageName}`; - // startActivityAsync('android.settings.MANAGE_UNKNOWN_APP_SOURCES', { - // data: uri - // }).then(result => { - // console.log(result); - // }).catch(error => { - // console.log(error); - // }); - // return - const currentVersion = Constants.manifest2?.extra?.expoClient?.version; + const currentVersion = Constants.manifest2?.extra?.expoClient?.version applicationApi.getVersion('assemblr').then(({latest_version}) => { + if (currentVersion == latest_version) return; + dispatch(setIndeterminate(false)); + dispatch(setLoadingText("Загрузка обновления...")); + dispatch(setProgress(0)); + dispatch(openLoadingModal()); + const apkPath = FileSystem.documentDirectory + "test.apk"; - FileSystem.downloadAsync('http://192.168.1.101:5000/application/assemblr/download/1.1.8', apkPath).then(downloadResult => { + applicationApi.download(apkPath, 'assemblr', latest_version, data => { + dispatch(setProgress(data.totalBytesWritten / data.totalBytesExpectedToWrite)); + }).then(() => { FileSystem.getContentUriAsync(apkPath).then(localUri => { - try { - startActivityAsync('android.intent.action.INSTALL_PACKAGE', { - data: localUri, - flags: 1 - }).then(result => { - console.log(result); - }).catch(error => { - console.log(error); - }); - } catch (ex) { - console.log(ex); - } - + startActivityAsync('android.intent.action.INSTALL_PACKAGE', { + data: localUri, + flags: 1 + }) }) - }) - - }); } useEffect(() => { checkUpdates(); - //initialize(); }, []); return ( - - - {isAuthorized ? : } diff --git a/src/screens/LoginScreen/LoginScreen.tsx b/src/screens/LoginScreen/LoginScreen.tsx index 878f0e2..771a4f7 100644 --- a/src/screens/LoginScreen/LoginScreen.tsx +++ b/src/screens/LoginScreen/LoginScreen.tsx @@ -11,6 +11,7 @@ import {useDispatch} from "react-redux"; import {login} from "../../features/auth/authSlice"; import Toast from "react-native-toast-message"; import * as SecureStore from 'expo-secure-store'; +import KeyEvent from "react-native-keyevent"; function LoginScreen() { const dispatch = useAppDispatch(); @@ -33,6 +34,8 @@ function LoginScreen() { } + + useEffect(() => { }, []); return (