aboutsummaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2021-04-07 20:45:57 +0300
committerHenry Jameson <me@hjkos.com>2021-04-07 20:45:57 +0300
commit4e56e64034ce1e153ab2bbe3432ada89bdce09cd (patch)
tree791cbd7cf3cc9452bbf9b3dbc67fb35ae550dd50 /src/services
parent2da37f15ab6a7e0c6088a6e5a0b2c2885f1cb85a (diff)
parent8b96ea93776fd1eb462a7c54822d4f8ad6a9e776 (diff)
Merge remote-tracking branch 'origin/develop' into better-selects
* origin/develop: (76 commits) Translated using Weblate (Italian) Translated using Weblate (Basque) Translated using Weblate (Spanish) Translated using Weblate (Chinese (Simplified)) Translated using Weblate (Italian) Translated using Weblate (Chinese (Traditional)) Translated using Weblate (Russian) Translated using Weblate (Italian) Translated using Weblate (French) Translated using Weblate (Russian) Translated using Weblate (Italian) Translated using Weblate (French) Translated using Weblate (Basque) Translated using Weblate (Spanish) Translated using Weblate (Chinese (Simplified)) Translated using Weblate (Japanese) Translated using Weblate (Italian) Translated using Weblate (Esperanto) Translated using Weblate (Chinese (Traditional)) Translated using Weblate (Norwegian Bokmål) ...
Diffstat (limited to 'src/services')
-rw-r--r--src/services/api/api.service.js6
-rw-r--r--src/services/backend_interactor_service/backend_interactor_service.js12
-rw-r--r--src/services/export_import/export_import.js55
-rw-r--r--src/services/notifications_fetcher/notifications_fetcher.service.js6
-rw-r--r--src/services/style_setter/style_setter.js2
-rw-r--r--src/services/theme_data/pleromafe.js28
-rw-r--r--src/services/timeline_fetcher/timeline_fetcher.service.js9
7 files changed, 110 insertions, 8 deletions
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index f4483149..436b8b0a 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -1152,6 +1152,7 @@ export const ProcessedWS = ({
// 1000 = Normal Closure
eventTarget.close = () => { socket.close(1000, 'Shutting down socket') }
+ eventTarget.getState = () => socket.readyState
return eventTarget
}
@@ -1183,7 +1184,10 @@ export const handleMastoWS = (wsEvent) => {
export const WSConnectionStatus = Object.freeze({
'JOINED': 1,
'CLOSED': 2,
- 'ERROR': 3
+ 'ERROR': 3,
+ 'DISABLED': 4,
+ 'STARTING': 5,
+ 'STARTING_INITIAL': 6
})
const chats = ({ credentials }) => {
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index 45e6bd0e..4a40f5b5 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -1,17 +1,25 @@
import apiService, { getMastodonSocketURI, ProcessedWS } from '../api/api.service.js'
-import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js'
+import timelineFetcher from '../timeline_fetcher/timeline_fetcher.service.js'
import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js'
import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service'
const backendInteractorService = credentials => ({
startFetchingTimeline ({ timeline, store, userId = false, tag }) {
- return timelineFetcherService.startFetching({ timeline, store, credentials, userId, tag })
+ return timelineFetcher.startFetching({ timeline, store, credentials, userId, tag })
+ },
+
+ fetchTimeline (args) {
+ return timelineFetcher.fetchAndUpdate({ ...args, credentials })
},
startFetchingNotifications ({ store }) {
return notificationsFetcher.startFetching({ store, credentials })
},
+ fetchNotifications (args) {
+ return notificationsFetcher.fetchAndUpdate({ ...args, credentials })
+ },
+
startFetchingFollowRequests ({ store }) {
return followRequestFetcher.startFetching({ store, credentials })
},
diff --git a/src/services/export_import/export_import.js b/src/services/export_import/export_import.js
new file mode 100644
index 00000000..ac67cf9c
--- /dev/null
+++ b/src/services/export_import/export_import.js
@@ -0,0 +1,55 @@
+export const newExporter = ({
+ filename = 'data',
+ getExportedObject
+}) => ({
+ exportData () {
+ const stringified = JSON.stringify(getExportedObject(), null, 2) // Pretty-print and indent with 2 spaces
+
+ // Create an invisible link with a data url and simulate a click
+ const e = document.createElement('a')
+ e.setAttribute('download', `${filename}.json`)
+ e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
+ e.style.display = 'none'
+
+ document.body.appendChild(e)
+ e.click()
+ document.body.removeChild(e)
+ }
+})
+
+export const newImporter = ({
+ onImport,
+ onImportFailure,
+ validator = () => true
+}) => ({
+ importData () {
+ const filePicker = document.createElement('input')
+ filePicker.setAttribute('type', 'file')
+ filePicker.setAttribute('accept', '.json')
+
+ filePicker.addEventListener('change', event => {
+ if (event.target.files[0]) {
+ // eslint-disable-next-line no-undef
+ const reader = new FileReader()
+ reader.onload = ({ target }) => {
+ try {
+ const parsed = JSON.parse(target.result)
+ const validationResult = validator(parsed)
+ if (validationResult === true) {
+ onImport(parsed)
+ } else {
+ onImportFailure({ validationResult })
+ }
+ } catch (error) {
+ onImportFailure({ error })
+ }
+ }
+ reader.readAsText(event.target.files[0])
+ }
+ })
+
+ document.body.appendChild(filePicker)
+ filePicker.click()
+ document.body.removeChild(filePicker)
+ }
+})
diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js
index beeb167c..f83f871e 100644
--- a/src/services/notifications_fetcher/notifications_fetcher.service.js
+++ b/src/services/notifications_fetcher/notifications_fetcher.service.js
@@ -5,7 +5,7 @@ const update = ({ store, notifications, older }) => {
store.dispatch('addNewNotifications', { notifications, older })
}
-const fetchAndUpdate = ({ store, credentials, older = false }) => {
+const fetchAndUpdate = ({ store, credentials, older = false, since }) => {
const args = { credentials }
const { getters } = store
const rootState = store.rootState || store.state
@@ -22,8 +22,10 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => {
return fetchNotifications({ store, args, older })
} else {
// fetch new notifications
- if (timelineData.maxId !== Number.POSITIVE_INFINITY) {
+ if (since === undefined && timelineData.maxId !== Number.POSITIVE_INFINITY) {
args['since'] = timelineData.maxId
+ } else if (since !== null) {
+ args['since'] = since
}
const result = fetchNotifications({ store, args, older })
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index a2bba67b..f75e6916 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -380,7 +380,7 @@ export const colors2to3 = (colors) => {
*/
export const shadows2to3 = (shadows, opacity) => {
return Object.entries(shadows).reduce((shadowsAcc, [slotName, shadowDefs]) => {
- const isDynamic = ({ color }) => color.startsWith('--')
+ const isDynamic = ({ color = '#000000' }) => color.startsWith('--')
const getOpacity = ({ color }) => opacity[getOpacitySlot(color.substring(2).split(',')[0])]
const newShadow = shadowDefs.reduce((shadowAcc, def) => [
...shadowAcc,
diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js
index bec1eebd..14aac975 100644
--- a/src/services/theme_data/pleromafe.js
+++ b/src/services/theme_data/pleromafe.js
@@ -616,6 +616,23 @@ export const SLOT_INHERITANCE = {
textColor: true
},
+ alertSuccess: {
+ depends: ['cGreen'],
+ opacity: 'alert'
+ },
+ alertSuccessText: {
+ depends: ['text'],
+ layer: 'alert',
+ variant: 'alertSuccess',
+ textColor: true
+ },
+ alertSuccessPanelText: {
+ depends: ['panelText'],
+ layer: 'alertPanel',
+ variant: 'alertSuccess',
+ textColor: true
+ },
+
alertNeutral: {
depends: ['text'],
opacity: 'alert'
@@ -656,6 +673,17 @@ export const SLOT_INHERITANCE = {
textColor: true
},
+ alertPopupSuccess: {
+ depends: ['alertSuccess'],
+ opacity: 'alertPopup'
+ },
+ alertPopupSuccessText: {
+ depends: ['alertSuccessText'],
+ layer: 'popover',
+ variant: 'alertPopupSuccess',
+ textColor: true
+ },
+
alertPopupNeutral: {
depends: ['alertNeutral'],
opacity: 'alertPopup'
diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js
index 921df3ed..46bba41a 100644
--- a/src/services/timeline_fetcher/timeline_fetcher.service.js
+++ b/src/services/timeline_fetcher/timeline_fetcher.service.js
@@ -23,7 +23,8 @@ const fetchAndUpdate = ({
showImmediately = false,
userId = false,
tag = false,
- until
+ until,
+ since
}) => {
const args = { timeline, credentials }
const rootState = store.rootState || store.state
@@ -35,7 +36,11 @@ const fetchAndUpdate = ({
if (older) {
args['until'] = until || timelineData.minId
} else {
- args['since'] = timelineData.maxId
+ if (since === undefined) {
+ args['since'] = timelineData.maxId
+ } else if (since !== null) {
+ args['since'] = since
+ }
}
args['userId'] = userId