landing.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. require('./polyfill');
  2. import Vue from 'vue';
  3. window.Vue = Vue;
  4. import VueRouter from "vue-router";
  5. import Vuex from "vuex";
  6. import { sync } from "vuex-router-sync";
  7. import BootstrapVue from 'bootstrap-vue'
  8. import InfiniteLoading from 'vue-infinite-loading';
  9. import Loading from 'vue-loading-overlay';
  10. import VueTimeago from 'vue-timeago';
  11. import VueCarousel from 'vue-carousel';
  12. import VueBlurHash from 'vue-blurhash';
  13. import VueI18n from 'vue-i18n';
  14. window.pftxt = require('twitter-text');
  15. import 'vue-blurhash/dist/vue-blurhash.css'
  16. window.filesize = require('filesize');
  17. import swal from 'sweetalert';
  18. window._ = require('lodash');
  19. window.Popper = require('popper.js').default;
  20. window.pixelfed = window.pixelfed || {};
  21. window.$ = window.jQuery = require('jquery');
  22. require('bootstrap');
  23. window.axios = require('axios');
  24. window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
  25. require('readmore-js');
  26. window.blurhash = require("blurhash");
  27. $('[data-toggle="tooltip"]').tooltip()
  28. let token = document.head.querySelector('meta[name="csrf-token"]');
  29. if (token) {
  30. window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
  31. } else {
  32. console.error('CSRF token not found.');
  33. }
  34. Vue.use(VueRouter);
  35. Vue.use(Vuex);
  36. Vue.use(VueBlurHash);
  37. Vue.use(VueCarousel);
  38. Vue.use(BootstrapVue);
  39. Vue.use(InfiniteLoading);
  40. Vue.use(Loading);
  41. Vue.use(VueI18n);
  42. Vue.use(VueTimeago, {
  43. name: 'Timeago',
  44. locale: 'en'
  45. });
  46. Vue.component(
  47. 'photo-presenter',
  48. require('./components/presenter/PhotoPresenter.vue').default
  49. );
  50. Vue.component(
  51. 'video-presenter',
  52. require('./components/presenter/VideoPresenter.vue').default
  53. );
  54. Vue.component(
  55. 'photo-album-presenter',
  56. require('./components/presenter/PhotoAlbumPresenter.vue').default
  57. );
  58. Vue.component(
  59. 'video-album-presenter',
  60. require('./components/presenter/VideoAlbumPresenter.vue').default
  61. );
  62. Vue.component(
  63. 'mixed-album-presenter',
  64. require('./components/presenter/MixedAlbumPresenter.vue').default
  65. );
  66. Vue.component(
  67. 'navbar',
  68. require('./../components/landing/sections/nav.vue').default
  69. );
  70. Vue.component(
  71. 'footer-component',
  72. require('./../components/landing/sections/footer.vue').default
  73. );
  74. import IndexComponent from "./../components/landing/Index.vue";
  75. import DirectoryComponent from "./../components/landing/Directory.vue";
  76. import ExploreComponent from "./../components/landing/Explore.vue";
  77. import NotFoundComponent from "./../components/landing/NotFound.vue";
  78. const router = new VueRouter({
  79. mode: "history",
  80. linkActiveClass: "",
  81. linkExactActiveClass: "active",
  82. routes: [
  83. {
  84. path: "/",
  85. component: IndexComponent
  86. },
  87. {
  88. path: "/web/directory",
  89. component: DirectoryComponent
  90. },
  91. {
  92. path: "/web/explore",
  93. component: ExploreComponent
  94. },
  95. {
  96. path: "/*",
  97. component: NotFoundComponent,
  98. props: true
  99. },
  100. ],
  101. scrollBehavior(to, from, savedPosition) {
  102. if (to.hash) {
  103. return {
  104. selector: `[id='${to.hash.slice(1)}']`
  105. };
  106. } else {
  107. return { x: 0, y: 0 };
  108. }
  109. }
  110. });
  111. function lss(name, def) {
  112. let key = 'pf_m2s.' + name;
  113. let ls = window.localStorage;
  114. if(ls.getItem(key)) {
  115. let val = ls.getItem(key);
  116. if(['pl', 'color-scheme'].includes(name)) {
  117. return val;
  118. }
  119. return ['true', true].includes(val);
  120. }
  121. return def;
  122. }
  123. const store = new Vuex.Store({
  124. state: {
  125. version: 1,
  126. hideCounts: true,
  127. autoloadComments: false,
  128. newReactions: false,
  129. fixedHeight: false,
  130. profileLayout: 'grid',
  131. showDMPrivacyWarning: true,
  132. relationships: {},
  133. emoji: [],
  134. colorScheme: lss('color-scheme', 'system'),
  135. },
  136. getters: {
  137. getVersion: state => {
  138. return state.version;
  139. },
  140. getHideCounts: state => {
  141. return state.hideCounts;
  142. },
  143. getAutoloadComments: state => {
  144. return state.autoloadComments;
  145. },
  146. getNewReactions: state => {
  147. return state.newReactions;
  148. },
  149. getFixedHeight: state => {
  150. return state.fixedHeight;
  151. },
  152. getProfileLayout: state => {
  153. return state.profileLayout;
  154. },
  155. getRelationship: (state) => (id) => {
  156. return state.relationships[id];
  157. },
  158. getCustomEmoji: state => {
  159. return state.emoji;
  160. },
  161. getColorScheme: state => {
  162. return state.colorScheme;
  163. },
  164. getShowDMPrivacyWarning: state => {
  165. return state.showDMPrivacyWarning;
  166. }
  167. },
  168. mutations: {
  169. setVersion(state, value) {
  170. state.version = value;
  171. },
  172. setHideCounts(state, value) {
  173. localStorage.setItem('pf_m2s.hc', value);
  174. state.hideCounts = value;
  175. },
  176. setAutoloadComments(state, value) {
  177. localStorage.setItem('pf_m2s.ac', value);
  178. state.autoloadComments = value;
  179. },
  180. setNewReactions(state, value) {
  181. localStorage.setItem('pf_m2s.nr', value);
  182. state.newReactions = value;
  183. },
  184. setFixedHeight(state, value) {
  185. localStorage.setItem('pf_m2s.fh', value);
  186. state.fixedHeight = value;
  187. },
  188. setProfileLayout(state, value) {
  189. localStorage.setItem('pf_m2s.pl', value);
  190. state.profileLayout = value;
  191. },
  192. updateRelationship(state, relationships) {
  193. relationships.forEach((relationship) => {
  194. Vue.set(state.relationships, relationship.id, relationship)
  195. })
  196. },
  197. updateCustomEmoji(state, emojis) {
  198. state.emoji = emojis;
  199. },
  200. setColorScheme(state, value) {
  201. if(state.colorScheme == value) {
  202. return;
  203. }
  204. localStorage.setItem('pf_m2s.color-scheme', value);
  205. state.colorScheme = value;
  206. const name = value == 'system' ? '' : (value == 'light' ? 'force-light-mode' : 'force-dark-mode');
  207. document.querySelector("body").className = name;
  208. if(name != 'system') {
  209. const payload = name == 'force-dark-mode' ? { dark_mode: 'on' } : {};
  210. axios.post('/settings/labs', payload);
  211. }
  212. },
  213. setShowDMPrivacyWarning(state, value) {
  214. localStorage.setItem('pf_m2s.dmpwarn', value);
  215. state.showDMPrivacyWarning = value;
  216. }
  217. },
  218. });
  219. let i18nMessages = {
  220. en: require('./i18n/en.json'),
  221. ar: require('./i18n/ar.json'),
  222. ca: require('./i18n/ca.json'),
  223. de: require('./i18n/de.json'),
  224. el: require('./i18n/el.json'),
  225. es: require('./i18n/es.json'),
  226. eu: require('./i18n/eu.json'),
  227. fr: require('./i18n/fr.json'),
  228. he: require('./i18n/he.json'),
  229. gd: require('./i18n/gd.json'),
  230. gl: require('./i18n/gl.json'),
  231. id: require('./i18n/id.json'),
  232. it: require('./i18n/it.json'),
  233. ja: require('./i18n/ja.json'),
  234. nl: require('./i18n/nl.json'),
  235. pl: require('./i18n/pl.json'),
  236. pt: require('./i18n/pt.json'),
  237. ru: require('./i18n/ru.json'),
  238. uk: require('./i18n/uk.json'),
  239. vi: require('./i18n/vi.json'),
  240. };
  241. let locale = document.querySelector('html').getAttribute('lang');
  242. const i18n = new VueI18n({
  243. locale: locale, // set locale
  244. fallbackLocale: 'en',
  245. messages: i18nMessages
  246. });
  247. sync(store, router);
  248. const App = new Vue({
  249. el: '#content',
  250. i18n,
  251. router,
  252. store
  253. });