zmp-cli 3.15.7 → 3.15.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -1
- package/build/index.js +1 -1
- package/config/index.js +1 -1
- package/create/index.js +1 -1
- package/create/utils/generate-app-config.js +1 -1
- package/create/utils/generate-npm-scripts.js +1 -1
- package/create/utils/get-options.js +1 -1
- package/create/utils/npm-scripts.js +1 -1
- package/deploy/index.js +1 -1
- package/deploy/utils/get-options.js +1 -1
- package/deploy/utils/request-upload.js +1 -1
- package/deploy/utils/upload-app.js +1 -1
- package/index.js +1 -1
- package/login/index.js +1 -1
- package/login/utils/get-options.js +1 -1
- package/login/utils/zalo-login.js +1 -1
- package/migrate/icons/update-icon-v3.js +1 -1
- package/migrate/index.js +1 -1
- package/migrate/utils/get-options.js +1 -1
- package/migrate/utils/migrate-react.js +1 -1
- package/package.json +3 -2
- package/start/frame/index.html +264 -254
- package/start/index.js +1 -1
- package/sync/index-to-app-config.js +1 -1
- package/sync/index.js +1 -1
- package/utils/axios.js +1 -1
- package/utils/check-update.js +1 -1
- package/utils/constants.js +1 -1
- package/utils/env.js +1 -1
- package/utils/error.js +1 -1
- package/utils/find-files-by-ext.js +1 -1
- package/utils/find-free-port.js +1 -1
- package/utils/fs-extra.js +1 -1
- package/utils/generate-pages-map.js +1 -1
- package/utils/get-app-info.js +1 -1
- package/utils/get-current-project.js +1 -1
- package/utils/get-ip.js +1 -1
- package/utils/log.js +1 -1
- package/utils/node-blob.js +1 -1
- package/utils/resumable.d.js +1 -1
- package/utils/resumable.js +1 -1
- package/utils/spinner.js +1 -1
- package/utils/tunnel.js +1 -1
- package/create/init-zmp-ui.js +0 -1
- package/create/templates/app-parameters.js +0 -17
- package/create/templates/common/css/icons.css +0 -60
- package/create/templates/common/icons/512x512.png +0 -0
- package/create/templates/common/icons/apple-touch-icon.png +0 -0
- package/create/templates/common/icons/favicon.png +0 -0
- package/create/templates/common/postcss.config.js +0 -5
- package/create/templates/common/splash-2732x2732.png +0 -0
- package/create/templates/common/tailwind/postcss.config.js +0 -5
- package/create/templates/common/tailwind/tailwind.config.js +0 -9
- package/create/templates/common/tailwind/tailwind.css +0 -3
- package/create/templates/common/webpack/build.js +0 -3
- package/create/templates/copy-assets.js +0 -1
- package/create/templates/core/babel.config.js +0 -11
- package/create/templates/core/copy-assets.js +0 -15
- package/create/templates/core/generate-home-page.js +0 -121
- package/create/templates/core/generate-root.js +0 -248
- package/create/templates/core/generate-routes.js +0 -129
- package/create/templates/core/generate-scripts.js +0 -45
- package/create/templates/core/pages/404.html +0 -20
- package/create/templates/core/pages/about.html +0 -26
- package/create/templates/core/pages/catalog.html +0 -40
- package/create/templates/core/pages/dynamic-route.html +0 -115
- package/create/templates/core/pages/form.html +0 -258
- package/create/templates/core/pages/left-page-1.html +0 -24
- package/create/templates/core/pages/left-page-2.html +0 -23
- package/create/templates/core/pages/product.html +0 -36
- package/create/templates/core/pages/request-and-load.html +0 -35
- package/create/templates/core/pages/settings.html +0 -252
- package/create/templates/create-folders.js +0 -1
- package/create/templates/generate-config-xml.js +0 -11
- package/create/templates/generate-index.js +0 -24
- package/create/templates/generate-manifest.js +0 -1
- package/create/templates/generate-recoil.js +0 -44
- package/create/templates/generate-routes.js +0 -1
- package/create/templates/generate-scripts.js +0 -1
- package/create/templates/generate-service-worker.js +0 -120
- package/create/templates/generate-store.js +0 -77
- package/create/templates/generate-styles.js +0 -56
- package/create/templates/generate-webpack-config.js +0 -253
- package/create/templates/generate-zmp-custom.js +0 -23
- package/create/templates/react/babel.config.js +0 -12
- package/create/templates/react/components/app-items.jsx +0 -44
- package/create/templates/react/components/navbar-back.jsx +0 -25
- package/create/templates/react/components/user-card.jsx +0 -18
- package/create/templates/react/copy-assets.js +0 -1
- package/create/templates/react/generate-home-page.js +0 -81
- package/create/templates/react/generate-root.js +0 -55
- package/create/templates/react/generate-routes.js +0 -1
- package/create/templates/react/generate-scripts.js +0 -42
- package/create/templates/react/pages/404.js +0 -19
- package/create/templates/react/pages/about.js +0 -44
- package/create/templates/react/pages/catalog.js +0 -98
- package/create/templates/react/pages/dynamic-route.js +0 -72
- package/create/templates/react/pages/form.js +0 -132
- package/create/templates/react/pages/index copy.js +0 -1
- package/create/templates/react/pages/index.js +0 -1
- package/create/templates/react/pages/settings.js +0 -62
- package/create/templates/react/pages/user.js +0 -37
- package/create/templates/react/vite.config.js +0 -11
- package/create/templates/react-typescript/_tsconfig.json +0 -33
- package/create/templates/react-typescript/components/app-items.js +0 -46
- package/create/templates/react-typescript/components/index.js +0 -1
- package/create/templates/react-typescript/components/navbar-back.js +0 -33
- package/create/templates/react-typescript/components/user-card.js +0 -25
- package/create/templates/react-typescript/copy-assets.js +0 -1
- package/create/templates/react-typescript/generate-home-page.js +0 -81
- package/create/templates/react-typescript/generate-root.js +0 -50
- package/create/templates/react-typescript/generate-routes.js +0 -1
- package/create/templates/react-typescript/generate-scripts.js +0 -42
- package/create/templates/react-typescript/pages/404.js +0 -19
- package/create/templates/react-typescript/pages/about.js +0 -44
- package/create/templates/react-typescript/pages/catalog.js +0 -98
- package/create/templates/react-typescript/pages/dynamic-route.js +0 -72
- package/create/templates/react-typescript/pages/form.js +0 -132
- package/create/templates/react-typescript/pages/index.js +0 -1
- package/create/templates/react-typescript/pages/settings.js +0 -62
- package/create/templates/react-typescript/pages/user.js +0 -37
- package/create/templates/react-typescript/vite.config.js +0 -21
- package/create/templates/svelte/babel.config.js +0 -10
- package/create/templates/svelte/copy-assets.js +0 -1
- package/create/templates/svelte/generate-home-page.js +0 -122
- package/create/templates/svelte/generate-root.js +0 -177
- package/create/templates/svelte/generate-routes.js +0 -76
- package/create/templates/svelte/generate-scripts.js +0 -31
- package/create/templates/svelte/pages/404.svelte +0 -10
- package/create/templates/svelte/pages/about.svelte +0 -16
- package/create/templates/svelte/pages/catalog.svelte +0 -31
- package/create/templates/svelte/pages/dynamic-route.svelte +0 -34
- package/create/templates/svelte/pages/form.svelte +0 -175
- package/create/templates/svelte/pages/left-page-1.svelte +0 -13
- package/create/templates/svelte/pages/left-page-2.svelte +0 -12
- package/create/templates/svelte/pages/product.svelte +0 -21
- package/create/templates/svelte/pages/request-and-load.svelte +0 -21
- package/create/templates/svelte/pages/settings.svelte +0 -175
- package/create/templates/vue/babel.config.js +0 -10
- package/create/templates/vue/components/header.vue +0 -28
- package/create/templates/vue/components/sun-and-moon.vue +0 -34
- package/create/templates/vue/copy-assets.js +0 -1
- package/create/templates/vue/generate-home-page.js +0 -50
- package/create/templates/vue/generate-root.js +0 -40
- package/create/templates/vue/generate-routes.js +0 -1
- package/create/templates/vue/generate-scripts.js +0 -46
- package/create/templates/vue/global-components.d.js +0 -1
- package/create/templates/vue/global-components.d.ts +0 -121
- package/create/templates/vue/icons/moon.svg +0 -3
- package/create/templates/vue/icons/sun.svg +0 -3
- package/create/templates/vue/pages/404.vue +0 -12
- package/create/templates/vue/pages/about.vue +0 -15
- package/create/templates/vue/pages/catalog.vue +0 -39
- package/create/templates/vue/pages/dynamic-route.vue +0 -34
- package/create/templates/vue/pages/form.vue +0 -162
- package/create/templates/vue/pages/left-page-1.vue +0 -14
- package/create/templates/vue/pages/left-page-2.vue +0 -11
- package/create/templates/vue/pages/product.vue +0 -31
- package/create/templates/vue/pages/request-and-load.vue +0 -25
- package/create/templates/vue/pages/settings.vue +0 -18
- package/create/templates/vue/vite.config.js +0 -11
- package/create/templates/zaui/_tsconfig.json +0 -33
- package/create/templates/zaui/babel.config.js +0 -12
- package/create/templates/zaui/components/user-card.jsx +0 -16
- package/create/templates/zaui/copy-assets.js +0 -1
- package/create/templates/zaui/generate-home-page.js +0 -91
- package/create/templates/zaui/generate-root.js +0 -33
- package/create/templates/zaui/generate-routes.js +0 -1
- package/create/templates/zaui/generate-scripts.js +0 -25
- package/create/templates/zaui/generate-user-card.js +0 -40
- package/create/templates/zaui/pages/about.js +0 -112
- package/create/templates/zaui/pages/form.js +0 -106
- package/create/templates/zaui/pages/index.js +0 -1
- package/create/templates/zaui/pages/user.js +0 -92
- package/create/templates/zaui/vite.config.js +0 -11
- package/create/utils/colors.js +0 -1
- package/create/utils/generate-gitignore.js +0 -1
- package/create/utils/generate-package-json.js +0 -1
- package/create/utils/generate-readme.js +0 -1
- package/create/utils/indent.js +0 -1
- package/create/utils/string.js +0 -1
- package/create/utils/styles-extension.js +0 -1
- package/create/utils/template-if.js +0 -1
- package/start/generate-hr-config.js +0 -1
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../utils/indent");module.exports=e=>{let{name:a,template:i,theming:r,stateManagement:o}=e,{fillBars:s}=r,n="";return("single-view"===i||"blank"===i)&&(n=`
|
|
2
|
-
<p>Here is your blank ZMP app. Let's see what we have here.</p>
|
|
3
|
-
`),"split-view"===i&&(n=`
|
|
4
|
-
<p>This is an example of split view application layout, commonly used on tablets. The main approach of such kind of layout is that you can see different views at the same time.</p>
|
|
5
|
-
|
|
6
|
-
<p>Each view may have different layout, different navbar type (dynamic, fixed or static) or without navbar.</p>
|
|
7
|
-
|
|
8
|
-
<p>The fun thing is that you can easily control one view from another without any line of JavaScript just using "data-view" attribute on links.</p>
|
|
9
|
-
`),"tabs"===i&&(n=`
|
|
10
|
-
<p>Here is your blank ZMP app with tabs-layout. Let's see what we have here.</p>
|
|
11
|
-
`),t(0,`
|
|
12
|
-
import React from 'react';
|
|
13
|
-
${"blank"===i?`
|
|
14
|
-
import {
|
|
15
|
-
Page,
|
|
16
|
-
Navbar,
|
|
17
|
-
NavTitleLarge,
|
|
18
|
-
Card
|
|
19
|
-
} from 'zmp-framework/react';
|
|
20
|
-
`.trim():`
|
|
21
|
-
import {
|
|
22
|
-
Page,
|
|
23
|
-
Navbar,
|
|
24
|
-
NavTitleLarge,
|
|
25
|
-
List,
|
|
26
|
-
ListItem,
|
|
27
|
-
Card,
|
|
28
|
-
${"store"===o?"useStore,":""}
|
|
29
|
-
} from 'zmp-framework/react';${"recoil"===o?`
|
|
30
|
-
import { useRecoilValue } from 'recoil';
|
|
31
|
-
import { userState } from '../state';`:""}
|
|
32
|
-
import AppItems from '../components/app-items';
|
|
33
|
-
import UserCard from '../components/user-card';
|
|
34
|
-
`.trim()}
|
|
35
|
-
|
|
36
|
-
const HomePage = () => {
|
|
37
|
-
${"blank"!==i?"recoil"===o?"const user = useRecoilValue(userState);":"const user = useStore('user');":""}
|
|
38
|
-
return (
|
|
39
|
-
<Page name="home" ${"tabs"===i?"":"navbarLarge"}>${"tabs"!==i?`
|
|
40
|
-
{/* Top Navbar */}
|
|
41
|
-
<Navbar ${s?"fill":""}>
|
|
42
|
-
<NavTitleLarge>${a}</NavTitleLarge>
|
|
43
|
-
</Navbar>`:""}
|
|
44
|
-
{/* Page content */}
|
|
45
|
-
<Card inset>
|
|
46
|
-
${n.trim()}
|
|
47
|
-
</Card>
|
|
48
|
-
${"blank"!==i&&"tabs"!==i?`
|
|
49
|
-
{/* User info */}
|
|
50
|
-
<List>
|
|
51
|
-
<ListItem link="/user/">
|
|
52
|
-
<UserCard user={user} />
|
|
53
|
-
</ListItem>
|
|
54
|
-
</List>
|
|
55
|
-
|
|
56
|
-
{/* Grid apps */}
|
|
57
|
-
<AppItems />
|
|
58
|
-
|
|
59
|
-
{/* Route */}
|
|
60
|
-
<List>
|
|
61
|
-
<ListItem title="Dynamic (Component) Route" link="/dynamic-route/?blog=45&post=125&foo=bar" />
|
|
62
|
-
<ListItem title="Default Route (404)" link="/something-that-doesnt-exist" />
|
|
63
|
-
<ListItem title="About" link="/about/" />
|
|
64
|
-
</List>
|
|
65
|
-
`.trim():""}${"tabs"===i?`
|
|
66
|
-
{/* Grid apps */}
|
|
67
|
-
<AppItems />
|
|
68
|
-
|
|
69
|
-
{/* Route */}
|
|
70
|
-
<List>
|
|
71
|
-
<ListItem title="Dynamic (Component) Route" link="/dynamic-route/?blog=45&post=125&foo=bar" />
|
|
72
|
-
<ListItem title="Default Route (404)" link="/something-that-doesnt-exist" />
|
|
73
|
-
<ListItem title="About" link="/about/" />
|
|
74
|
-
</List>
|
|
75
|
-
`.trim():""}
|
|
76
|
-
</Page>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export default HomePage;
|
|
81
|
-
`).trim()};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("../../utils/template-if"),e=require("../../utils/indent"),a=require("../app-parameters");module.exports=t=>{let{theming:r,template:o,stateManagement:m}=t,n="";return("single-view"===o||"split-view"===o||"blank"===o)&&(n=e(0,`
|
|
2
|
-
{/* Your main view, should have "view-main" class */}
|
|
3
|
-
<View main className="safe-areas" url="/" />
|
|
4
|
-
`).trim()),"tabs"===o&&(n=e(0,`
|
|
5
|
-
{/* TabView container */}
|
|
6
|
-
<TabView className="safe-areas">
|
|
7
|
-
{/* Tabbar for switching Tab*/}
|
|
8
|
-
<Tabbar bottom id="app-tab-bar">
|
|
9
|
-
<Link tabLink="#view-home" iconZMP="zi-home" tabLinkActive>
|
|
10
|
-
Home
|
|
11
|
-
</Link>
|
|
12
|
-
<Link tabLink="#view-catalog" iconZMP="zi-list-1">
|
|
13
|
-
Catalog
|
|
14
|
-
</Link>
|
|
15
|
-
<Link tabLink="#view-settings" iconZMP="zi-setting">
|
|
16
|
-
Settings
|
|
17
|
-
</Link>
|
|
18
|
-
</Tabbar>
|
|
19
|
-
|
|
20
|
-
<View id="view-home" main tab tabActive url="/" />
|
|
21
|
-
<View id="view-catalog" name="catalog" tab url="/catalog/" />
|
|
22
|
-
<View id="view-settings" name="settings" tab url="/settings/" />
|
|
23
|
-
</TabView>
|
|
24
|
-
`)),e(0,`
|
|
25
|
-
import React from 'react';
|
|
26
|
-
${["blank","single-view"].indexOf(o)>=0?`
|
|
27
|
-
import { App, View } from 'zmp-framework/react';
|
|
28
|
-
`.trim():`
|
|
29
|
-
import { App, TabView, View, Tabbar, Link } from 'zmp-framework/react';
|
|
30
|
-
`.trim()}
|
|
31
|
-
${i("recoil"===m,()=>"import { RecoilRoot } from 'recoil';",()=>"import store from '../store';")}
|
|
32
|
-
|
|
33
|
-
const MyApp = () => {
|
|
34
|
-
// ZMP Parameters
|
|
35
|
-
const zmpparams = {
|
|
36
|
-
${e(8,a(t))}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
${`
|
|
40
|
-
return (${"recoil"===m?`
|
|
41
|
-
<RecoilRoot>`:""}
|
|
42
|
-
${e("recoil"===m?2:0,`<App {...zmpparams} ${r.darkTheme?"themeDark":""}>`)}
|
|
43
|
-
${e("recoil"===m?12:10,n)}
|
|
44
|
-
${e("recoil"===m?2:0,"</App>")}${"recoil"===m?`
|
|
45
|
-
</RecoilRoot>`:""}
|
|
46
|
-
);
|
|
47
|
-
`.trim()}
|
|
48
|
-
}
|
|
49
|
-
export default MyApp;
|
|
50
|
-
`).trim()};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";module.exports=t=>{let{template:e}=t;if("blank"===e)return[];let r=["/user","/form","/dynamic-route","/about","/404"];return"tabs"===e&&r.push("/catalog","/settings"),r};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../utils/template-if"),o=require("../../utils/indent"),e=require("../../utils/styles-extension");module.exports=r=>{let{cssPreProcessor:p,theming:m,customBuild:s,includeTailwind:i}=r,n="";return(n+=o(0,`
|
|
2
|
-
// Import React and ReactDOM
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { createRoot } from 'react-dom/client';
|
|
5
|
-
|
|
6
|
-
// Import ZMP
|
|
7
|
-
import ZMP from '${s?"./zmp-custom.js":"zmp-framework/core/lite-bundle"}';
|
|
8
|
-
|
|
9
|
-
// Import ZMP-React Plugin
|
|
10
|
-
import ZMPReact from 'zmp-framework/react';${i?`
|
|
11
|
-
|
|
12
|
-
// Import tailwind styles
|
|
13
|
-
import './css/tailwind.css';`:""}
|
|
14
|
-
|
|
15
|
-
// Import ZMP Styles
|
|
16
|
-
${t(s,()=>`
|
|
17
|
-
import './css/zmp-custom.less';
|
|
18
|
-
`,()=>`
|
|
19
|
-
import 'zmp-framework/${m.useUiKits?"zmp-bundle.min.css":"zmp.min.css"}';
|
|
20
|
-
`)}
|
|
21
|
-
|
|
22
|
-
// Import Icons and App Custom Styles
|
|
23
|
-
${t(m.iconFonts,()=>`
|
|
24
|
-
import './css/icons.css';
|
|
25
|
-
`)}
|
|
26
|
-
import './css/app.${e(p)}';
|
|
27
|
-
|
|
28
|
-
// Import App Component
|
|
29
|
-
import App from './components/app';
|
|
30
|
-
import appConfig from '../app-config.json';
|
|
31
|
-
|
|
32
|
-
if (!(window as any).APP_CONFIG) {
|
|
33
|
-
(window as any).APP_CONFIG = appConfig
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Init ZMP React Plugin
|
|
37
|
-
ZMP.use(ZMPReact)
|
|
38
|
-
|
|
39
|
-
// Mount React App
|
|
40
|
-
const root = createRoot(document.getElementById('app')!);
|
|
41
|
-
root.render(React.createElement(App));
|
|
42
|
-
`)).trim()};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../../utils/indent");module.exports=e=>t(0,`
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { Page, Card, Title, Box } from 'zmp-framework/react';
|
|
4
|
-
import NavbarBack from '../components/navbar-back';
|
|
5
|
-
|
|
6
|
-
const NotFoundPage = () => (
|
|
7
|
-
<Page>
|
|
8
|
-
<NavbarBack title="Not found" />
|
|
9
|
-
<Box mt="2">
|
|
10
|
-
<Card inset>
|
|
11
|
-
<Title>Sorry</Title>
|
|
12
|
-
<p>Requested content not found.</p>
|
|
13
|
-
</Card>
|
|
14
|
-
</Box>
|
|
15
|
-
</Page>
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
export default NotFoundPage;
|
|
19
|
-
`).trim();
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../../utils/indent");module.exports=o=>t(0,`
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { Actions, ActionsButton, ActionsGroup, ActionsLabel, Button, Card, Page, Box } from 'zmp-framework/react';
|
|
4
|
-
import NavbarBack from '../components/navbar-back';
|
|
5
|
-
|
|
6
|
-
const AboutPage = (props) => {
|
|
7
|
-
const [actionSheetOpened, setActionSheetOpened] = React.useState(false);
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<Page name="about">
|
|
11
|
-
<NavbarBack title="About" />
|
|
12
|
-
<Box mt="2">
|
|
13
|
-
<Card inset title="About My App">
|
|
14
|
-
<p>This is a demo ZMP App!</p>
|
|
15
|
-
</Card>
|
|
16
|
-
</Box>
|
|
17
|
-
<Box mb="4">
|
|
18
|
-
<Button
|
|
19
|
-
typeName="secondary"
|
|
20
|
-
responsive
|
|
21
|
-
onClick={() => setActionSheetOpened(true)}
|
|
22
|
-
>
|
|
23
|
-
Back
|
|
24
|
-
</Button>
|
|
25
|
-
</Box>
|
|
26
|
-
<Actions
|
|
27
|
-
opened={actionSheetOpened}
|
|
28
|
-
onActionsClosed={() => setActionSheetOpened(false)}
|
|
29
|
-
id="actions-two-groups"
|
|
30
|
-
>
|
|
31
|
-
<ActionsGroup>
|
|
32
|
-
<ActionsLabel>Are you sure?</ActionsLabel>
|
|
33
|
-
<ActionsButton onClick={() => props.zmprouter.back()}>Navigate back</ActionsButton>
|
|
34
|
-
</ActionsGroup>
|
|
35
|
-
<ActionsGroup>
|
|
36
|
-
<ActionsButton>Cancel</ActionsButton>
|
|
37
|
-
</ActionsGroup>
|
|
38
|
-
</Actions>
|
|
39
|
-
</Page>
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export default AboutPage;
|
|
44
|
-
`).trim();
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../../utils/indent");module.exports=e=>"recoil"===e.stateManagement?t(0,`
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { useRecoilState } from 'recoil';
|
|
4
|
-
import { Page, Title, List, ListItem, Box, Button } from 'zmp-framework/react';
|
|
5
|
-
import { productsState } from '../state';
|
|
6
|
-
|
|
7
|
-
const CatalogPage = () => {
|
|
8
|
-
const [products, setProducts] = useRecoilState(productsState)
|
|
9
|
-
|
|
10
|
-
const addProduct = () => {
|
|
11
|
-
setProducts(p => [
|
|
12
|
-
...p,
|
|
13
|
-
{
|
|
14
|
-
id: '4',
|
|
15
|
-
title: 'Apple iPhone 12',
|
|
16
|
-
description: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi tempora similique reiciendis, error nesciunt vero, blanditiis pariatur dolor, minima sed sapiente rerum, dolorem corrupti hic modi praesentium unde saepe perspiciatis.'
|
|
17
|
-
}
|
|
18
|
-
])
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<Page name="catalog">
|
|
23
|
-
<Box m="0" p="4">
|
|
24
|
-
<Title>Catalog</Title>
|
|
25
|
-
<List>
|
|
26
|
-
{products.map((product) => (
|
|
27
|
-
<ListItem
|
|
28
|
-
key={product.id}
|
|
29
|
-
title={product.title}
|
|
30
|
-
link={\`/product/\${product.id}/\`}
|
|
31
|
-
/>
|
|
32
|
-
))}
|
|
33
|
-
</List>
|
|
34
|
-
{products.length === 3 && (
|
|
35
|
-
<Box>
|
|
36
|
-
<Button responsive typeName="secondary" onClick={addProduct}>
|
|
37
|
-
Add Product
|
|
38
|
-
</Button>
|
|
39
|
-
</Box>
|
|
40
|
-
)}
|
|
41
|
-
</Box>
|
|
42
|
-
</Page>
|
|
43
|
-
);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export default CatalogPage;
|
|
47
|
-
`).trim():t(0,`
|
|
48
|
-
import React from "react";
|
|
49
|
-
import {
|
|
50
|
-
Page,
|
|
51
|
-
Title,
|
|
52
|
-
List,
|
|
53
|
-
ListItem,
|
|
54
|
-
Box,
|
|
55
|
-
Button,
|
|
56
|
-
useStore
|
|
57
|
-
} from "zmp-framework/react";
|
|
58
|
-
import store from "../store";
|
|
59
|
-
|
|
60
|
-
const CatalogPage = () => {
|
|
61
|
-
const products = useStore("products");
|
|
62
|
-
|
|
63
|
-
const addProduct = () => {
|
|
64
|
-
store.dispatch("addProduct", {
|
|
65
|
-
id: "4",
|
|
66
|
-
title: "Apple iPhone 12",
|
|
67
|
-
description:
|
|
68
|
-
"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi tempora similique reiciendis, error nesciunt vero, blanditiis pariatur dolor, minima sed sapiente rerum, dolorem corrupti hic modi praesentium unde saepe perspiciatis."
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
return (
|
|
73
|
-
<Page name="catalog">
|
|
74
|
-
<Box m="0" p="4">
|
|
75
|
-
<Title>Catalog</Title>
|
|
76
|
-
<List>
|
|
77
|
-
{products.map((product) => (
|
|
78
|
-
<ListItem
|
|
79
|
-
key={product.id}
|
|
80
|
-
title={product.title}
|
|
81
|
-
link={\`/product/\${product.id}/\`}
|
|
82
|
-
/>
|
|
83
|
-
))}
|
|
84
|
-
</List>
|
|
85
|
-
{products.length === 3 && (
|
|
86
|
-
<Box>
|
|
87
|
-
<Button responsive typeName="secondary" onClick={addProduct}>
|
|
88
|
-
Add Product
|
|
89
|
-
</Button>
|
|
90
|
-
</Box>
|
|
91
|
-
)}
|
|
92
|
-
</Box>
|
|
93
|
-
</Page>
|
|
94
|
-
);
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
export default CatalogPage;
|
|
98
|
-
`).trim();
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("../../../utils/indent");module.exports=e=>t(0,`
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { Button, Box, List, ListItem, Page } from 'zmp-framework/react'
|
|
4
|
-
import NavbarBack from '../components/navbar-back';
|
|
5
|
-
|
|
6
|
-
const DymanicRoutePage = (props) => {
|
|
7
|
-
const { zmproute, zmprouter } = props;
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<Page name="dynamic-route">
|
|
11
|
-
<NavbarBack title="Dynamic (Component) Route" />
|
|
12
|
-
<List>
|
|
13
|
-
<ListItem>
|
|
14
|
-
<div>
|
|
15
|
-
<div><strong>Route</strong></div>
|
|
16
|
-
<div>{zmproute.route.path}</div>
|
|
17
|
-
</div>
|
|
18
|
-
</ListItem>
|
|
19
|
-
<ListItem>
|
|
20
|
-
<div>
|
|
21
|
-
<div><strong>Url</strong></div>
|
|
22
|
-
<div>{zmproute.url}</div>
|
|
23
|
-
</div>
|
|
24
|
-
</ListItem>
|
|
25
|
-
<ListItem>
|
|
26
|
-
<div>
|
|
27
|
-
<div><strong>Path</strong></div>
|
|
28
|
-
<div>{zmproute.path}</div>
|
|
29
|
-
</div>
|
|
30
|
-
</ListItem>
|
|
31
|
-
<ListItem>
|
|
32
|
-
<div>
|
|
33
|
-
<div><strong>Hash</strong></div>
|
|
34
|
-
<div>{zmproute.hash}</div>
|
|
35
|
-
</div>
|
|
36
|
-
</ListItem>
|
|
37
|
-
<ListItem>
|
|
38
|
-
<div>
|
|
39
|
-
<div><strong>Params</strong></div>
|
|
40
|
-
<div>
|
|
41
|
-
<ul>
|
|
42
|
-
{Object.keys(zmproute.params).map(key => (<li key={key}>{key}: {zmproute.params[key]}</li>))}
|
|
43
|
-
</ul>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
</ListItem>
|
|
47
|
-
<ListItem>
|
|
48
|
-
<div>
|
|
49
|
-
<div><strong>Query</strong></div>
|
|
50
|
-
<div>
|
|
51
|
-
<ul>
|
|
52
|
-
{Object.keys(zmproute.query).map(key => (<li key={key}>{key}: {zmproute.query[key]}</li>))}
|
|
53
|
-
</ul>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
</ListItem>
|
|
57
|
-
</List>
|
|
58
|
-
<Box px={4} mb={4}>
|
|
59
|
-
<Button
|
|
60
|
-
typeName="primary"
|
|
61
|
-
responsive
|
|
62
|
-
onClick={() => zmprouter.back()}
|
|
63
|
-
>
|
|
64
|
-
Go back via Router API
|
|
65
|
-
</Button>
|
|
66
|
-
</Box>
|
|
67
|
-
</Page>
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export default DymanicRoutePage;
|
|
72
|
-
`).trim();
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("../../../utils/indent");module.exports=t=>{let{template:a}=t,o="tabs"===a?`onPageBeforeIn={()=>{
|
|
2
|
-
//hide navbar
|
|
3
|
-
zmp.toolbar.hide('#app-tab-bar')
|
|
4
|
-
}}`:"";return"recoil"===t.stateManagement?e(0,`
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { Button, Card, Input, Page, Box, zmp } from 'zmp-framework/react';
|
|
7
|
-
import { useRecoilState } from 'recoil';
|
|
8
|
-
import { userState } from '../state';
|
|
9
|
-
import NavbarBack from '../components/navbar-back';
|
|
10
|
-
|
|
11
|
-
const FormPage = () => {
|
|
12
|
-
const [user, setUser] = useRecoilState(userState)
|
|
13
|
-
|
|
14
|
-
const [form, setForm] = React.useState({ ...user });
|
|
15
|
-
const toast = React.useRef<any>(null)
|
|
16
|
-
|
|
17
|
-
const handleChangeInput = (field, value) => {
|
|
18
|
-
setForm({ ...form, [field]: value })
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const handleSubmit = () => {
|
|
22
|
-
if (!toast.current) {
|
|
23
|
-
toast.current = zmp.toast.create({
|
|
24
|
-
text: 'Saved',
|
|
25
|
-
position: 'bottom',
|
|
26
|
-
closeTimeout: 2000,
|
|
27
|
-
})
|
|
28
|
-
}
|
|
29
|
-
setUser(form);
|
|
30
|
-
toast.current.open()
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<Page
|
|
35
|
-
name="user-form"
|
|
36
|
-
${o}
|
|
37
|
-
>
|
|
38
|
-
<NavbarBack title="Update user info" />
|
|
39
|
-
<Box>
|
|
40
|
-
<Card inset>
|
|
41
|
-
<Input
|
|
42
|
-
id="name"
|
|
43
|
-
label="Name"
|
|
44
|
-
type="text"
|
|
45
|
-
placeholder="Zalo"
|
|
46
|
-
value={form?.name}
|
|
47
|
-
onChange={(e) => handleChangeInput('name', e.target.value)}
|
|
48
|
-
/>
|
|
49
|
-
<Input
|
|
50
|
-
label="Avatar"
|
|
51
|
-
type="text"
|
|
52
|
-
placeholder="zalo@zalo.me"
|
|
53
|
-
value={form?.avatar}
|
|
54
|
-
onChange={(e) => handleChangeInput('avatar', e.target.value)}
|
|
55
|
-
/>
|
|
56
|
-
<Box mx="0" mt="4">
|
|
57
|
-
<Button responsive typeName="primary" onClick={handleSubmit}>
|
|
58
|
-
Submit
|
|
59
|
-
</Button>
|
|
60
|
-
</Box>
|
|
61
|
-
</Card>
|
|
62
|
-
</Box>
|
|
63
|
-
</Page>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export default FormPage;
|
|
68
|
-
`).trim():e(0,`
|
|
69
|
-
import React from 'react';
|
|
70
|
-
import { Button, Card, Input, Page, useStore, zmp, Box } from 'zmp-framework/react';
|
|
71
|
-
import NavbarBack from '../components/navbar-back';
|
|
72
|
-
|
|
73
|
-
import store from '../store'
|
|
74
|
-
|
|
75
|
-
const FormPage = () => {
|
|
76
|
-
const user = useStore('user')
|
|
77
|
-
|
|
78
|
-
const [form, setForm] = React.useState({ ...user });
|
|
79
|
-
const toast = React.useRef<any>(null)
|
|
80
|
-
|
|
81
|
-
const handleChangeInput = (field, value) => {
|
|
82
|
-
setForm({ ...form, [field]: value })
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const handleSubmit = () => {
|
|
86
|
-
if (!toast.current) {
|
|
87
|
-
toast.current = zmp.toast.create({
|
|
88
|
-
text: 'Saved',
|
|
89
|
-
position: 'bottom',
|
|
90
|
-
closeTimeout: 2000,
|
|
91
|
-
})
|
|
92
|
-
}
|
|
93
|
-
store.dispatch('setUser', form)
|
|
94
|
-
toast.current.open()
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return (
|
|
98
|
-
<Page
|
|
99
|
-
name="user-form"
|
|
100
|
-
${o}
|
|
101
|
-
>
|
|
102
|
-
<NavbarBack title="Update user info" />
|
|
103
|
-
<Box>
|
|
104
|
-
<Card inset>
|
|
105
|
-
<Input
|
|
106
|
-
id="name"
|
|
107
|
-
label="Name"
|
|
108
|
-
type="text"
|
|
109
|
-
placeholder="Zalo"
|
|
110
|
-
value={form?.name}
|
|
111
|
-
onChange={(e) => handleChangeInput('name', e.target.value)}
|
|
112
|
-
/>
|
|
113
|
-
<Input
|
|
114
|
-
label="Avatar"
|
|
115
|
-
type="text"
|
|
116
|
-
placeholder="zalo@zalo.me"
|
|
117
|
-
value={form?.avatar}
|
|
118
|
-
onChange={(e) => handleChangeInput('avatar', e.target.value)}
|
|
119
|
-
/>
|
|
120
|
-
<Box mx="0" mt="4">
|
|
121
|
-
<Button responsive typeName="primary" onClick={handleSubmit}>
|
|
122
|
-
Submit
|
|
123
|
-
</Button>
|
|
124
|
-
</Box>
|
|
125
|
-
</Card>
|
|
126
|
-
</Box>
|
|
127
|
-
</Page>
|
|
128
|
-
)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export default FormPage;
|
|
132
|
-
`).trim()};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("./user"),r=require("./form"),u=require("./dynamic-route"),i=require("./about"),t=require("./404"),o=require("./settings"),q=require("./catalog");module.exports={copyUser:e,copyForm:r,copyDynamicRoute:u,copyAbout:i,copy404:t,copySettings:o,copyCatalog:q};
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("../../../utils/indent");module.exports=t=>"recoil"===t.stateManagement?e(0,`
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { useRecoilValue } from 'recoil';
|
|
4
|
-
import {
|
|
5
|
-
Page,
|
|
6
|
-
List,
|
|
7
|
-
ListItem,
|
|
8
|
-
Title,
|
|
9
|
-
Box
|
|
10
|
-
} from "zmp-framework/react";
|
|
11
|
-
import UserCard from "../components/user-card";
|
|
12
|
-
import { userState } from '../state'
|
|
13
|
-
|
|
14
|
-
const SettingsPage = () => {
|
|
15
|
-
const user = useRecoilValue(userState);
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<Page name="settings">
|
|
19
|
-
<Box m="0" p="4">
|
|
20
|
-
<Title>Settings</Title>
|
|
21
|
-
<List className="m-0">
|
|
22
|
-
<ListItem link="/user/">
|
|
23
|
-
<UserCard user={user} />
|
|
24
|
-
</ListItem>
|
|
25
|
-
</List>
|
|
26
|
-
</Box>
|
|
27
|
-
</Page>
|
|
28
|
-
);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export default SettingsPage;
|
|
32
|
-
`).trim():e(0,`
|
|
33
|
-
import React from "react";
|
|
34
|
-
import {
|
|
35
|
-
Page,
|
|
36
|
-
List,
|
|
37
|
-
ListItem,
|
|
38
|
-
useStore,
|
|
39
|
-
Title,
|
|
40
|
-
Box
|
|
41
|
-
} from "zmp-framework/react";
|
|
42
|
-
import UserCard from "../components/user-card";
|
|
43
|
-
|
|
44
|
-
const SettingsPage = () => {
|
|
45
|
-
const user = useStore("user");
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<Page name="settings">
|
|
49
|
-
<Box m="0" p="4">
|
|
50
|
-
<Title>Settings</Title>
|
|
51
|
-
<List className="m-0">
|
|
52
|
-
<ListItem link="/user/">
|
|
53
|
-
<UserCard user={user} />
|
|
54
|
-
</ListItem>
|
|
55
|
-
</List>
|
|
56
|
-
</Box>
|
|
57
|
-
</Page>
|
|
58
|
-
);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export default SettingsPage;
|
|
62
|
-
`).trim();
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("../../../utils/indent");module.exports=t=>{let{template:r,stateManagement:a}=t,s="tabs"===r?`
|
|
2
|
-
onPageBeforeIn={()=>{
|
|
3
|
-
//hide navbar
|
|
4
|
-
zmp.toolbar.hide('#app-tab-bar')
|
|
5
|
-
}}`:"",i=["Avatar","List","ListItem","Page","Title"];return"store"===a&&i.push("useStore"),"tabs"===r&&i.push("zmp"),e(0,`
|
|
6
|
-
import React from 'react'
|
|
7
|
-
import { ${i.join(", ")} } from 'zmp-framework/react'
|
|
8
|
-
import NavbarBack from '../components/navbar-back'${"recoil"===a?`
|
|
9
|
-
import { useRecoilValue } from 'recoil';
|
|
10
|
-
import { userState } from '../state';`:""}
|
|
11
|
-
|
|
12
|
-
const UserPage = () => {
|
|
13
|
-
${"recoil"===a?"const user = useRecoilValue(userState);":"const user = useStore('user')"}
|
|
14
|
-
|
|
15
|
-
return (
|
|
16
|
-
<Page
|
|
17
|
-
name="user"${s}
|
|
18
|
-
>
|
|
19
|
-
<NavbarBack
|
|
20
|
-
title="User info"
|
|
21
|
-
linkRight="/form"
|
|
22
|
-
labelRight="Edit"
|
|
23
|
-
/>
|
|
24
|
-
<div style={{ textAlign: 'center', marginTop: 32 }}>
|
|
25
|
-
<Avatar story online src={user.avatar.startsWith('http') ? user.avatar : null}>{user.avatar}</Avatar>
|
|
26
|
-
<Title style={{ marginTop: 8 }}>{user.name}</Title>
|
|
27
|
-
</div>
|
|
28
|
-
<List>
|
|
29
|
-
<ListItem title="Display name" after={user.name} />
|
|
30
|
-
<ListItem title="ID" after={user.id} />
|
|
31
|
-
</List>
|
|
32
|
-
</Page>
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export default UserPage;
|
|
37
|
-
`).trim()};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
const indent = require('../../utils/indent');
|
|
2
|
-
|
|
3
|
-
module.exports = (options) => {
|
|
4
|
-
return indent(
|
|
5
|
-
0,
|
|
6
|
-
`
|
|
7
|
-
import { defineConfig } from 'vite'
|
|
8
|
-
import reactRefresh from '@vitejs/plugin-react-refresh'
|
|
9
|
-
|
|
10
|
-
// https://vitejs.dev/config/
|
|
11
|
-
export default () => {
|
|
12
|
-
return defineConfig({
|
|
13
|
-
root: './src',
|
|
14
|
-
base: '',
|
|
15
|
-
plugins: [reactRefresh()],
|
|
16
|
-
})
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
`
|
|
20
|
-
).trim();
|
|
21
|
-
};
|