From 45831bcba9f8bbf225d4d723243c04c2fb7a3767 Mon Sep 17 00:00:00 2001 From: flarum-bot Date: Thu, 2 Dec 2021 22:08:46 +0000 Subject: [PATCH] Bundled output for commit 06d72141a028b559ae66ec0f5604c309927031a5 Includes transpiled JS/TS. [skip ci] --- js/dist/admin.js | 2 +- js/dist/admin.js.map | 2 +- js/dist/forum.js | 2 +- js/dist/forum.js.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/dist/admin.js b/js/dist/admin.js index 36df64f..d2bc06d 100755 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -module.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=19)}([function(e,t,n){"use strict";var r=n(8),o=n.n(r),i="fof-nightmode.default_theme",a={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){var e;return Number.parseInt((null==(e=o.a.data.settings)?void 0:e[i])||o.a.data[i])||0}};t.a=a},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return c})),n.d(t,"b",(function(){return u}));var r=n(4),o=n(0),i="flarum_nightmode",a=function(){var e=r.get(i);return e||"0"===e?Number(e):o.a.DEFAULT()},c=function(e){return r.set(i,e,{sameSite:"lax",secure:"https:"===location.protocol})},u=function(){return r.remove(i)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return s}));var r=n(5),o=n(10),i=n.n(o),a=n(0),c=n(7),u=n(3);function s(){var e=app.session.user;e?(e.preferences().fofNightMode_perDevice&&Object(c.a)(),l(Object(u.a)())):l(a.a.DEFAULT())}function f(){return{day:app.data["fof-nightmode.assets.day"],night:app.data["fof-nightmode.assets.night"]}}function l(e){if(e===a.a.DARK)d("night");else if(e===a.a.LIGHT)d("day");else{d(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}}function d(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),n=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(t&&n){if(Object(u.a)()===a.a.AUTO)return;var r=document.createElement("link");"onload"in r?r.onload=function(){t.remove(),n.remove()}:(t.remove(),n.remove()),r.rel="stylesheet",r.className="nightmode",r.href=f()[e],document.head.append(r)}else{var o=t||n||document.querySelector("link.nightmode[rel=stylesheet]"),i=f()[e];i!==o.href&&(o.href=i,o.className="nightmode")}}t.a=function(){Object(r.extend)(i.a.prototype,"oninit",s)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(0),o=n(1);function i(){var e,t=app.session.user,n=t&&!!t.preferences().fofNightMode_perDevice,i=t&&t.preferences().fofNightMode;return n?e=Object(o.a)():"number"==typeof i&&-1!==i&&(e=i),"number"==typeof e?e:r.a.DEFAULT()}},function(e,t,n){"use strict";var r=this&&this.__assign||function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n Number.parseInt(app.data.settings?.[KEY] || app.data[KEY]) || 0,\n};\n\nexport default Themes;\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:',\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","import { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default () => {\n extend(Page.prototype, 'oninit', setTheme);\n};\n\nexport function setTheme() {\n const { user } = app.session;\n\n if (!user) {\n // Default to automatic theme when visiting as guest\n setThemeFromID(Themes.DEFAULT());\n return;\n }\n\n const PerDevice = user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n}\n","import Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = user && !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","module.exports = flarum.core.compat['common/extend'];","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","module.exports = flarum.core.compat['common/app'];","module.exports = flarum.core.compat['admin/app'];","module.exports = flarum.core.compat['common/components/Page'];","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport Themes from '../common/Themes';\n\nfunction populateThemes() {\n let options = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`);\n });\n\n return options;\n}\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData\n .for('fof-nightmode')\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: populateThemes(),\n })\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n type: 'hidden',\n });\n\n setSelectedTheme();\n});\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/./src/common/Themes.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/./src/forum/getTheme.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/external \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/external \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/external \"flarum.core.compat['admin/app']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./src/admin/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","KEY","Themes","AUTO","LIGHT","DARK","DEFAULT","Number","parseInt","app","data","settings","Cookies","set","val","sameSite","secure","location","protocol","remove","setTheme","user","session","preferences","fofNightMode_perDevice","fixInvalidThemeSetting","setThemeFromID","getTheme","getUrls","day","night","theme","setStyle","window","matchMedia","matches","type","light","document","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","extend","Page","IsUsingPerDeviceSettings","SelectedTheme","fofNightMode","__assign","this","assign","arguments","length","apply","stringifyAttribute","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","flarum","core","compat","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","initializers","add","options","extensionData","registerSetting","label","translator","trans","setting","keys","forEach","toLowerCase","setSelectedTheme"],"mappings":"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","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 19);\n","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst KEY = 'fof-nightmode.default_theme';\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => Number.parseInt(app.data.settings?.[KEY] || app.data[KEY]) || 0,\n};\n\nexport default Themes;\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:',\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","import { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default () => {\n extend(Page.prototype, 'oninit', setTheme);\n};\n\nexport function setTheme() {\n const { user } = app.session;\n\n if (!user) {\n // Default to automatic theme when visiting as guest\n setThemeFromID(Themes.DEFAULT());\n return;\n }\n\n const PerDevice = user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n}\n","import Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = user && !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","module.exports = flarum.core.compat['common/extend'];","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","module.exports = flarum.core.compat['common/app'];","module.exports = flarum.core.compat['admin/app'];","module.exports = flarum.core.compat['common/components/Page'];","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport Themes from '../common/Themes';\n\nfunction populateThemes() {\n let options = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`);\n });\n\n return options;\n}\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData\n .for('fof-nightmode')\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: populateThemes(),\n })\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n type: 'hidden',\n });\n\n setSelectedTheme();\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index 5185697..2a9bad0 100755 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,2 @@ -module.exports=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=18)}([function(e,t,n){"use strict";var o=n(8),r=n.n(o),c="fof-nightmode.default_theme",i={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){var e;return Number.parseInt((null==(e=r.a.data.settings)?void 0:e[c])||r.a.data[c])||0}};t.a=i},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var o=n(4),r=n(0),c="flarum_nightmode",i=function(){var e=o.get(c);return e||"0"===e?Number(e):r.a.DEFAULT()},a=function(e){return o.set(c,e,{sameSite:"lax",secure:"https:"===location.protocol})},s=function(){return o.remove(c)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u}));var o=n(5),r=n(10),c=n.n(r),i=n(0),a=n(7),s=n(3);function u(){var e=app.session.user;e?(e.preferences().fofNightMode_perDevice&&Object(a.a)(),p(Object(s.a)())):p(i.a.DEFAULT())}function f(){return{day:app.data["fof-nightmode.assets.day"],night:app.data["fof-nightmode.assets.night"]}}function p(e){if(e===i.a.DARK)m("night");else if(e===i.a.LIGHT)m("day");else{m(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}}function m(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),n=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(t&&n){if(Object(s.a)()===i.a.AUTO)return;var o=document.createElement("link");"onload"in o?o.onload=function(){t.remove(),n.remove()}:(t.remove(),n.remove()),o.rel="stylesheet",o.className="nightmode",o.href=f()[e],document.head.append(o)}else{var r=t||n||document.querySelector("link.nightmode[rel=stylesheet]"),c=f()[e];c!==r.href&&(r.href=c,r.className="nightmode")}}t.a=function(){Object(o.extend)(c.a.prototype,"oninit",u)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var o=n(0),r=n(1);function c(){var e,t=app.session.user,n=t&&!!t.preferences().fofNightMode_perDevice,c=t&&t.preferences().fofNightMode;return n?e=Object(r.a)():"number"==typeof c&&-1!==c&&(e=c),"number"==typeof e?e:o.a.DEFAULT()}},function(e,t,n){"use strict";var o=this&&this.__assign||function(){return(o=Object.assign||function(e){for(var t,n=1,o=arguments.length;n Number.parseInt(app.data.settings?.[KEY] || app.data[KEY]) || 0,\n};\n\nexport default Themes;\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:',\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","import { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default () => {\n extend(Page.prototype, 'oninit', setTheme);\n};\n\nexport function setTheme() {\n const { user } = app.session;\n\n if (!user) {\n // Default to automatic theme when visiting as guest\n setThemeFromID(Themes.DEFAULT());\n return;\n }\n\n const PerDevice = user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n}\n","import Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = user && !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","module.exports = flarum.core.compat['common/extend'];","module.exports = flarum.core.compat['forum/app'];","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","module.exports = flarum.core.compat['common/app'];","module.exports = flarum.core.compat['common/components/Page'];","module.exports = flarum.core.compat['common/components/SettingsPage'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/components/SessionDropdown'];","module.exports = flarum.core.compat['common/components/LoadingIndicator'];","module.exports = flarum.core.compat['common/components/Select'];","module.exports = flarum.core.compat['common/components/FieldSet'];","module.exports = flarum.core.compat['common/components/Switch'];","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\n\nimport SettingsPage from 'flarum/common/components/SettingsPage';\nimport Button from 'flarum/common/components/Button';\nimport SessionDropdown from 'flarum/common/components/SessionDropdown';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Select from 'flarum/common/components/Select';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\n\nimport { setTheme } from '../common/setSelectedTheme';\nimport fixInvalidThemeSetting from './fixInvalidThemeSetting';\nimport * as perDevice from './helpers/perDeviceSetting';\nimport getTheme from './getTheme';\nimport Themes from '../common/Themes';\n\n// custom function for translations makes it a lot cleaner\nconst trans = (key) => app.translator.trans(`fof-nightmode.forum.user.settings.${key}`);\n\nexport default function () {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n const { user } = app.session;\n\n const PerDevice = !!user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const currentTheme = getTheme();\n\n items.add(\n 'fof-nightmode',\n FieldSet.component(\n {\n label: trans('heading'),\n className: 'Settings-theme',\n },\n [\n

{trans('description')}

,\n

{trans('description2')}

,\n Switch.component(\n {\n className: 'Settings-theme--per_device_cb',\n state: PerDevice,\n onchange: (checked) => {\n if (checked) {\n // save current theme as this device's default\n perDevice.set(currentTheme);\n } else {\n perDevice.remove();\n }\n\n user\n .savePreferences({\n fofNightMode_perDevice: checked,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n },\n },\n trans('device_specific_setting_checkbox')\n ),\n Select.component({\n value: currentTheme,\n className: 'Settings-theme--input',\n onchange: (e) => {\n if (PerDevice) {\n perDevice.set(e);\n\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: Number.parseInt(e),\n })\n .then(() => {\n m.redraw();\n\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n options: [trans('options.auto'), trans('options.day'), trans('options.night')],\n }),\n

\n {currentTheme === Themes.AUTO\n ? trans('option_descriptions.auto')\n : currentTheme === Themes.LIGHT\n ? trans('option_descriptions.day')\n : currentTheme === Themes.DARK\n ? trans('option_descriptions.night')\n : // prevents nasty paragraph switching\n LoadingIndicator.component()}\n

,\n ]\n )\n );\n });\n\n extend(SessionDropdown.prototype, 'items', function (items) {\n if (!app.session.user) return;\n\n const user = app.session.user;\n const theme = getTheme();\n const isLight = theme === Themes.LIGHT || (theme === Themes.AUTO && !window.matchMedia('(prefers-color-scheme: dark)').matches);\n\n // Add night mode link to session dropdown\n items.add(\n isLight ? 'nightmode' : 'daymode',\n Button.component(\n {\n icon: `far fa-${isLight ? 'moon' : 'sun'}`,\n onclick: () => {\n const val = isLight ? Themes.DARK : Themes.LIGHT;\n\n if (!!user.preferences().fofNightMode_perDevice) {\n perDevice.set(val);\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: val,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n },\n app.translator.trans(`fof-nightmode.forum.${isLight ? 'night' : 'day'}`)\n ),\n -1\n );\n });\n}\n","import app from 'flarum/forum/app';\nimport addSettingsItems from './addSettingsItems';\nimport setSelectedTheme from '../common/setSelectedTheme';\n\napp.initializers.add('fof-nightmode', () => {\n addSettingsItems();\n setSelectedTheme();\n});\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/./src/common/Themes.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/./src/forum/getTheme.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/external \"flarum.core.compat['forum/app']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/external \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/SettingsPage']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/Button']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/SessionDropdown']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/Select']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/FieldSet']\"","webpack://@fof/nightmode/external \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/nightmode/./src/forum/addSettingsItems.js","webpack://@fof/nightmode/./src/forum/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","KEY","Themes","AUTO","LIGHT","DARK","DEFAULT","Number","parseInt","app","data","settings","Cookies","set","val","sameSite","secure","location","protocol","remove","setTheme","user","session","preferences","fofNightMode_perDevice","fixInvalidThemeSetting","setThemeFromID","getTheme","getUrls","day","night","theme","setStyle","window","matchMedia","matches","type","light","document","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","extend","Page","IsUsingPerDeviceSettings","SelectedTheme","fofNightMode","__assign","this","assign","arguments","length","apply","stringifyAttribute","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","flarum","core","compat","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","trans","translator","initializers","add","SettingsPage","items","PerDevice","doesNotSupportAuto","currentTheme","options","0","1","2","forum","attribute","FieldSet","component","label","class","Switch","state","onchange","checked","perDevice","savePreferences","then","Select","redraw","LoadingIndicator","SessionDropdown","isLight","Button","icon","onclick","setSelectedTheme"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst KEY = 'fof-nightmode.default_theme';\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => Number.parseInt(app.data.settings?.[KEY] || app.data[KEY]) || 0,\n};\n\nexport default Themes;\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:',\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","import { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default () => {\n extend(Page.prototype, 'oninit', setTheme);\n};\n\nexport function setTheme() {\n const { user } = app.session;\n\n if (!user) {\n // Default to automatic theme when visiting as guest\n setThemeFromID(Themes.DEFAULT());\n return;\n }\n\n const PerDevice = user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n}\n","import Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = user && !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","module.exports = flarum.core.compat['forum/app'];","module.exports = flarum.core.compat['common/extend'];","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","module.exports = flarum.core.compat['common/app'];","module.exports = flarum.core.compat['common/components/Page'];","module.exports = flarum.core.compat['common/components/SettingsPage'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/components/SessionDropdown'];","module.exports = flarum.core.compat['common/components/LoadingIndicator'];","module.exports = flarum.core.compat['common/components/Select'];","module.exports = flarum.core.compat['common/components/FieldSet'];","module.exports = flarum.core.compat['common/components/Switch'];","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\n\nimport SettingsPage from 'flarum/common/components/SettingsPage';\nimport Button from 'flarum/common/components/Button';\nimport SessionDropdown from 'flarum/common/components/SessionDropdown';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Select from 'flarum/common/components/Select';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\n\nimport { setTheme } from '../common/setSelectedTheme';\nimport fixInvalidThemeSetting from './fixInvalidThemeSetting';\nimport * as perDevice from './helpers/perDeviceSetting';\nimport getTheme from './getTheme';\nimport Themes from '../common/Themes';\n\n// custom function for translations makes it a lot cleaner\nconst trans = (key) => app.translator.trans(`fof-nightmode.forum.user.settings.${key}`);\n\nexport default function () {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n const { user } = app.session;\n\n const PerDevice = !!user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const doesNotSupportAuto = !window.matchMedia('not all and (prefers-color-scheme), (prefers-color-scheme)').matches;\n\n let currentTheme = getTheme();\n\n const options = { 0: trans('options.auto'), 1: trans('options.day'), 2: trans('options.night') };\n\n if (doesNotSupportAuto) {\n delete options['0'];\n\n if (currentTheme === Themes.AUTO) {\n currentTheme = app.forum.attribute('fofNightMode_autoUnsupportedFallback');\n }\n }\n\n items.add(\n 'fof-nightmode',\n FieldSet.component(\n {\n label: trans('heading'),\n className: 'Settings-theme',\n },\n [\n

{trans('description')}

,\n

{trans('description2')}

,\n doesNotSupportAuto ?

{trans('auto_unsupported')}

: null,\n Switch.component(\n {\n className: 'Settings-theme--per_device_cb',\n state: PerDevice,\n onchange: (checked) => {\n if (checked) {\n // save current theme as this device's default\n perDevice.set(currentTheme);\n } else {\n perDevice.remove();\n }\n\n user\n .savePreferences({\n fofNightMode_perDevice: checked,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n },\n },\n trans('device_specific_setting_checkbox')\n ),\n Select.component({\n value: currentTheme,\n className: 'Settings-theme--input',\n onchange: (e) => {\n if (PerDevice) {\n perDevice.set(e);\n\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: e,\n })\n .then(() => {\n m.redraw();\n\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n options,\n }),\n

\n {currentTheme === Themes.AUTO\n ? trans('option_descriptions.auto')\n : currentTheme === Themes.LIGHT\n ? trans('option_descriptions.day')\n : currentTheme === Themes.DARK\n ? trans('option_descriptions.night')\n : // prevents nasty paragraph switching\n LoadingIndicator.component()}\n

,\n ]\n )\n );\n });\n\n extend(SessionDropdown.prototype, 'items', function (items) {\n if (!app.session.user) return;\n\n const user = app.session.user;\n const theme = getTheme();\n const isLight = theme === Themes.LIGHT || (theme === Themes.AUTO && !window.matchMedia('(prefers-color-scheme: dark)').matches);\n\n // Add night mode link to session dropdown\n items.add(\n isLight ? 'nightmode' : 'daymode',\n Button.component(\n {\n icon: `far fa-${isLight ? 'moon' : 'sun'}`,\n onclick: () => {\n const val = isLight ? Themes.DARK : Themes.LIGHT;\n\n if (!!user.preferences().fofNightMode_perDevice) {\n perDevice.set(val);\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: val,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n },\n app.translator.trans(`fof-nightmode.forum.${isLight ? 'night' : 'day'}`)\n ),\n -1\n );\n });\n}\n","import app from 'flarum/forum/app';\nimport addSettingsItems from './addSettingsItems';\nimport setSelectedTheme from '../common/setSelectedTheme';\n\napp.initializers.add('fof-nightmode', () => {\n addSettingsItems();\n setSelectedTheme();\n});\n"],"sourceRoot":""} \ No newline at end of file