summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/misc.js
blob: 1b2ff3a7c561d7c3c40d9537722e5a024ad3e304 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
 * Misc
 */

import store from './utils/store';
import { $ } from './utils/dom';

let touchMoved = false;

function formResult({target, detail}) {

  const elements = {
    '#description-form': '.image-description',
    '#uploader-form': '.image_uploader',
    '#source-form': '#image-source',
    '#thumbnail-form': '.image-thumbnail__container'
  };

  function showResult(resultEl, formEl, response) {
    resultEl.innerHTML = response;
    resultEl.classList.remove('hidden');
    formEl.classList.add('hidden');
    formEl.querySelector('input[type="submit"]').disabled = false;
  }

  for (const element in elements) {
    if (target.matches(element)) detail.text().then(text => showResult($(elements[element]), target, text));
  }

}

function revealSpoiler(event) {

  const { target } = event;
  const spoiler = target.closest('.spoiler');
  let imgspoiler = target.closest('.spoiler .imgspoiler, .spoiler-revealed .imgspoiler');
  const showContainer = target.closest('.image-show-container');

  // Prevent reveal if touchend came after touchmove event
  if (touchMoved) {
    touchMoved = false;
    return;
  }

  if (spoiler) {
    if (showContainer) {
      const imageShow = showContainer.querySelector('.image-show');
      if (!imageShow.classList.contains('hidden') && imageShow.classList.contains('spoiler-pending')) {
        imageShow.classList.remove('spoiler-pending');
        return;
      }
    }

    spoiler.classList.remove('spoiler');
    spoiler.classList.add('spoiler-revealed');
    // Prevent click-through to links on mobile platforms
    if (event.type === 'touchend') event.preventDefault();

    if (!imgspoiler) {
      imgspoiler = spoiler.querySelector('.imgspoiler');
    }
  }

  if (imgspoiler) {
    imgspoiler.classList.remove('imgspoiler');
    imgspoiler.classList.add('imgspoiler-revealed');
    if (event.type === 'touchend' && !event.defaultPrevented) {
      event.preventDefault();
    }
  }

}

function setupEvents() {
  const extrameta = $('#extrameta');

  if (store.get('hide_uploader') && extrameta) extrameta.classList.add('hidden');

  document.addEventListener('fetchcomplete', formResult);
  document.addEventListener('click', revealSpoiler);
  document.addEventListener('touchend', revealSpoiler);
  document.addEventListener('touchmove', () => touchMoved = true);
}

function cleanIrcNickname(username) {
    return username.replace(' ', '_').replaceAll(/[^a-zA-Z0-9_\-`\[\]{}]/g, '');
}

/* Find elements that require a username substitution in them and do so. */
function setupUsernameSubstitutions() {
    [].forEach.call(document.getElementsByClassName('js-username-substitution'), element => {
        const field = element.getAttribute('data-substitute-field');
        const oldValue = element.getAttribute(field);
        const usernameReplacement = window.booru.userName || ('Anon' + (Math.floor(9999 * Math.random())));

        element.setAttribute(field, oldValue.replace('${username}', cleanIrcNickname(usernameReplacement)));
    });
}

export { setupEvents, setupUsernameSubstitutions };