Merge remote-tracking branch 'origin/develop' into shigusegubu-themes3

This commit is contained in:
Henry Jameson 2025-02-03 21:45:58 +02:00
commit c11ebb1e7f
68 changed files with 881 additions and 713 deletions

View file

@ -1,5 +1,5 @@
// https://github.com/shelljs/shelljs // https://github.com/shelljs/shelljs
require('./check-versions')() import('./check-versions.mjs').then(m => m.default())
require('shelljs/global') require('shelljs/global')
env.NODE_ENV = 'production' env.NODE_ENV = 'production'

View file

@ -1,10 +1,7 @@
var semver = require('semver') import semver from 'semver'
var chalk = require('chalk') import chalk from 'chalk'
var packageConfig = require('../package.json')
var exec = function (cmd) { import packageConfig from '../package.json' with { type: 'json' }
return require('child_process')
.execSync(cmd).toString().trim()
}
var versionRequirements = [ var versionRequirements = [
{ {
@ -14,10 +11,10 @@ var versionRequirements = [
} }
] ]
module.exports = function () { export default function () {
var warnings = [] const warnings = []
for (var i = 0; i < versionRequirements.length; i++) { for (let i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i] const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' + warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' + chalk.red(mod.currentVersion) + ' should be ' +
@ -28,8 +25,8 @@ module.exports = function () {
if (warnings.length) { if (warnings.length) {
console.warn(chalk.yellow('\nTo use this template, you must update following to modules:\n')) console.warn(chalk.yellow('\nTo use this template, you must update following to modules:\n'))
for (var i = 0; i < warnings.length; i++) { for (let i = 0; i < warnings.length; i++) {
var warning = warnings[i] const warning = warnings[i]
console.warn(' ' + warning) console.warn(' ' + warning)
} }
console.warn() console.warn()

View file

@ -1,4 +1,4 @@
require('./check-versions')() import('./check-versions.mjs').then(m => m.default())
var config = require('../config') var config = require('../config')
if (!process.env.NODE_ENV) process.env.NODE_ENV = config.dev.env if (!process.env.NODE_ENV) process.env.NODE_ENV = config.dev.env
var path = require('path') var path = require('path')

View file

@ -0,0 +1 @@
Added option to always convert images to JPEG format instead of using WebP when compressing images.

1
changelog.d/pinia.change Normal file
View file

@ -0,0 +1 @@
Partially migrated from vuex to pinia

View file

@ -37,7 +37,7 @@
"localforage": "1.10.0", "localforage": "1.10.0",
"pako": "^2.1.0", "pako": "^2.1.0",
"parse-link-header": "2.0.0", "parse-link-header": "2.0.0",
"phoenix": "1.7.18", "phoenix": "1.7.19",
"pinia": "^2.0.33", "pinia": "^2.0.33",
"punycode.js": "2.3.1", "punycode.js": "2.3.1",
"qrcode": "1.5.4", "qrcode": "1.5.4",
@ -66,13 +66,13 @@
"babel-loader": "9.2.1", "babel-loader": "9.2.1",
"babel-plugin-lodash": "3.3.4", "babel-plugin-lodash": "3.3.4",
"chai": "4.5.0", "chai": "4.5.0",
"chalk": "1.1.3", "chalk": "5.4.1",
"chromedriver": "108.0.0", "chromedriver": "132.0.2",
"connect-history-api-fallback": "2.0.0", "connect-history-api-fallback": "2.0.0",
"copy-webpack-plugin": "11.0.0", "copy-webpack-plugin": "12.0.2",
"cross-spawn": "7.0.6", "cross-spawn": "7.0.6",
"css-loader": "6.11.0", "css-loader": "7.1.2",
"css-minimizer-webpack-plugin": "4.2.2", "css-minimizer-webpack-plugin": "7.0.0",
"custom-event-polyfill": "1.0.7", "custom-event-polyfill": "1.0.7",
"eslint": "8.57.1", "eslint": "8.57.1",
"eslint-config-standard": "17.1.0", "eslint-config-standard": "17.1.0",
@ -106,12 +106,12 @@
"ora": "0.4.1", "ora": "0.4.1",
"postcss": "8.5.1", "postcss": "8.5.1",
"postcss-html": "^1.5.0", "postcss-html": "^1.5.0",
"postcss-loader": "7.0.2", "postcss-loader": "7.3.4",
"postcss-scss": "^4.0.6", "postcss-scss": "^4.0.6",
"sass": "1.60.0", "sass": "1.83.4",
"sass-loader": "13.3.3", "sass-loader": "13.3.3",
"selenium-server": "3.141.59", "selenium-server": "3.141.59",
"semver": "7.6.3", "semver": "7.7.0",
"serviceworker-webpack5-plugin": "2.0.0", "serviceworker-webpack5-plugin": "2.0.0",
"shelljs": "0.8.5", "shelljs": "0.8.5",
"sinon": "15.2.0", "sinon": "15.2.0",
@ -123,11 +123,11 @@
"stylelint-config-standard": "29.0.0", "stylelint-config-standard": "29.0.0",
"stylelint-rscss": "0.4.0", "stylelint-rscss": "0.4.0",
"stylelint-webpack-plugin": "^3.3.0", "stylelint-webpack-plugin": "^3.3.0",
"vue-loader": "17.0.1", "vue-loader": "17.4.2",
"vue-style-loader": "4.1.3", "vue-style-loader": "4.1.3",
"webpack": "5.75.0", "webpack": "5.97.1",
"webpack-dev-middleware": "3.7.3", "webpack-dev-middleware": "3.7.3",
"webpack-hot-middleware": "2.25.3", "webpack-hot-middleware": "2.26.1",
"webpack-merge": "0.20.0" "webpack-merge": "0.20.0"
}, },
"engines": { "engines": {

View file

@ -17,9 +17,9 @@ import { applyConfig } from '../services/style_setter/style_setter.js'
import FaviconService from '../services/favicon_service/favicon_service.js' import FaviconService from '../services/favicon_service/favicon_service.js'
import { initServiceWorker, updateFocus } from '../services/sw/sw.js' import { initServiceWorker, updateFocus } from '../services/sw/sw.js'
import { useI18nStore } from '../stores/i18n' import { useI18nStore } from 'src/stores/i18n'
import { useInterfaceStore } from '../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { useAnnouncementsStore } from '../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
let staticInitialResults = null let staticInitialResults = null

View file

@ -7,7 +7,7 @@ import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faEllipsisV faEllipsisV
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useReportsStore } from '../../stores/reports' import { useReportsStore } from 'src/stores/reports'
library.add( library.add(
faEllipsisV faEllipsisV

View file

@ -2,7 +2,7 @@ import { mapState } from 'vuex'
import AnnouncementEditor from '../announcement_editor/announcement_editor.vue' import AnnouncementEditor from '../announcement_editor/announcement_editor.vue'
import RichContent from '../rich_content/rich_content.jsx' import RichContent from '../rich_content/rich_content.jsx'
import localeService from '../../services/locale/locale.service.js' import localeService from '../../services/locale/locale.service.js'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
const Announcement = { const Announcement = {
components: { components: {

View file

@ -1,7 +1,7 @@
import { mapState } from 'vuex' import { mapState } from 'vuex'
import Announcement from '../announcement/announcement.vue' import Announcement from '../announcement/announcement.vue'
import AnnouncementEditor from '../announcement_editor/announcement_editor.vue' import AnnouncementEditor from '../announcement_editor/announcement_editor.vue'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
const AnnouncementsPage = { const AnnouncementsPage = {
components: { components: {

View file

@ -18,7 +18,7 @@ import {
faPencilAlt, faPencilAlt,
faAlignRight faAlignRight
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useMediaViewerStore } from '../../stores/media_viewer' import { useMediaViewerStore } from 'src/stores/media_viewer'
library.add( library.add(
faFile, faFile,

View file

@ -14,7 +14,7 @@ import {
faChevronLeft faChevronLeft
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { buildFakeMessage } from '../../services/chat_utils/chat_utils.js' import { buildFakeMessage } from '../../services/chat_utils/chat_utils.js'
import { useInterfaceStore } from '../../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
library.add( library.add(
faChevronDown, faChevronDown,

View file

@ -13,7 +13,7 @@ import {
faTimes, faTimes,
faEllipsisH faEllipsisH
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faTimes, faTimes,

View file

@ -14,7 +14,7 @@ import {
faCog, faCog,
faInfoCircle faInfoCircle
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faSignInAlt, faSignInAlt,

View file

@ -1,7 +1,7 @@
import EditStatusForm from '../edit_status_form/edit_status_form.vue' import EditStatusForm from '../edit_status_form/edit_status_form.vue'
import Modal from '../modal/modal.vue' import Modal from '../modal/modal.vue'
import get from 'lodash/get' import get from 'lodash/get'
import { useEditStatusStore } from '../../stores/editStatus' import { useEditStatusStore } from 'src/stores/editStatus'
const EditStatusModal = { const EditStatusModal = {
components: { components: {

View file

@ -1,6 +1,6 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { mapState as mapPiniaState } from 'pinia' import { mapState as mapPiniaState } from 'pinia'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
@ -9,7 +9,7 @@ import {
faBullhorn faBullhorn
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faUserPlus, faUserPlus,

View file

@ -1,4 +1,4 @@
import { useMediaViewerStore } from '../../stores/media_viewer' import { useMediaViewerStore } from 'src/stores/media_viewer'
import Attachment from '../attachment/attachment.vue' import Attachment from '../attachment/attachment.vue'
import { sumBy, set } from 'lodash' import { sumBy, set } from 'lodash'

View file

@ -2,7 +2,7 @@ import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faTimes faTimes
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faTimes faTimes

View file

@ -1,4 +1,4 @@
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
import ListsCard from '../lists_card/lists_card.vue' import ListsCard from '../lists_card/lists_card.vue'
const Lists = { const Lists = {

View file

@ -10,8 +10,8 @@ import {
faSearch, faSearch,
faChevronLeft faChevronLeft
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
library.add( library.add(
faSearch, faSearch,

View file

@ -2,7 +2,7 @@ import { mapState } from 'vuex'
import { mapState as mapPiniaState } from 'pinia' import { mapState as mapPiniaState } from 'pinia'
import NavigationEntry from 'src/components/navigation/navigation_entry.vue' import NavigationEntry from 'src/components/navigation/navigation_entry.vue'
import { getListEntries } from 'src/components/navigation/filter.js' import { getListEntries } from 'src/components/navigation/filter.js'
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
export const ListsMenuContent = { export const ListsMenuContent = {
props: [ props: [

View file

@ -1,4 +1,4 @@
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
import Timeline from '../timeline/timeline.vue' import Timeline from '../timeline/timeline.vue'
const ListsTimeline = { const ListsTimeline = {
data () { data () {

View file

@ -13,7 +13,7 @@ import {
faCircleNotch, faCircleNotch,
faTimes faTimes
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useMediaViewerStore } from '../../stores/media_viewer' import { useMediaViewerStore } from 'src/stores/media_viewer'
library.add( library.add(
faChevronLeft, faChevronLeft,

View file

@ -76,9 +76,9 @@ const mediaUpload = {
const testCanvas = document.createElement('canvas') const testCanvas = document.createElement('canvas')
const supportsWebP = testCanvas.toDataURL('image/webp').startsWith('data:image/webp') const supportsWebP = testCanvas.toDataURL('image/webp').startsWith('data:image/webp')
// Convert to WebP if supported, otherwise JPEG // Convert to WebP if supported and alwaysUseJpeg is false, otherwise JPEG
const type = supportsWebP ? 'image/webp' : 'image/jpeg' const type = (!this.$store.getters.mergedConfig.alwaysUseJpeg && supportsWebP) ? 'image/webp' : 'image/jpeg'
const extension = supportsWebP ? '.webp' : '.jpg' const extension = type === 'image/webp' ? '.webp' : '.jpg'
// Remove the original extension and add new one // Remove the original extension and add new one
const newFileName = file.name.replace(/\.[^/.]+$/, '') + extension const newFileName = file.name.replace(/\.[^/.]+$/, '') + extension

View file

@ -18,7 +18,7 @@ import {
faMinus, faMinus,
faCheckDouble faCheckDouble
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
library.add( library.add(
faTimes, faTimes,

View file

@ -3,7 +3,7 @@ import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faPen faPen
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { usePostStatusStore } from '../../stores/postStatus' import { usePostStatusStore } from 'src/stores/postStatus'
library.add( library.add(
faPen faPen

View file

@ -4,7 +4,7 @@ import OptionalRouterLink from 'src/components/optional_router_link/optional_rou
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faThumbtack } from '@fortawesome/free-solid-svg-icons' import { faThumbtack } from '@fortawesome/free-solid-svg-icons'
import { mapStores } from 'pinia' import { mapStores } from 'pinia'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
library.add(faThumbtack) library.add(faThumbtack)

View file

@ -15,8 +15,8 @@ import {
import FaviconService from '../../services/favicon_service/favicon_service.js' import FaviconService from '../../services/favicon_service/favicon_service.js'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faCircleNotch, faArrowUp, faMinus } from '@fortawesome/free-solid-svg-icons' import { faCircleNotch, faArrowUp, faMinus } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
library.add( library.add(
faCircleNotch, faCircleNotch,

View file

@ -2,7 +2,7 @@ import Timeago from 'components/timeago/timeago.vue'
import genRandomSeed from '../../services/random_seed/random_seed.service.js' import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import RichContent from 'components/rich_content/rich_content.jsx' import RichContent from 'components/rich_content/rich_content.jsx'
import { forEach, map } from 'lodash' import { forEach, map } from 'lodash'
import { usePollsStore } from '../../stores/polls' import { usePollsStore } from 'src/stores/polls'
export default { export default {
name: 'Poll', name: 'Poll',

View file

@ -1,7 +1,7 @@
import PostStatusForm from '../post_status_form/post_status_form.vue' import PostStatusForm from '../post_status_form/post_status_form.vue'
import Modal from '../modal/modal.vue' import Modal from '../modal/modal.vue'
import get from 'lodash/get' import get from 'lodash/get'
import { usePostStatusStore } from '../../stores/postStatus' import { usePostStatusStore } from 'src/stores/postStatus'
const PostStatusModal = { const PostStatusModal = {
components: { components: {

View file

@ -3,7 +3,7 @@ import { mapGetters } from 'vuex'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faFilter, faFont, faWrench } from '@fortawesome/free-solid-svg-icons' import { faFilter, faFont, faWrench } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faFilter, faFilter,

View file

@ -4,7 +4,7 @@ import { mapGetters } from 'vuex'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faList, faFolderTree, faBars, faWrench } from '@fortawesome/free-solid-svg-icons' import { faList, faFolderTree, faBars, faWrench } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faList, faList,

View file

@ -1,4 +1,4 @@
import { useReportsStore } from '../../stores/reports' import { useReportsStore } from 'src/stores/reports'
import Select from '../select/select.vue' import Select from '../select/select.vue'
import StatusContent from '../status_content/status_content.vue' import StatusContent from '../status_content/status_content.vue'
import Timeago from '../timeago/timeago.vue' import Timeago from '../timeago/timeago.vue'

View file

@ -21,7 +21,7 @@ import {
import { import {
faWindowMinimize faWindowMinimize
} from '@fortawesome/free-regular-svg-icons' } from '@fortawesome/free-regular-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
const PLEROMAFE_SETTINGS_MAJOR_VERSION = 1 const PLEROMAFE_SETTINGS_MAJOR_VERSION = 1
const PLEROMAFE_SETTINGS_MINOR_VERSION = 0 const PLEROMAFE_SETTINGS_MINOR_VERSION = 0

View file

@ -269,6 +269,14 @@
{{ $t('settings.image_compression') }} {{ $t('settings.image_compression') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li>
<BooleanSetting
path="alwaysUseJpeg"
expert="1"
>
{{ $t('settings.always_use_jpeg') }}
</BooleanSetting>
</li>
<li> <li>
<BooleanSetting <BooleanSetting
path="useContainFit" path="useContainFit"

View file

@ -21,7 +21,7 @@ import {
faPlus, faPlus,
faCircleNotch faCircleNotch
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faTimes, faTimes,

View file

@ -43,7 +43,7 @@ import Checkbox from 'src/components/checkbox/checkbox.vue'
import Select from 'src/components/select/select.vue' import Select from 'src/components/select/select.vue'
import Preview from './theme_preview.vue' import Preview from './theme_preview.vue'
import { useInterfaceStore } from '../../../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
// List of color values used in v1 // List of color values used in v1
const v1OnlyNames = [ const v1OnlyNames = [

View file

@ -4,7 +4,7 @@ import {
faBullhorn, faBullhorn,
faTimes faTimes
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useShoutStore } from '../../stores/shout' import { useShoutStore } from 'src/stores/shout'
library.add( library.add(
faBullhorn, faBullhorn,

View file

@ -21,9 +21,9 @@ import {
faList, faList,
faFilePen faFilePen
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useShoutStore } from '../../stores/shout' import { useShoutStore } from 'src/stores/shout'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { useAnnouncementsStore } from '../../stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
library.add( library.add(
faSignInAlt, faSignInAlt,

View file

@ -13,7 +13,7 @@ import {
faLink, faLink,
faPollH faPollH
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useMediaViewerStore } from '../../stores/media_viewer' import { useMediaViewerStore } from 'src/stores/media_viewer'
library.add( library.add(
faCircleNotch, faCircleNotch,

View file

@ -1,7 +1,7 @@
import { get } from 'lodash' import { get } from 'lodash'
import Modal from '../modal/modal.vue' import Modal from '../modal/modal.vue'
import Status from '../status/status.vue' import Status from '../status/status.vue'
import { useStatusHistoryStore } from '../../stores/statusHistory' import { useStatusHistoryStore } from 'src/stores/statusHistory'
const StatusHistoryModal = { const StatusHistoryModal = {
components: { components: {

View file

@ -4,7 +4,7 @@ import { mapState } from 'pinia'
import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome' import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome'
import './tab_switcher.scss' import './tab_switcher.scss'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
const findFirstUsable = (slots) => slots.findIndex(_ => _.props) const findFirstUsable = (slots) => slots.findIndex(_ => _.props)

View file

@ -8,7 +8,7 @@ import QuickViewSettings from '../quick_view_settings/quick_view_settings.vue'
import { debounce, throttle, keyBy } from 'lodash' import { debounce, throttle, keyBy } from 'lodash'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faCircleNotch, faCirclePlus, faCog, faMinus, faArrowUp, faCheck } from '@fortawesome/free-solid-svg-icons' import { faCircleNotch, faCirclePlus, faCog, faMinus, faArrowUp, faCheck } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
library.add( library.add(
faCircleNotch, faCircleNotch,

View file

@ -9,8 +9,8 @@ import { filterNavigation } from 'src/components/navigation/filter.js'
import { import {
faChevronDown faChevronDown
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
library.add(faChevronDown) library.add(faChevronDown)

View file

@ -11,7 +11,7 @@ import RichContent from 'src/components/rich_content/rich_content.jsx'
import MuteConfirm from '../confirm_modal/mute_confirm.vue' import MuteConfirm from '../confirm_modal/mute_confirm.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { usePostStatusStore } from '../../stores/postStatus' import { usePostStatusStore } from 'src/stores/postStatus'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faBell, faBell,
@ -22,6 +22,7 @@ import {
faTimes, faTimes,
faExpandAlt faExpandAlt
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import { useMediaViewerStore } from '../../stores/media_viewer' import { useMediaViewerStore } from '../../stores/media_viewer'
import { useInterfaceStore } from '../../stores/interface' import { useInterfaceStore } from '../../stores/interface'

View file

@ -4,7 +4,7 @@ import { mapState } from 'pinia'
import DialogModal from '../dialog_modal/dialog_modal.vue' import DialogModal from '../dialog_modal/dialog_modal.vue'
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import { useListsStore } from '../../stores/lists' import { useListsStore } from 'src/stores/lists'
library.add(faChevronRight) library.add(faChevronRight)

View file

@ -3,7 +3,7 @@ import List from '../list/list.vue'
import Checkbox from '../checkbox/checkbox.vue' import Checkbox from '../checkbox/checkbox.vue'
import Modal from '../modal/modal.vue' import Modal from '../modal/modal.vue'
import UserLink from '../user_link/user_link.vue' import UserLink from '../user_link/user_link.vue'
import { useReportsStore } from '../../stores/reports' import { useReportsStore } from 'src/stores/reports'
const UserReportingModal = { const UserReportingModal = {
components: { components: {

View file

@ -440,6 +440,7 @@
"attachmentRadius": "Attachments", "attachmentRadius": "Attachments",
"attachments": "Attachments", "attachments": "Attachments",
"image_compression": "Compress images before uploading", "image_compression": "Compress images before uploading",
"always_use_jpeg": "Always convert images to JPEG format",
"avatar": "Avatar", "avatar": "Avatar",
"avatarAltRadius": "Avatars (notifications)", "avatarAltRadius": "Avatars (notifications)",
"avatarRadius": "Avatars", "avatarRadius": "Avatars",

View file

@ -1,6 +1,6 @@
import merge from 'lodash.merge' import merge from 'lodash.merge'
import { each, get, set, cloneDeep } from 'lodash' import { each, get, set, cloneDeep } from 'lodash'
import { useInterfaceStore } from '../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { storage } from './storage.js' import { storage } from './storage.js'
let loaded = false let loaded = false

View file

@ -1,4 +1,4 @@
import { useInterfaceStore } from '../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
export default (store) => { export default (store) => {
store.subscribe((mutation, state) => { store.subscribe((mutation, state) => {

View file

@ -7,7 +7,6 @@ import './lib/event_target_polyfill.js'
import instanceModule from './modules/instance.js' import instanceModule from './modules/instance.js'
import statusesModule from './modules/statuses.js' import statusesModule from './modules/statuses.js'
import notificationsModule from './modules/notifications.js' import notificationsModule from './modules/notifications.js'
import listsModule from './modules/lists.js'
import usersModule from './modules/users.js' import usersModule from './modules/users.js'
import apiModule from './modules/api.js' import apiModule from './modules/api.js'
import configModule from './modules/config.js' import configModule from './modules/config.js'
@ -94,7 +93,6 @@ const persistedStateOptions = {
instance: instanceModule, instance: instanceModule,
// TODO refactor users/statuses modules, they depend on each other // TODO refactor users/statuses modules, they depend on each other
users: usersModule, users: usersModule,
lists: listsModule,
statuses: statusesModule, statuses: statusesModule,
notifications: notificationsModule, notifications: notificationsModule,
api: apiModule, api: apiModule,

View file

@ -2,8 +2,8 @@ import backendInteractorService from '../services/backend_interactor_service/bac
import { WSConnectionStatus } from '../services/api/api.service.js' import { WSConnectionStatus } from '../services/api/api.service.js'
import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js' import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js'
import { Socket } from 'phoenix' import { Socket } from 'phoenix'
import { useShoutStore } from '../stores/shout.js' import { useShoutStore } from 'src/stores/shout.js'
import { useInterfaceStore } from '../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
const retryTimeout = (multiplier) => 1000 * multiplier const retryTimeout = (multiplier) => 1000 * multiplier

View file

@ -3,8 +3,8 @@ import { applyConfig } from '../services/style_setter/style_setter.js'
import messages from '../i18n/messages' import messages from '../i18n/messages'
import { set } from 'lodash' import { set } from 'lodash'
import localeService from '../services/locale/locale.service.js' import localeService from '../services/locale/locale.service.js'
import { useI18nStore } from '../stores/i18n.js' import { useI18nStore } from 'src/stores/i18n.js'
import { useInterfaceStore } from '../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
import { defaultState } from './default_config_state.js' import { defaultState } from './default_config_state.js'
@ -36,8 +36,6 @@ export const multiChoiceProperties = [
'unsavedPostAction' // save | discard | confirm 'unsavedPostAction' // save | discard | confirm
] ]
console.log('TEST', defaultState)
// caching the instance default properties // caching the instance default properties
export const instanceDefaultProperties = Object.entries(defaultState) export const instanceDefaultProperties = Object.entries(defaultState)
.filter(([key, value]) => value === undefined) .filter(([key, value]) => value === undefined)

View file

@ -160,5 +160,6 @@ export const defaultState = {
useAbsoluteTimeFormat: undefined, // instance default useAbsoluteTimeFormat: undefined, // instance default
absoluteTimeFormatMinAge: undefined, // instance default absoluteTimeFormatMinAge: undefined, // instance default
absoluteTime12h: undefined, // instance default absoluteTime12h: undefined, // instance default
imageCompression: true imageCompression: true,
alwaysUseJpeg: false
} }

View file

@ -1,7 +1,7 @@
import apiService from '../services/api/api.service.js' import apiService from '../services/api/api.service.js'
import { instanceDefaultProperties } from './config.js' import { instanceDefaultProperties } from './config.js'
import { langCodeToCldrName, ensureFinalFallback } from '../i18n/languages.js' import { langCodeToCldrName, ensureFinalFallback } from '../i18n/languages.js'
import { useInterfaceStore } from '../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
const SORTED_EMOJI_GROUP_IDS = [ const SORTED_EMOJI_GROUP_IDS = [
'smileys-and-emotion', 'smileys-and-emotion',

View file

@ -1,130 +0,0 @@
import { remove, find } from 'lodash'
export const defaultState = {
allLists: [],
allListsObject: {}
}
export const mutations = {
setLists (state, value) {
state.allLists = value
},
setList (state, { listId, title }) {
if (!state.allListsObject[listId]) {
state.allListsObject[listId] = { accountIds: [] }
}
state.allListsObject[listId].title = title
const entry = find(state.allLists, { id: listId })
if (!entry) {
state.allLists.push({ id: listId, title })
} else {
entry.title = title
}
},
setListAccounts (state, { listId, accountIds }) {
if (!state.allListsObject[listId]) {
state.allListsObject[listId] = { accountIds: [] }
}
state.allListsObject[listId].accountIds = accountIds
},
addListAccount (state, { listId, accountId }) {
if (!state.allListsObject[listId]) {
state.allListsObject[listId] = { accountIds: [] }
}
state.allListsObject[listId].accountIds.push(accountId)
},
removeListAccount (state, { listId, accountId }) {
if (!state.allListsObject[listId]) {
state.allListsObject[listId] = { accountIds: [] }
}
const { accountIds } = state.allListsObject[listId]
const set = new Set(accountIds)
set.delete(accountId)
state.allListsObject[listId].accountIds = [...set]
},
deleteList (state, { listId }) {
delete state.allListsObject[listId]
remove(state.allLists, list => list.id === listId)
}
}
const actions = {
setLists ({ commit }, value) {
commit('setLists', value)
},
createList ({ rootState, commit }, { title }) {
return rootState.api.backendInteractor.createList({ title })
.then((list) => {
commit('setList', { listId: list.id, title })
return list
})
},
fetchList ({ rootState, commit }, { listId }) {
return rootState.api.backendInteractor.getList({ listId })
.then((list) => commit('setList', { listId: list.id, title: list.title }))
},
fetchListAccounts ({ rootState, commit }, { listId }) {
return rootState.api.backendInteractor.getListAccounts({ listId })
.then((accountIds) => commit('setListAccounts', { listId, accountIds }))
},
setList ({ rootState, commit }, { listId, title }) {
rootState.api.backendInteractor.updateList({ listId, title })
commit('setList', { listId, title })
},
setListAccounts ({ rootState, commit }, { listId, accountIds }) {
const saved = rootState.lists.allListsObject[listId].accountIds || []
const added = accountIds.filter(id => !saved.includes(id))
const removed = saved.filter(id => !accountIds.includes(id))
commit('setListAccounts', { listId, accountIds })
if (added.length > 0) {
rootState.api.backendInteractor.addAccountsToList({ listId, accountIds: added })
}
if (removed.length > 0) {
rootState.api.backendInteractor.removeAccountsFromList({ listId, accountIds: removed })
}
},
addListAccount ({ rootState, commit }, { listId, accountId }) {
return rootState
.api
.backendInteractor
.addAccountsToList({ listId, accountIds: [accountId] })
.then((result) => {
commit('addListAccount', { listId, accountId })
return result
})
},
removeListAccount ({ rootState, commit }, { listId, accountId }) {
return rootState
.api
.backendInteractor
.removeAccountsFromList({ listId, accountIds: [accountId] })
.then((result) => {
commit('removeListAccount', { listId, accountId })
return result
})
},
deleteList ({ rootState, commit }, { listId }) {
rootState.api.backendInteractor.deleteList({ listId })
commit('deleteList', { listId })
}
}
export const getters = {
findListTitle: state => id => {
if (!state.allListsObject[id]) return
return state.allListsObject[id].title
},
findListAccounts: state => id => {
return [...state.allListsObject[id].accountIds]
}
}
const lists = {
state: defaultState,
mutations,
actions,
getters
}
export default lists

View file

@ -11,7 +11,7 @@ import {
closeAllDesktopNotifications closeAllDesktopNotifications
} from '../services/desktop_notification_utils/desktop_notification_utils.js' } from '../services/desktop_notification_utils/desktop_notification_utils.js'
import { useReportsStore } from '../stores/reports.js' import { useReportsStore } from 'src/stores/reports.js'
const emptyNotifications = () => ({ const emptyNotifications = () => ({
desktopNotificationSilence: true, desktopNotificationSilence: true,

View file

@ -125,6 +125,7 @@ export const _getRecentData = (cache, live, isTest) => {
} }
const merge = (a, b) => ({ const merge = (a, b) => ({
_user: a._user ?? b._user,
_version: a._version ?? b._version, _version: a._version ?? b._version,
_timestamp: a._timestamp ?? b._timestamp, _timestamp: a._timestamp ?? b._timestamp,
needUpload: b.needUpload ?? a.needUpload, needUpload: b.needUpload ?? a.needUpload,

View file

@ -3,7 +3,7 @@ import { windowWidth, windowHeight } from '../services/window_utils/window_utils
import oauthApi from '../services/new_api/oauth.js' import oauthApi from '../services/new_api/oauth.js'
import { compact, map, each, mergeWith, last, concat, uniq, isArray } from 'lodash' import { compact, map, each, mergeWith, last, concat, uniq, isArray } from 'lodash'
import { registerPushNotifications, unregisterPushNotifications } from '../services/sw/sw.js' import { registerPushNotifications, unregisterPushNotifications } from '../services/sw/sw.js'
import { useInterfaceStore } from '../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
// TODO: Unify with mergeOrAdd in statuses.js // TODO: Unify with mergeOrAdd in statuses.js
export const mergeOrAdd = (arr, obj, item) => { export const mergeOrAdd = (arr, obj, item) => {

View file

@ -1,4 +1,4 @@
import { useListsStore } from '../../stores/lists.js' import { useListsStore } from 'src/stores/lists.js'
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import { promiseInterval } from '../promise_interval/promise_interval.js' import { promiseInterval } from '../promise_interval/promise_interval.js'

View file

@ -1,6 +1,6 @@
import { muteWordHits } from '../status_parser/status_parser.js' import { muteWordHits } from '../status_parser/status_parser.js'
import { showDesktopNotification } from '../desktop_notification_utils/desktop_notification_utils.js' import { showDesktopNotification } from '../desktop_notification_utils/desktop_notification_utils.js'
import { useI18nStore } from '../../stores/i18n.js' import { useI18nStore } from 'src/stores/i18n.js'
import { useAnnouncementsStore } from 'src/stores/announcements' import { useAnnouncementsStore } from 'src/stores/announcements'
import FaviconService from 'src/services/favicon_service/favicon_service.js' import FaviconService from 'src/services/favicon_service/favicon_service.js'

View file

@ -1,4 +1,4 @@
import { useInterfaceStore } from '../../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import { promiseInterval } from '../promise_interval/promise_interval.js' import { promiseInterval } from '../promise_interval/promise_interval.js'

View file

@ -2,7 +2,7 @@ import { camelCase } from 'lodash'
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import { promiseInterval } from '../promise_interval/promise_interval.js' import { promiseInterval } from '../promise_interval/promise_interval.js'
import { useInterfaceStore } from '../../stores/interface.js' import { useInterfaceStore } from 'src/stores/interface.js'
const update = ({ store, statuses, timeline, showImmediately, userId, listId, pagination }) => { const update = ({ store, statuses, timeline, showImmediately, userId, listId, pagination }) => {
const ccTimeline = camelCase(timeline) const ccTimeline = camelCase(timeline)

View file

@ -56,7 +56,7 @@ export const useListsStore = defineStore('lists', {
} }
}, },
setListAccounts ({ listId, accountIds }) { setListAccounts ({ listId, accountIds }) {
const saved = this.allListsObject[listId].accountIds || [] const saved = this.allListsObject[listId]?.accountIds || []
const added = accountIds.filter(id => !saved.includes(id)) const added = accountIds.filter(id => !saved.includes(id))
const removed = saved.filter(id => !accountIds.includes(id)) const removed = saved.filter(id => !accountIds.includes(id))
if (!this.allListsObject[listId]) { if (!this.allListsObject[listId]) {

View file

@ -1,7 +1,7 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import filter from 'lodash/filter' import filter from 'lodash/filter'
import { useInterfaceStore } from '../stores/interface' import { useInterfaceStore } from 'src/stores/interface'
export const useReportsStore = defineStore('reports', { export const useReportsStore = defineStore('reports', {
state: () => ({ state: () => ({

View file

@ -74,7 +74,7 @@ describe('The serverSideStorage module', () => {
}) })
}) })
it.only('should reset local timestamp to remote if contents are the same', () => { it('should reset local timestamp to remote if contents are the same', () => {
const state = { const state = {
...cloneDeep(defaultState), ...cloneDeep(defaultState),
cache: null cache: null

View file

@ -1,7 +1,7 @@
import { createPinia, setActivePinia } from 'pinia' import { createPinia, setActivePinia } from 'pinia'
import { useListsStore } from '../../../../src/stores/lists.js' import { useListsStore } from 'src/stores/lists.js'
import { createStore } from 'vuex' import { createStore } from 'vuex'
import apiModule from '../../../../src/modules/api.js' import apiModule from 'src/modules/api.js'
setActivePinia(createPinia()) setActivePinia(createPinia())
const store = useListsStore() const store = useListsStore()

1257
yarn.lock

File diff suppressed because it is too large Load diff