Skip to content

Commit e03477e

Browse files
committed
feat(svelte): support open-in functionality with svelte components router
1 parent 6610feb commit e03477e

File tree

6 files changed

+97
-2
lines changed

6 files changed

+97
-2
lines changed

scripts/build-svelte.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ async function buildSvelte(cb) {
1313
const buildPath = getOutput();
1414

1515
const files = fs.readdirSync('src/svelte/components').filter((file) => file.indexOf('.d.ts') < 0);
16+
const svelteShared = fs
17+
.readdirSync('src/svelte/shared')
18+
.filter((file) => file.indexOf('.svelte') > 0);
1619
const componentImports = [];
1720
const componentExports = [];
1821
const svelteComponents = [];
@@ -47,6 +50,9 @@ async function buildSvelte(cb) {
4750
`${buildPath}/svelte/components/${fileName}`,
4851
);
4952
});
53+
svelteShared.forEach((fileName) => {
54+
fs.copyFileSync(`src/svelte/shared/${fileName}`, `${buildPath}/svelte/shared/${fileName}`);
55+
});
5056

5157
const esmContent = fs.readFileSync(`${buildPath}/svelte/framework7-svelte.js`, 'utf-8');
5258

src/react/shared/router-open-in.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ export const routerOpenIn = (router, url, options) => {
7070
const parts = options.openIn.split(':');
7171
const side = parts[1] || 'left';
7272
const effect = parts[2] || 'cover';
73-
params.targetEl = options.clickedEl || options.targetEl;
7473
params.component = function DynamicPanel() {
7574
return (
7675
<Panel side={side} effect={effect} className="panel-router-open-in" data-url={url}>

src/svelte/shared/components-router.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint no-underscore-dangle: "off" */
22
import { app } from './f7';
33
import { extend, getComponentId } from './utils';
4+
import { routerOpenIn } from './router-open-in';
45

56
const getChildrenArray = (el) => {
67
const arr = [];
@@ -18,6 +19,9 @@ const hasSameChildren = (childrenBefore, childrenAfter) => {
1819

1920
export default {
2021
proto: {
22+
openIn(router, navigateUrl, options) {
23+
return routerOpenIn(router, navigateUrl, options);
24+
},
2125
pageComponentLoader({ routerEl, component, options, resolve, reject }) {
2226
const router = this;
2327
const routerId = router.id;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<script>
2+
import Popup from '../components/popup.svelte';
3+
import View from '../components/view.svelte';
4+
import LoginScreen from '../components/login-screen.svelte';
5+
import Sheet from '../components/sheet.svelte';
6+
import Popover from '../components/popover.svelte';
7+
import Panel from '../components/panel.svelte';
8+
9+
export let openIn;
10+
export let url;
11+
export let viewSelector;
12+
export let targetEl;
13+
export let side;
14+
export let effect;
15+
</script>
16+
17+
{#if openIn === 'popup'}
18+
<Popup className="popup-router-open-in" data-url={url}>
19+
<View linksView={viewSelector} {url} ignoreOpenIn />
20+
</Popup>
21+
{/if}
22+
{#if openIn === 'loginScreen'}
23+
<LoginScreen className="login-screen-router-open-in" data-url={url}>
24+
<View linksView={viewSelector} {url} ignoreOpenIn />
25+
</LoginScreen>
26+
{/if}
27+
{#if openIn === 'sheet'}
28+
<Sheet className="sheet-modal-router-open-in" data-url={url}>
29+
<View linksView={viewSelector} {url} ignoreOpenIn />
30+
</Sheet>
31+
{/if}
32+
{#if openIn === 'popover'}
33+
<Popover className="popover-router-open-in" {targetEl} data-url={url}>
34+
<View linksView={viewSelector} {url} ignoreOpenIn />
35+
</Popover>
36+
{/if}
37+
{#if openIn.indexOf('panel') === 0}
38+
<Panel {side} {effect} className="panel-router-open-in" data-url={url}>
39+
<View linksView={viewSelector} {url} ignoreOpenIn />
40+
</Panel>
41+
{/if}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import RouterOpenInComponent from './router-open-in-component.svelte';
2+
3+
export const routerOpenIn = (router, url, options) => {
4+
const navigateOptions = {
5+
url,
6+
route: {
7+
path: url,
8+
options: {
9+
...options,
10+
openIn: undefined,
11+
props: {
12+
...(options.props || {}),
13+
url,
14+
openIn: options.openIn,
15+
viewSelector: router.view.selector,
16+
},
17+
},
18+
},
19+
};
20+
21+
const params = {
22+
...options,
23+
};
24+
params.component = RouterOpenInComponent;
25+
if (options.openIn === 'popup') {
26+
navigateOptions.route.popup = params;
27+
}
28+
if (options.openIn === 'loginScreen') {
29+
navigateOptions.route.loginScreen = params;
30+
}
31+
if (options.openIn === 'sheet') {
32+
navigateOptions.route.sheet = params;
33+
}
34+
if (options.openIn === 'popover') {
35+
params.targetEl = options.clickedEl || options.targetEl;
36+
navigateOptions.route.popover = params;
37+
navigateOptions.route.options.props.targetEl = params.targetEl;
38+
}
39+
if (options.openIn.indexOf('panel') >= 0) {
40+
const parts = options.openIn.split(':');
41+
navigateOptions.route.options.props.side = parts[1] || 'left';
42+
navigateOptions.route.options.props.effect = parts[2] || 'cover';
43+
navigateOptions.route.panel = params;
44+
}
45+
return router.navigate(navigateOptions);
46+
};

src/vue/shared/router-open-in.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ export const routerOpenIn = (router, url, options) => {
7676
const parts = options.openIn.split(':');
7777
const side = parts[1] || 'left';
7878
const effect = parts[2] || 'cover';
79-
params.targetEl = options.clickedEl || options.targetEl;
8079
params.component = {
8180
setup() {
8281
return () =>

0 commit comments

Comments
 (0)