Skip to content

Commit

Permalink
feature/add_pinia (#52)
Browse files Browse the repository at this point in the history
* feat: Added composable log

* feat: Added composable rpc

* feat Added composable setProperty

* feat: Added composable showNotif

* feat: Pinia is installed

* feat: Added a new route

* feat: Created plugin for stores

* feat: Created store main

* feat: Added store apps

* refactor: showNotif translated to import

---------

Co-authored-by: Maxim Lyubimov <[email protected]>
  • Loading branch information
mlyubimov and mlyubimov authored Nov 15, 2023
1 parent f11253c commit ad9d750
Show file tree
Hide file tree
Showing 26 changed files with 1,446 additions and 1,297 deletions.
3 changes: 3 additions & 0 deletions frontend/jsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
"composables/*": [
"src/composables/*"
],
"stores/*": [
"src/stores/*"
],
"vue$": [
"node_modules/vue/dist/vue.runtime.esm-bundler.js"
]
Expand Down
1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"loglevel": "^1.8.0",
"nanoevents": "^6.0.2",
"pako": "^2.0.4",
"pinia": "^2.1.7",
"prettier": "^3.0.3",
"protobufjs": "~6.11.2",
"quasar": "^2.7.1",
Expand Down
7 changes: 3 additions & 4 deletions frontend/src/components/PixelEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,11 @@
</template>

<script setup>
import { ref, defineEmits, defineExpose, computed, watch, onMounted } from 'vue'
import { ref, defineExpose, computed, watch, onMounted } from 'vue'
import PixelEditor from '../util/pixeleditor/pixeleditor'
import DitherDialog from 'src/components/DitherDialog.vue'
import { exportFile } from 'quasar'
const emit = defineEmits(['showNotif'])
import showNotif from 'composables/useShowNotif'
const flags = ref({
checkerboard: false,
Expand Down Expand Up @@ -242,7 +241,7 @@ const download = async () => {
const status = exportFile(`Paint_${new Date().toISOString()}.png`, blob)
if (!status) {
console.error('Failed to download image: permission denied')
emit('showNotif', {
showNotif({
message: 'Failed to download image: permission denied',
color: 'negative'
})
Expand Down
21 changes: 10 additions & 11 deletions frontend/src/components/SearchBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,13 @@
</template>

<script setup>
import { ref, defineProps, defineEmits, watch } from 'vue'
import { ref, watch, computed } from 'vue'
import { fetchAppsShort } from '../util/util'
const props = defineProps({
sdk: Object
})
import { useAppsStore } from 'src/stores/apps'
const appsStore = useAppsStore()
const emit = defineEmits(['openApp'])
const sdk = computed(() => appsStore.sdk)
const flags = ref({
loading: false
Expand All @@ -74,13 +73,13 @@ watch(text, async (newValue) => {
query: newValue
}
if (props.sdk.target || props.sdk.api) {
if (sdk.value.target || sdk.value.api) {
delete params.is_latest_release_version
if (props.sdk.target) {
params.target = props.sdk.target
if (sdk.value.target) {
params.target = sdk.value.target
}
if (props.sdk.api) {
params.api = props.sdk.api
if (sdk.value.api) {
params.api = sdk.value.api
}
}
Expand All @@ -97,7 +96,7 @@ watch(text, async (newValue) => {
})
const itemClicked = (app) => {
emit('openApp', app)
appsStore.openApp(app)
text.value = ''
}
</script>
Expand Down
126 changes: 59 additions & 67 deletions frontend/src/components/Updater.vue
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
>Install</q-btn>
</div>
<q-btn
v-if="installFromFile && flags.uploadEnabled"
v-if="mainFlags.installFromFile && flags.uploadEnabled"
@click="flags.uploadPopup = true; uploadedFile = null"
class="q-mt-lg"
outline
Expand Down Expand Up @@ -102,21 +102,25 @@
</template>

<script setup>
import { ref, defineProps, defineEmits, watch, onMounted } from 'vue'
import { ref, defineEmits, watch, onMounted, computed } from 'vue'
import ProgressBar from './ProgressBar.vue'
import { fetchChannels, fetchFirmware, fetchRegions, unpack } from '../util/util'
import semver from 'semver'
import asyncSleep from 'simple-async-sleep'
import { PB } from '../flipper-js/protobufCompiled'
import { log } from 'composables/useLog'
import showNotif from 'composables/useShowNotif'
import { rpcErrorHandler } from 'composables/useRpcUtils'
const props = defineProps({
flipper: Object,
rpcActive: Boolean,
info: Object,
installFromFile: Boolean
})
import { useMainStore } from 'src/stores/main'
const mainStore = useMainStore()
const mainFlags = computed(() => mainStore.flags)
const flipper = computed(() => mainStore.flipper)
const emit = defineEmits(['log', 'update', 'showNotif', 'toggleMicroSDcardMissingDialog'])
const info = computed(() => mainStore.info)
const emit = defineEmits(['update'])
const componentName = 'Updater'
const flags = ref({
Expand Down Expand Up @@ -157,13 +161,13 @@ watch(fwModel, (newModel) => {
})
const update = async (fromFile) => {
if (!props.info.storage.sdcard.status.isInstalled) {
emit('toggleMicroSDcardMissingDialog', true)
if (!info.value.storage.sdcard.status.isInstalled) {
mainStore.toggleFlag('microSDcardMissingDialog', true)
return
}
flags.value.updateInProgress = true
emit('update', 'start')
emit('log', {
log({
level: 'info',
message: `${componentName}: Update started`
})
Expand All @@ -179,7 +183,7 @@ const update = async (fromFile) => {
updateStage.value = 'Wrong file format'
throw new Error('Wrong file format')
}
emit('log', {
log({
level: 'info',
message: `${componentName}: Uploading firmware from file`
})
Expand All @@ -188,11 +192,11 @@ const update = async (fromFile) => {
.catch(error => {
flags.value.updateError = true
updateStage.value = error
emit('showNotif', {
showNotif({
message: error.toString(),
color: 'negative'
})
emit('log', {
log({
level: 'error',
message: `${componentName}: ${error.toString()}`
})
Expand All @@ -203,14 +207,14 @@ const update = async (fromFile) => {
const loadFirmware = async (fromFile) => {
updateStage.value = 'Loading firmware bundle...'
if (props.info.hardware.region !== '0' || flags.value.overrideDevRegion) {
if (info.value.hardware.region !== '0' || flags.value.overrideDevRegion) {
const regions = await fetchRegions()
.catch(error => {
emit('showNotif', {
showNotif({
message: 'Failed to fetch regional update information',
color: 'negative'
})
emit('log', {
log({
level: 'error',
message: `${componentName}: Failed to fetch regional update information: ${error.toString()}`
})
Expand Down Expand Up @@ -240,7 +244,7 @@ const loadFirmware = async (fromFile) => {
options.bands.push(message)
}
emit('log', {
log({
level: 'debug',
message: `${componentName}: Region provisioning message: ${JSON.stringify(options)}`
})
Expand All @@ -249,10 +253,10 @@ const loadFirmware = async (fromFile) => {
const message = PB.Region.create(options)
const encoded = new Uint8Array(PB.Region.encodeDelimited(message).finish()).slice(1)
await props.flipper.RPC('storageWrite', { path: '/int/.region_data', buffer: encoded })
await flipper.value.RPC('storageWrite', { path: '/int/.region_data', buffer: encoded })
.catch(error => rpcErrorHandler(error, 'storageWrite'))
emit('log', {
log({
level: 'info',
message: `${componentName}: Set Sub-GHz region: ${regions.country}`
})
Expand All @@ -265,18 +269,18 @@ const loadFirmware = async (fromFile) => {
.catch(error => {
flags.value.updateError = true
updateStage.value = error
emit('showNotif', {
showNotif({
message: 'Failed to fetch firmware: ' + error.toString(),
color: 'negative'
})
emit('log', {
log({
level: 'error',
message: `${componentName}: Failed to fetch firmware: ${error.toString()}`
})
throw error
})
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: Downloaded firmware from ${channels.value[fwModel.value.value].url}`
})
Expand All @@ -285,29 +289,29 @@ const loadFirmware = async (fromFile) => {
const buffer = await uploadedFile.value.arrayBuffer()
files = await unpack(buffer)
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: Unpacked firmware`
})
})
}
updateStage.value = 'Loading firmware files'
emit('log', {
log({
level: 'info',
message: `${componentName}: Loading firmware files`
})
let path = '/ext/update/'
await props.flipper.RPC('storageStat', { path: '/ext/update' })
await flipper.value.RPC('storageStat', { path: '/ext/update' })
.catch(async error => {
if (error.toString() !== 'ERROR_STORAGE_NOT_EXIST') {
rpcErrorHandler(error, 'storageStat')
rpcErrorHandler(componentName, error, 'storageStat')
} else {
await props.flipper.RPC('storageMkdir', { path: '/ext/update' })
.catch(error => rpcErrorHandler(error, 'storageMkdir'))
await flipper.value.RPC('storageMkdir', { path: '/ext/update' })
.catch(error => rpcErrorHandler(componentName, error, 'storageMkdir'))
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: storageMkdir: /ext/update`
})
Expand All @@ -321,23 +325,23 @@ const loadFirmware = async (fromFile) => {
if (file.name.endsWith('/')) {
path = path.slice(0, -1)
}
await props.flipper.RPC('storageMkdir', { path })
.catch(error => rpcErrorHandler(error, 'storageMkdir'))
await flipper.value.RPC('storageMkdir', { path })
.catch(error => rpcErrorHandler(componentName, error, 'storageMkdir'))
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: storageMkdir: ${path}`
})
})
} else {
write.value.filename = file.name.slice(file.name.lastIndexOf('/') + 1)
const unbind = props.flipper.emitter.on('storageWriteRequest/progress', e => {
const unbind = flipper.value.emitter.on('storageWriteRequest/progress', e => {
write.value.progress = e.progress / e.total
})
await props.flipper.RPC('storageWrite', { path: '/ext/update/' + file.name, buffer: file.buffer })
.catch(error => rpcErrorHandler(error, 'storageWrite'))
await flipper.value.RPC('storageWrite', { path: '/ext/update/' + file.name, buffer: file.buffer })
.catch(error => rpcErrorHandler(componentName, error, 'storageWrite'))
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: storageWrite: /ext/update/${file.name}`
})
Expand All @@ -350,52 +354,52 @@ const loadFirmware = async (fromFile) => {
write.value.progress = 0
updateStage.value = 'Loading manifest...'
emit('log', {
log({
level: 'info',
message: `${componentName}: Loading update manifest`
})
await props.flipper.RPC('systemUpdate', { path: path + '/update.fuf' })
.catch(error => rpcErrorHandler(error, 'systemUpdate'))
await flipper.value.RPC('systemUpdate', { path: path + '/update.fuf' })
.catch(error => rpcErrorHandler(componentName, error, 'systemUpdate'))
.finally(() => {
emit('log', {
log({
level: 'debug',
message: `${componentName}: systemUpdate: OK`
})
})
updateStage.value = 'Update in progress, pay attention to your Flipper'
emit('log', {
log({
level: 'info',
message: `${componentName}: Rebooting Flipper`
})
await props.flipper.RPC('systemReboot', { mode: 'UPDATE' })
.catch(error => rpcErrorHandler(error, 'systemReboot'))
await flipper.value.RPC('systemReboot', { mode: 'UPDATE' })
.catch(error => rpcErrorHandler(componentName, error, 'systemReboot'))
} else {
flags.value.updateError = true
updateStage.value = 'Failed to fetch channel'
emit('showNotif', {
showNotif({
message: 'Unable to load firmware channel from the build server. Reload the page and try again.',
color: 'negative',
reloadBtn: true
})
emit('log', {
log({
level: 'error',
message: `${componentName}: Failed to fetch channel`
})
}
}
const compareVersions = () => {
if (semver.lt((props.info.protobuf.version.major + '.' + props.info.protobuf.version.minor) + '.0', '0.6.0')) {
if (semver.lt((info.value.protobuf.version.major + '.' + info.value.protobuf.version.minor) + '.0', '0.6.0')) {
flags.value.ableToUpdate = false
}
if (props.info.firmware.version) {
if (props.info.firmware.version !== 'unknown' && semver.valid(props.info.firmware.version)) {
if (semver.eq(props.info.firmware.version, channels.value.release.version)) {
if (info.value.firmware.version) {
if (info.value.firmware.version !== 'unknown' && semver.valid(info.value.firmware.version)) {
if (semver.eq(info.value.firmware.version, channels.value.release.version)) {
flags.value.outdated = false
} else if (semver.gt(props.info.firmware.version, channels.value.release.version)) {
} else if (semver.gt(info.value.firmware.version, channels.value.release.version)) {
flags.value.outdated = false
flags.value.aheadOfRelease = true
} else {
Expand All @@ -407,27 +411,15 @@ const compareVersions = () => {
}
}
const rpcErrorHandler = (error, command) => {
error = error.toString()
emit('showNotif', {
message: `RPC error in command '${command}': ${error}`,
color: 'negative'
})
emit('log', {
level: 'error',
message: `${componentName}: RPC error in command '${command}': ${error}`
})
}
onMounted(async () => {
channels.value = await fetchChannels(props.info.hardware.target)
channels.value = await fetchChannels(info.value.hardware.target)
.catch(error => {
emit('showNotif', {
showNotif({
message: 'Unable to load firmware channels from the build server. Reload the page and try again.',
color: 'negative',
reloadBtn: true
})
emit('log', {
log({
level: 'error',
message: `${componentName}: failed to fetch update channels`
})
Expand Down
Loading

0 comments on commit ad9d750

Please sign in to comment.