Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85711421
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
11 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/changelog.d/unify-vuex-modules-import.skip b/changelog.d/unify-vuex-modules-import.skip
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/main.js b/src/main.js
index a7571578a7..514dd0a0e3 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,128 +1,99 @@
/* global process */
import { createStore } from 'vuex'
import { createPinia } from 'pinia'
import 'custom-event-polyfill'
import './lib/event_target_polyfill.js'
-import instanceModule from './modules/instance.js'
-import statusesModule from './modules/statuses.js'
-import notificationsModule from './modules/notifications.js'
-import usersModule from './modules/users.js'
-import apiModule from './modules/api.js'
-import configModule from './modules/config.js'
-import profileConfigModule from './modules/profileConfig.js'
-import serverSideStorageModule from './modules/serverSideStorage.js'
-import adminSettingsModule from './modules/adminSettings.js'
-import oauthModule from './modules/oauth.js'
-import authFlowModule from './modules/auth_flow.js'
-import oauthTokensModule from './modules/oauth_tokens.js'
-import draftsModule from './modules/drafts.js'
-import chatsModule from './modules/chats.js'
+import vuexModules from './modules/index.js'
import { createI18n } from 'vue-i18n'
import createPersistedState from './lib/persisted_state.js'
import pushNotifications from './lib/push_notifications_plugin.js'
import messages from './i18n/messages.js'
import afterStoreSetup from './boot/after_store.js'
const currentLocale = (window.navigator.language || 'en').split('-')[0]
const i18n = createI18n({
// By default, use the browser locale, we will update it if neccessary
locale: 'en',
fallbackLocale: 'en',
messages: messages.default
})
messages.setLanguage(i18n.global, currentLocale)
const persistedStateOptions = {
paths: [
'serverSideStorage.cache',
'config',
'users.lastLoginName',
'oauth'
]
};
(async () => {
const isFox = Math.floor(Math.random() * 2) > 0 ? '_fox' : ''
const splashError = (i18n, e) => {
const throbber = document.querySelector('#throbber')
throbber.addEventListener('animationend', () => {
document.querySelector('#mascot').src = `/static/pleromatan_orz${isFox}.png`
})
throbber.classList.add('dead')
document.querySelector('#status').textContent = i18n.global.t('splash.error')
console.error('PleromaFE failed to initialize: ', e)
document.querySelector('#statusError').textContent = e
document.querySelector('#statusStack').textContent = e.stack
document.querySelector('#statusError').style = 'display: block'
document.querySelector('#statusStack').style = 'display: block'
}
window.splashError = e => splashError(i18n, e)
window.splashUpdate = key => {
if (document.querySelector('#status')) {
document.querySelector('#status').textContent = i18n.global.t(key)
}
}
try {
let storageError
const plugins = [pushNotifications]
const pinia = createPinia()
try {
const persistedState = await createPersistedState(persistedStateOptions)
plugins.push(persistedState)
} catch (e) {
console.error('Storage error', e)
storageError = e
}
document.querySelector('#mascot').src = `/static/pleromatan_apology${isFox}_small.webp`
document.querySelector('#status').removeAttribute('class')
document.querySelector('#status').textContent = i18n.global.t('splash.loading')
document.querySelector('#splash-credit').textContent = i18n.global.t('update.art_by', { linkToArtist: 'pipivovott' })
const store = createStore({
- modules: {
- instance: instanceModule,
- // TODO refactor users/statuses modules, they depend on each other
- users: usersModule,
- statuses: statusesModule,
- notifications: notificationsModule,
- api: apiModule,
- config: configModule,
- profileConfig: profileConfigModule,
- serverSideStorage: serverSideStorageModule,
- adminSettings: adminSettingsModule,
- oauth: oauthModule,
- authFlow: authFlowModule,
- oauthTokens: oauthTokensModule,
- drafts: draftsModule,
- chats: chatsModule
- },
+ modules: vuexModules,
plugins,
options: {
devtools: process.env.NODE_ENV !== 'production'
},
strict: false // Socket modifies itself, let's ignore this for now.
// strict: process.env.NODE_ENV !== 'production'
})
window.vuex = store
// Temporarily passing pinia and vuex stores along with storageError result until migration is fully complete.
return await afterStoreSetup({ pinia, store, storageError, i18n })
} catch (e) {
splashError(i18n, e)
}
})()
// These are inlined by webpack's DefinePlugin
/* eslint-disable */
window.___pleromafe_mode = process.env
window.___pleromafe_commit_hash = COMMIT_HASH
window.___pleromafe_dev_overrides = DEV_OVERRIDES
diff --git a/src/modules/index.js b/src/modules/index.js
new file mode 100644
index 0000000000..9938affff6
--- /dev/null
+++ b/src/modules/index.js
@@ -0,0 +1,31 @@
+import instance from './instance.js'
+import statuses from './statuses.js'
+import notifications from './notifications.js'
+import users from './users.js'
+import api from './api.js'
+import config from './config.js'
+import profileConfig from './profileConfig.js'
+import serverSideStorage from './serverSideStorage.js'
+import adminSettings from './adminSettings.js'
+import oauth from './oauth.js'
+import authFlow from './auth_flow.js'
+import oauthTokens from './oauth_tokens.js'
+import drafts from './drafts.js'
+import chats from './chats.js'
+
+export default {
+ instance,
+ statuses,
+ notifications,
+ users,
+ api,
+ config,
+ profileConfig,
+ serverSideStorage,
+ adminSettings,
+ oauth,
+ authFlow,
+ oauthTokens,
+ drafts,
+ chats
+}
diff --git a/test/fixtures/mock_store.js b/test/fixtures/mock_store.js
index fcffb9f943..3bfdf0fca5 100644
--- a/test/fixtures/mock_store.js
+++ b/test/fixtures/mock_store.js
@@ -1,52 +1,21 @@
import { createStore } from 'vuex'
import { cloneDeep } from 'lodash'
-import instanceModule from 'src/modules/instance.js'
-import statusesModule from 'src/modules/statuses.js'
-import notificationsModule from 'src/modules/notifications.js'
-import usersModule from 'src/modules/users.js'
-import apiModule from 'src/modules/api.js'
-import configModule from 'src/modules/config.js'
-import profileConfigModule from 'src/modules/profileConfig.js'
-import serverSideStorageModule from 'src/modules/serverSideStorage.js'
-import adminSettingsModule from 'src/modules/adminSettings.js'
-import oauthModule from 'src/modules/oauth.js'
-import authFlowModule from 'src/modules/auth_flow.js'
-import oauthTokensModule from 'src/modules/oauth_tokens.js'
-import draftsModule from 'src/modules/drafts.js'
-import chatsModule from 'src/modules/chats.js'
-import bookmarkFoldersModule from 'src/modules/bookmark_folders.js'
+import vuexModules from 'src/modules/index.js'
const tweakModules = modules => {
const res = {}
Object.entries(modules).forEach(([name, module]) => {
const m = { ...module }
m.state = cloneDeep(module.state)
res[name] = m
})
return res
}
const makeMockStore = () => {
return createStore({
- modules: tweakModules({
- instance: instanceModule,
- // TODO refactor users/statuses modules, they depend on each other
- users: usersModule,
- statuses: statusesModule,
- notifications: notificationsModule,
- api: apiModule,
- config: configModule,
- profileConfig: profileConfigModule,
- serverSideStorage: serverSideStorageModule,
- adminSettings: adminSettingsModule,
- oauth: oauthModule,
- authFlow: authFlowModule,
- oauthTokens: oauthTokensModule,
- drafts: draftsModule,
- chats: chatsModule,
- bookmarkFolders: bookmarkFoldersModule
- }),
+ modules: tweakModules(vuexModules),
})
}
export default makeMockStore
diff --git a/test/fixtures/setup_test.js b/test/fixtures/setup_test.js
index d5fe00e4b6..146ba31d97 100644
--- a/test/fixtures/setup_test.js
+++ b/test/fixtures/setup_test.js
@@ -1,132 +1,131 @@
import { config } from '@vue/test-utils'
import { createRouter, createMemoryHistory } from 'vue-router'
import VueVirtualScroller from 'vue-virtual-scroller'
-import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
import routes from 'src/boot/routes'
import makeMockStore from './mock_store'
export const $t = msg => msg
const $i18n = { t: msg => msg }
const applyAfterStore = (store, afterStore) => {
afterStore(store)
return store
}
const getDefaultOpts = ({ afterStore = () => {} } = {}) => ({
global: {
plugins: [
applyAfterStore(makeMockStore(), afterStore),
VueVirtualScroller,
createRouter({
history: createMemoryHistory(),
routes: routes({ state: {
users: {
currentUser: {}
},
instance: {}
}})
}),
(Vue) => { Vue.directive('body-scroll-lock', {}) }
],
components: {
},
stubs: {
I18nT: true,
teleport: true,
FAIcon: true,
FALayers: true,
},
mocks: {
$t,
$i18n
}
}
})
// https://github.com/vuejs/vue-test-utils/issues/960
const customBehaviors = () => {
const filterByText = keyword => {
const match = keyword instanceof RegExp
? (target) => target && keyword.test(target)
: (target) => keyword === target
return wrapper => (
match(wrapper.text()) ||
match(wrapper.attributes('aria-label')) ||
match(wrapper.attributes('title'))
)
}
return {
findComponentByText(searchedComponent, text) {
return this.findAllComponents(searchedComponent)
.filter(filterByText(text))
.at(0)
},
findByText(searchedElement, text) {
return this.findAll(searchedElement)
.filter(filterByText(text))
.at(0)
},
};
};
config.plugins.VueWrapper.install(customBehaviors)
export const mountOpts = (allOpts = {}) => {
const { afterStore, ...opts } = allOpts
const defaultOpts = getDefaultOpts({ afterStore })
const mergedOpts = {
...opts,
global: {
...defaultOpts.global
}
}
if (opts.global) {
mergedOpts.global.plugins = mergedOpts.global.plugins.concat(opts.global.plugins || [])
Object.entries(opts.global).forEach(([k, v]) => {
if (k === 'plugins') {
return
}
if (defaultOpts.global[k]) {
mergedOpts.global[k] = {
...defaultOpts.global[k],
...v,
}
} else {
mergedOpts.global[k] = v
}
})
}
return mergedOpts
}
// https://stackoverflow.com/questions/78033718/how-can-i-wait-for-an-emitted-event-of-a-mounted-component-in-vue-test-utils
export const waitForEvent = (wrapper, event, {
timeout = 1000,
timesEmitted = 1
} = {}) => {
const tick = 10
const totalTries = timeout / tick
return new Promise((resolve, reject) => {
let currentTries = 0
const wait = () => {
const e = wrapper.emitted(event)
if (e && e.length >= timesEmitted) {
resolve()
return
}
if (currentTries >= totalTries) {
reject(new Error('Event did not fire'))
return
}
++currentTries
setTimeout(wait, tick)
}
wait()
})
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Sep 19, 5:20 AM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1768944
Default Alt Text
(11 KB)
Attached To
Mode
rPUFE pleroma-fe-upstream
Attached
Detach File
Event Timeline
Log In to Comment