mirror of
https://github.com/flarum/core.git
synced 2025-10-14 16:34:26 +02:00
Use Link component for links instead of mithril route patch (#2315)
This new component now also supports external links.
This commit is contained in:
committed by
GitHub
parent
b66d16e44b
commit
5ecb74fb59
@@ -1,43 +1,15 @@
|
||||
import extract from './extract';
|
||||
import Link from '../components/Link';
|
||||
import withAttr from './withAttr';
|
||||
import Stream from './Stream';
|
||||
|
||||
let deprecatedMPropWarned = false;
|
||||
let deprecatedMWithAttrWarned = false;
|
||||
|
||||
let deprecatedRouteWarned = false;
|
||||
|
||||
export default function patchMithril(global) {
|
||||
const defaultMithril = global.m;
|
||||
|
||||
/**
|
||||
* If the href URL of the link is the same as the current page path
|
||||
* we will not add a new entry to the browser history.
|
||||
*
|
||||
* This allows us to still refresh the Page component
|
||||
* without adding endless history entries.
|
||||
*
|
||||
* We also add the `force` attribute that adds a custom state key
|
||||
* for when you want to force a complete refresh of the Page
|
||||
*/
|
||||
const defaultLinkView = defaultMithril.route.Link.view;
|
||||
const modifiedLink = {
|
||||
view: function (vnode) {
|
||||
let { href, options = {} } = vnode.attrs;
|
||||
|
||||
if (href === m.route.get()) {
|
||||
if (!('replace' in options)) options.replace = true;
|
||||
}
|
||||
|
||||
if (extract(vnode.attrs, 'force')) {
|
||||
if (!('state' in options)) options.state = {};
|
||||
if (!('key' in options.state)) options.state.key = Date.now();
|
||||
}
|
||||
|
||||
vnode.attrs.options = options;
|
||||
|
||||
return defaultLinkView(vnode);
|
||||
},
|
||||
};
|
||||
|
||||
const modifiedMithril = function (comp, ...args) {
|
||||
const node = defaultMithril.apply(this, arguments);
|
||||
|
||||
@@ -48,28 +20,29 @@ export default function patchMithril(global) {
|
||||
modifiedMithril.bidi(node, node.attrs.bidi);
|
||||
}
|
||||
|
||||
// DEPRECATED, REMOVE BETA 15
|
||||
|
||||
// Allows us to use a "route" attr on links, which will automatically convert the link to one which
|
||||
// supports linking to other pages in the SPA without refreshing the document.
|
||||
if (node.attrs.route) {
|
||||
node.attrs.href = node.attrs.route;
|
||||
node.tag = modifiedLink;
|
||||
|
||||
// For some reason, m.route.Link does not like vnode.text, so if present, we
|
||||
// need to convert it to text vnodes and store it in children.
|
||||
if (node.text) {
|
||||
node.children = { tag: '#', children: node.text };
|
||||
if (!deprecatedRouteWarned) {
|
||||
deprecatedRouteWarned = true;
|
||||
console.warn('The route attr patch for links is deprecated, please use the Link component (flarum/components/Link) instead.');
|
||||
}
|
||||
|
||||
node.attrs.href = node.attrs.route;
|
||||
node.tag = Link;
|
||||
|
||||
delete node.attrs.route;
|
||||
}
|
||||
|
||||
// END DEPRECATED
|
||||
|
||||
return node;
|
||||
};
|
||||
|
||||
Object.keys(defaultMithril).forEach((key) => (modifiedMithril[key] = defaultMithril[key]));
|
||||
|
||||
modifiedMithril.route.Link = modifiedLink;
|
||||
|
||||
// BEGIN DEPRECATED MITHRIL 2 BC LAYER
|
||||
modifiedMithril.prop = modifiedMithril.stream = function (...args) {
|
||||
if (!deprecatedMPropWarned) {
|
||||
|
Reference in New Issue
Block a user