|
@@ -0,0 +1,295 @@
|
|
|
|
+require('./polyfill');
|
|
|
|
+import Vue from 'vue';
|
|
|
|
+window.Vue = Vue;
|
|
|
|
+import VueRouter from "vue-router";
|
|
|
|
+import Vuex from "vuex";
|
|
|
|
+import { sync } from "vuex-router-sync";
|
|
|
|
+import BootstrapVue from 'bootstrap-vue'
|
|
|
|
+import InfiniteLoading from 'vue-infinite-loading';
|
|
|
|
+import Loading from 'vue-loading-overlay';
|
|
|
|
+import VueTimeago from 'vue-timeago';
|
|
|
|
+import VueCarousel from 'vue-carousel';
|
|
|
|
+import VueBlurHash from 'vue-blurhash';
|
|
|
|
+import VueMasonry from 'vue-masonry-css';
|
|
|
|
+import VueI18n from 'vue-i18n';
|
|
|
|
+window.pftxt = require('twitter-text');
|
|
|
|
+import 'vue-blurhash/dist/vue-blurhash.css'
|
|
|
|
+window.filesize = require('filesize');
|
|
|
|
+import swal from 'sweetalert';
|
|
|
|
+window._ = require('lodash');
|
|
|
|
+window.Popper = require('popper.js').default;
|
|
|
|
+window.pixelfed = window.pixelfed || {};
|
|
|
|
+window.$ = window.jQuery = require('jquery');
|
|
|
|
+require('bootstrap');
|
|
|
|
+window.axios = require('axios');
|
|
|
|
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
|
|
|
+require('readmore-js');
|
|
|
|
+window.blurhash = require("blurhash");
|
|
|
|
+
|
|
|
|
+$('[data-toggle="tooltip"]').tooltip()
|
|
|
|
+let token = document.head.querySelector('meta[name="csrf-token"]');
|
|
|
|
+if (token) {
|
|
|
|
+ window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
|
|
|
|
+} else {
|
|
|
|
+ console.error('CSRF token not found.');
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vue.use(VueRouter);
|
|
|
|
+Vue.use(Vuex);
|
|
|
|
+Vue.use(VueBlurHash);
|
|
|
|
+Vue.use(VueCarousel);
|
|
|
|
+Vue.use(BootstrapVue);
|
|
|
|
+Vue.use(InfiniteLoading);
|
|
|
|
+Vue.use(Loading);
|
|
|
|
+Vue.use(VueMasonry);
|
|
|
|
+Vue.use(VueI18n);
|
|
|
|
+Vue.use(VueTimeago, {
|
|
|
|
+ name: 'Timeago',
|
|
|
|
+ locale: 'en'
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'photo-presenter',
|
|
|
|
+ require('./components/presenter/PhotoPresenter.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'video-presenter',
|
|
|
|
+ require('./components/presenter/VideoPresenter.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'photo-album-presenter',
|
|
|
|
+ require('./components/presenter/PhotoAlbumPresenter.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'video-album-presenter',
|
|
|
|
+ require('./components/presenter/VideoAlbumPresenter.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'mixed-album-presenter',
|
|
|
|
+ require('./components/presenter/MixedAlbumPresenter.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'navbar',
|
|
|
|
+ require('./../components/landing/sections/nav.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+Vue.component(
|
|
|
|
+ 'footer-component',
|
|
|
|
+ require('./../components/landing/sections/footer.vue').default
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+import IndexComponent from "./../components/landing/Index.vue";
|
|
|
|
+import DirectoryComponent from "./../components/landing/Directory.vue";
|
|
|
|
+import ExploreComponent from "./../components/landing/Explore.vue";
|
|
|
|
+import NotFoundComponent from "./../components/landing/NotFound.vue";
|
|
|
|
+
|
|
|
|
+const router = new VueRouter({
|
|
|
|
+ mode: "history",
|
|
|
|
+ linkActiveClass: "",
|
|
|
|
+ linkExactActiveClass: "active",
|
|
|
|
+
|
|
|
|
+ routes: [
|
|
|
|
+ {
|
|
|
|
+ path: "/",
|
|
|
|
+ component: IndexComponent
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ path: "/web/directory",
|
|
|
|
+ component: DirectoryComponent
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ path: "/web/explore",
|
|
|
|
+ component: ExploreComponent
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ path: "/*",
|
|
|
|
+ component: NotFoundComponent,
|
|
|
|
+ props: true
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+
|
|
|
|
+ scrollBehavior(to, from, savedPosition) {
|
|
|
|
+ if (to.hash) {
|
|
|
|
+ return {
|
|
|
|
+ selector: `[id='${to.hash.slice(1)}']`
|
|
|
|
+ };
|
|
|
|
+ } else {
|
|
|
|
+ return { x: 0, y: 0 };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+function lss(name, def) {
|
|
|
|
+ let key = 'pf_m2s.' + name;
|
|
|
|
+ let ls = window.localStorage;
|
|
|
|
+ if(ls.getItem(key)) {
|
|
|
|
+ let val = ls.getItem(key);
|
|
|
|
+ if(['pl', 'color-scheme'].includes(name)) {
|
|
|
|
+ return val;
|
|
|
|
+ }
|
|
|
|
+ return ['true', true].includes(val);
|
|
|
|
+ }
|
|
|
|
+ return def;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const store = new Vuex.Store({
|
|
|
|
+ state: {
|
|
|
|
+ version: 1,
|
|
|
|
+ hideCounts: true,
|
|
|
|
+ autoloadComments: false,
|
|
|
|
+ newReactions: false,
|
|
|
|
+ fixedHeight: false,
|
|
|
|
+ profileLayout: 'grid',
|
|
|
|
+ showDMPrivacyWarning: true,
|
|
|
|
+ relationships: {},
|
|
|
|
+ emoji: [],
|
|
|
|
+ colorScheme: lss('color-scheme', 'system'),
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getters: {
|
|
|
|
+ getVersion: state => {
|
|
|
|
+ return state.version;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getHideCounts: state => {
|
|
|
|
+ return state.hideCounts;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getAutoloadComments: state => {
|
|
|
|
+ return state.autoloadComments;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getNewReactions: state => {
|
|
|
|
+ return state.newReactions;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getFixedHeight: state => {
|
|
|
|
+ return state.fixedHeight;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getProfileLayout: state => {
|
|
|
|
+ return state.profileLayout;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getRelationship: (state) => (id) => {
|
|
|
|
+ return state.relationships[id];
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getCustomEmoji: state => {
|
|
|
|
+ return state.emoji;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getColorScheme: state => {
|
|
|
|
+ return state.colorScheme;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getShowDMPrivacyWarning: state => {
|
|
|
|
+ return state.showDMPrivacyWarning;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ mutations: {
|
|
|
|
+ setVersion(state, value) {
|
|
|
|
+ state.version = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setHideCounts(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.hc', value);
|
|
|
|
+ state.hideCounts = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setAutoloadComments(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.ac', value);
|
|
|
|
+ state.autoloadComments = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setNewReactions(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.nr', value);
|
|
|
|
+ state.newReactions = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setFixedHeight(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.fh', value);
|
|
|
|
+ state.fixedHeight = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setProfileLayout(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.pl', value);
|
|
|
|
+ state.profileLayout = value;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ updateRelationship(state, relationships) {
|
|
|
|
+ relationships.forEach((relationship) => {
|
|
|
|
+ Vue.set(state.relationships, relationship.id, relationship)
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ updateCustomEmoji(state, emojis) {
|
|
|
|
+ state.emoji = emojis;
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setColorScheme(state, value) {
|
|
|
|
+ if(state.colorScheme == value) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ localStorage.setItem('pf_m2s.color-scheme', value);
|
|
|
|
+ state.colorScheme = value;
|
|
|
|
+ const name = value == 'system' ? '' : (value == 'light' ? 'force-light-mode' : 'force-dark-mode');
|
|
|
|
+ document.querySelector("body").className = name;
|
|
|
|
+ if(name != 'system') {
|
|
|
|
+ const payload = name == 'force-dark-mode' ? { dark_mode: 'on' } : {};
|
|
|
|
+ axios.post('/settings/labs', payload);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ setShowDMPrivacyWarning(state, value) {
|
|
|
|
+ localStorage.setItem('pf_m2s.dmpwarn', value);
|
|
|
|
+ state.showDMPrivacyWarning = value;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+let i18nMessages = {
|
|
|
|
+ en: require('./i18n/en.json'),
|
|
|
|
+ ar: require('./i18n/ar.json'),
|
|
|
|
+ ca: require('./i18n/ca.json'),
|
|
|
|
+ de: require('./i18n/de.json'),
|
|
|
|
+ el: require('./i18n/el.json'),
|
|
|
|
+ es: require('./i18n/es.json'),
|
|
|
|
+ eu: require('./i18n/eu.json'),
|
|
|
|
+ fr: require('./i18n/fr.json'),
|
|
|
|
+ he: require('./i18n/he.json'),
|
|
|
|
+ gd: require('./i18n/gd.json'),
|
|
|
|
+ gl: require('./i18n/gl.json'),
|
|
|
|
+ id: require('./i18n/id.json'),
|
|
|
|
+ it: require('./i18n/it.json'),
|
|
|
|
+ ja: require('./i18n/ja.json'),
|
|
|
|
+ nl: require('./i18n/nl.json'),
|
|
|
|
+ pl: require('./i18n/pl.json'),
|
|
|
|
+ pt: require('./i18n/pt.json'),
|
|
|
|
+ ru: require('./i18n/ru.json'),
|
|
|
|
+ uk: require('./i18n/uk.json'),
|
|
|
|
+ vi: require('./i18n/vi.json'),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+let locale = document.querySelector('html').getAttribute('lang');
|
|
|
|
+
|
|
|
|
+const i18n = new VueI18n({
|
|
|
|
+ locale: locale, // set locale
|
|
|
|
+ fallbackLocale: 'en',
|
|
|
|
+ messages: i18nMessages
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+sync(store, router);
|
|
|
|
+
|
|
|
|
+const App = new Vue({
|
|
|
|
+ el: '#content',
|
|
|
|
+ i18n,
|
|
|
|
+ router,
|
|
|
|
+ store
|
|
|
|
+});
|