Skip to content

Commit

Permalink
Merge pull request #511 from golos-blockchain/beta
Browse files Browse the repository at this point in the history
Beta
  • Loading branch information
Lex-Ai authored Nov 28, 2024
2 parents e180d41 + c8c9976 commit 148b545
Show file tree
Hide file tree
Showing 126 changed files with 3,535 additions and 389 deletions.
90 changes: 90 additions & 0 deletions CORDOVA.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Мобильное приложение GOLOS Блоги

Работает на Android.

```js
git clone https://github.com/golos-blockchain/ui-blogs
```

### Сборка приложения

Для сборки требуется **Linux** (например, Ubuntu 18 - 20).

1. Если у вас Linux современных версий (например **Ubuntu 20** или выше) - установите **Node.js 18** ([Windows](https://nodejs.org/dist/v18.20.5/node-v18.20.5-x64.msi), [Linux](https://github.com/nodesource/distributions/blob/master/README.md)).
Если у вас **Ubuntu 18** или иной старый Linux - установите **[Node.js 16](https://github.com/nodesource/distributions/blob/master/OLD_README.md#using-ubuntu-3)**.

2. Установите Android Studio.

3. Запустите Android Studio. Установите все, что будет предложено при установке.

4. Создайте пустое приложение Android (с любым Activity и конфигурацией), соберите его. Это нужно для проверки правильности установки Android Studio.

5. Запустите терминал.

6. Установите глобальные зависимости:
```sh
npx yarn global add [email protected]
```

7. Скачайте репозиторий с помощью git clone (команда есть выше), и зайдите в его папку с помощью:
```sh
cd ui-blogs
```

8. Внесите все **настройки** в файле `config/mobile.json`:

- site_domain (пример: golos.id то есть основной домен Блогов)
- images
- auth_service
- notify_service
- wallet_service
- messenger_service
- app_updater

9. Установите все зависимости (для сборки).

```sh
npx yarn install
```

10. Выполните команду (/root/ - это должен быть ваш путь к папке профиля, в ней лежит папка Android):
```sh
export ANDROID_SDK_ROOT=/root/Android/Sdk
```

11. Установка совместимой системы сборки.

Установите JDK (отдельно от Android Studio):
```sh
sudo apt-get install openjdk-8-jdk
```
После этого команда `javac -version` должна выдавать ответ вида: javac 1.8.x

Установите Gradle (отдельно от Android Studio):
```sh
sudo apt-get install gradle
```

Добавьте /root/Android/Sdk/platform-tools в переменную PATH (для adb, вспомогательное, для сборки не обязательно)

12. Откройте Android Studio, а из нее откройте SDK Manager (кнопка "☰" -> Tools -> SDK Manager). Установите Android build tools 30.0.3.
Для этого слева выбираете **Languages & Frameworks -> Android SDK**, во вкладках сверх выбираете **SDK Tools**, включаете **Show package details**, отключаете **Hide obsolete packages**, после чего выбираете нужную версию Build tools и нажимаете Apply для установки.

13. Если собираетесь автоматически устанавливать и запускать приложение (а не вручную, перекинув apk на устройство), то сделайте следующее. Подключите устройство по USB (разрешив отладку) и убедитесь, что adb видит его, выполнив в командной строке команду
```sh
adb devices
```

14. Соберите приложение.

```sh
npx yarn run build:mobile
```
Сборка происходит в два этапа - сначала собирается код React с помощью Webpack, затем на его основе собирается мобильное приложение с помощью Cordova.

Этап Cordova может выдавать ошибки, которые нужно устранить дополнительно.

В случае ошибки с требованием установить Build Tools нужной версии или иные компоненты, необходимо поступить как описано в пункте 12, выбрав нужную версию нужного компонента и установив. Затем снова попробовать собрать (используя при этом команду `npx yarn run postbuild:mobile`, чтобы не повторять этап Webpack, который уже выполнен).

В случае успешной сборки собранный APK будет в `cordova/platforms/android/app/build/outputs/apk/debug`
Кроме того, APK сразу же устанавливается на устройство. Об успешной установке свидетельствует сообщение `INSTALL SUCCESS`. Ошибка типа `"sh" ?? ?????` говорит о том, что устройство не обнаружено (например, проблемы с разъемом, кабелем).
160 changes: 118 additions & 42 deletions app/MainApp.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,49 @@ import renderApp from 'app/renderApp'
import golos from 'golos-lib-js'
import tt from 'counterpart'

import { openAppSettings } from 'app/components/pages/app/AppSettings'
import * as api from 'app/utils/APIWrapper'
import getState from 'app/utils/StateBuilder'
import { checkUpdates } from './appUpdater'
import { addShortcut } from 'app/utils/app/ShortcutUtils'
import { checkUpdates } from 'app/utils/app/UpdateUtils'
import defaultCfg from 'app/app_cfg'
require('app/cookieHelper')

const appConfig = window.appSettings.load()
let appConfig
if (process.env.MOBILE_APP) {
console.log('Loading app config...')
let cfg = localStorage.getItem('app_settings')
if (cfg) {
try {
cfg = JSON.parse(cfg)
// Add here migrations
cfg = { ...defaultCfg, ...cfg }
} catch (err) {
console.error('Cannot parse app_settings', err)
cfg = defaultCfg
}
} else {
cfg = defaultCfg
}
if (!cfg.ws_connection_client) {
cfg.ws_connection_client = cfg.ws_connection_app[0].address
}
if (cfg.images.use_img_proxy === undefined) {
cfg.images.use_img_proxy = true
}
cfg.app_version = defaultCfg.app_version
appConfig = cfg
} else {
appConfig = window.appSettings.load()
}

const initialState = {
offchain: {
config: {
...appConfig,
blocked_users: [],
blocked_posts: [],
filter_apps: [],
add_notify_site: {}
},
flash: {
Expand All @@ -27,60 +57,106 @@ window.$STM_Config = initialState.offchain.config
window.$STM_csrf = null // not used in app

function closeSplash() {
if (window.appSplash)
window.appSplash.contentLoaded()
try {
if (process.env.MOBILE_APP) {
navigator.splashscreen.hide()
} else {
window.appSplash.contentLoaded()
}
} catch (err) {
console.error('closeSplash', err)
}
}

const isSettings = () => {
return window.location.hash === '#app-settings' ||
window.location.pathname === '/__app_settings'
}

function showNodeError() {
alert(tt('app_settings.node_error_NODE', { NODE: $STM_Config.ws_connection_client }))
if (isSettings()) return
if (confirm(tt('app_settings.node_error_new_NODE', { NODE: $STM_Config.ws_connection_client })
+ ' ' + tt('app_settings.node_error_new_NODE2') + '?')) {
openAppSettings()
}
}

const showError = (err, label = '') => {
if (!process.env.MOBILE_APP) return
alert(label + ' error:\n'
+ (err && err.toString()) + '\n'
+ (err && JSON.stringify(err.stack))
)
}

async function initState() {
// these are need for getState
await golos.importNativeLib();
const config = initialState.offchain.config
golos.config.set('websocket', config.ws_connection_client)
if (config.chain_id)
golos.config.set('chain_id', config.chain_id)

const { pathname } = window.location
if (pathname.startsWith('/__app_')) {
return {
content: {}
try {
// these are need for getState
await golos.importNativeLib();
const config = initialState.offchain.config
golos.config.set('websocket', config.ws_connection_client)
if (config.chain_id)
golos.config.set('chain_id', config.chain_id)

const { pathname } = window.location
if (pathname.startsWith('/__app_')) {
return {
content: {}
}
}
}

let splashTimeout = setTimeout(() => {
closeSplash()
showNodeError()
}, 30000)
// First add - for case if all failed at all, and not rendering
if (process.env.MOBILE_APP) {
await addShortcut({
id: 'the_settings',
shortLabel: 'Настройки',
longLabel: 'Настройки',
hash: '#app-settings'
})
}

let splashTimeout = setTimeout(() => {
closeSplash()
showNodeError()
}, 30000)

const doUpdate = Math.random() > 0.7
if (doUpdate) {
try {
$STM_Config.add_notify_site = await checkUpdates()
} catch (err) {
console.error('Cannot check updates', err)
clearTimeout(splashTimeout)
closeSplash()
alert('Cannot check updates' + err)
//showError(err, 'Cannot check updates')
}
}

let onchain
let nodeError = null
try {
onchain = await getState(api, pathname, initialState.offchain)
} catch (error) {
nodeError = error
}

try {
$STM_Config.add_notify_site = await checkUpdates()
} catch (err) {
console.error('Cannot check updates', err)
clearTimeout(splashTimeout)
closeSplash()
alert('Cannot check updates' + err)
}

let onchain
let nodeError = null
try {
onchain = await getState(api, pathname, initialState.offchain)
} catch (error) {
nodeError = error
}

clearTimeout(splashTimeout)
closeSplash()
if (nodeError) {
showNodeError()
throw nodeError
}

if (nodeError) {
showNodeError()
throw nodeError
return onchain
} catch (err) {
if (isSettings()) {
console.error(err)
return
}
showError(err, 'initState')
}

return onchain
}

initState().then((onchain) => {
Expand Down
79 changes: 79 additions & 0 deletions app/app_cfg.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* Only Mobile. Generated automatically. Do not edit. */
module.exports = {
"app_version": "1.5.0",
"ws_connection_app": [
{
"address": "wss://apibeta.golos.today/ws"
},
{
"address": "wss://api.golos.id/ws"
},
{
"address": "wss://api.aleksw.space/ws"
},
{
"address": "wss://api-golos.blckchnd.com/ws"
}
],
"ws_connection_exchange": "wss://apibeta.golos.today/ws",
"logo": {
"icon": "https://i.imgur.com/Q7GCdPf.png",
"title": "https://i.imgur.com/36zv8We.png"
},
"images": {
"img_proxy_prefix": "https://devimages.golos.today",
"img_proxy_backup_prefix": "https://steemitimages.com",
"upload_image": "https://api.imgur.com/3/image",
"client_id": "6c09ebf8c548126"
},
"wallet_service": {
"host": "https://devwallet.golos.today"
},
"messenger_service": {
"host": "https://devchat.golos.app"
},
"auth_service": {
"host": "https://dev.golos.app",
"custom_client": "blogs"
},
"notify_service": {
"host": "https://devnotify.golos.app",
"host_ws": "wss://devnotify.golos.app/ws"
},
"elastic_search": {
"url": "https://search.golos.today",
"login": "golosclient",
"password": "golosclient"
},
"apidex_service": {
"host": "https://devapi-dex.golos.app",
"host_local": "https://devapi-dex.golos.app"
},
"app_updater": {
"host": "https://devfiles.golos.app"
},
"forums": {
"white_list": [
"fm-golostalk",
"fm-prizmtalk",
"fm-graphenetalks"
],
"fm-golostalk": {
"domain": "golostalk.com"
},
"fm-prizmtalk": {
"domain": "prizmtalk.com"
},
"fm-graphenetalks": {
"domain": "forum.gph.ai"
}
},
"hidden_assets": {
"RUDEX": true,
"PRIZM": true,
"DOGECOIN": true,
"YMZEC": true,
"YMWMZ": true,
"YMBTC": true
}
}
13 changes: 13 additions & 0 deletions app/assets/icons/badge-new-nobg.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions app/assets/icons/badge-new.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/images/app/android48x48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 148b545

Please sign in to comment.