1
0
Fork 0

chore(lab): Speed up the lab by removing things

This commit is contained in:
joostdecock 2023-09-11 19:59:02 +02:00
parent 904649bb7d
commit 527e65697f
30 changed files with 412 additions and 70 deletions

5
.gitignore vendored
View file

@ -39,7 +39,6 @@ packages/new-design/lib/banner.mjs
# Lab auto-generated content
sites/lab/lib
sites/lab/pages/*
sites/lab/public/android-chrome-192x192.png
sites/lab/public/android-chrome-384x384.png
sites/lab/public/apple-touch-icon.png
@ -50,10 +49,6 @@ sites/lab/public/favicon.ico
sites/lab/public/mstile-150x150.png
sites/lab/public/safari-pinned-tab.svg
sites/lab/public/site.webmanifest
# but not the indexes
!sites/lab/pages/index.mjs
!sites/lab/pages/code/index.mjs
!sites/lab/pages/docs/index.mjs
# dev auto-generated content
sites/dev/public/android-chrome-192x192.png

View file

@ -1,2 +1,13 @@
import { Popout } from 'shared/components/popout/index.mjs'
import { WebLink } from 'shared/components/link.mjs'
// This is how we skip the docs in the lab
export const DynamicOrgDocs = false
export const DynamicOrgDocs = () => (
<Popout note>
<h5>The FreeSewing lab does not include documentation</h5>
<p>
Go to <WebLink href="https://freesewing.org/" txt="FreeSewing.org" /> if you want all features
enabled.
</p>
</Popout>
)

View file

@ -1,7 +1,7 @@
import configBuilder from '../shared/config/next.mjs'
import i18nConfig from './next-i18next.config.js'
import { banner } from '../../scripts/banner.mjs'
import withBundleAnalyzer from '@next/bundle-analyzer'
//import withBundleAnalyzer from '@next/bundle-analyzer'
let config = configBuilder({ site: 'lab' })
config.i18n = i18nConfig.i18n
@ -16,6 +16,6 @@ config.eslint = {
// To run the bundle analyzer, run:
// ANALYZE=true yarn build
if (process.env.ANALYZE) config = withBundleAnalyzer(config)(config)
//if (process.env.ANALYZE) config = withBundleAnalyzer(config)(config)
export default config

View file

@ -1,44 +1,11 @@
import 'shared/styles/globals.css'
import { appWithTranslation } from 'next-i18next'
import React from 'react'
import Bugsnag from '@bugsnag/js'
import BugsnagPluginReact from '@bugsnag/plugin-react'
import { siteConfig } from 'site/site.config.mjs'
import { Toaster as DefaultToaster } from 'react-hot-toast'
import { ContextWrapper } from 'shared/components/wrappers/context.mjs'
Bugsnag.start({
apiKey: siteConfig.bugsnag.key,
collectUserIp: false,
plugins: [new BugsnagPluginReact()],
})
const ErrorBoundary = Bugsnag.getPlugin('react').createErrorBoundary(React)
const FreeSewingLab = ({ Component, pageProps }) => (
<ErrorBoundary>
<ContextWrapper>
<Component {...pageProps} />
<DefaultToaster
position="bottom-right"
toastOptions={{
className: 'bg-base-100 text-base-content',
success: {
className: 'bg-success text-success-content',
},
error: {
className: 'bg-error text-error-content',
},
loading: {
className: 'bg-warning text-warning-content',
},
custom: {
className: 'bg-accent text-accent-content',
},
}}
/>
</ContextWrapper>
</ErrorBoundary>
)
export default appWithTranslation(FreeSewingLab)

View file

@ -3,7 +3,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { useTranslation } from 'next-i18next'
// Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { WebLink } from 'shared/components/web-link.mjs'
import { WebLink } from 'shared/components/link.mjs'
import { siteConfig } from 'site/site.config.mjs'
import { freeSewingConfig } from 'shared/config/freesewing.config.mjs'
import { ChoiceLink } from 'shared/components/choice-link.mjs'

View file

@ -0,0 +1,50 @@
// Hooks
import { useDesign, collection } from 'shared/hooks/use-design.mjs'
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { nsMerge } from 'shared/utils.mjs'
// Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { Workbench, ns as wbNs } from 'shared/components/workbench/new.mjs'
import { WorkbenchLayout } from 'site/components/layouts/workbench.mjs'
import { DynamicOrgDocs as DynamicDocs } from 'site/components/dynamic-org-docs.mjs'
// Translation namespaces used on this page
const namespaces = nsMerge(wbNs, pageNs)
const NewDesignPage = ({ page, design }) => {
const Design = useDesign(design)
return (
<PageWrapper {...page} title={design} layout={WorkbenchLayout} header={null}>
<Workbench {...{ design, Design, DynamicDocs }} />
</PageWrapper>
)
}
export default NewDesignPage
export async function getStaticProps({ locale, params }) {
return {
props: {
...(await serverSideTranslations(locale, [params.design, ...namespaces])),
design: params.design,
page: {
locale,
path: ['new', params.design],
title: '',
},
},
}
}
/*
* getStaticPaths() is used to specify for which routes (think URLs)
* this page should be used to generate the result.
*/
export async function getStaticPaths() {
return {
paths: [...collection.map((design) => `/new/${design}`)],
fallback: 'blocking',
}
}

View file

@ -0,0 +1,143 @@
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
// Hooks
import { useTranslation } from 'next-i18next'
import { useAccount } from 'shared/hooks/use-account.mjs'
// Components
import Link from 'next/link'
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import {
KeyIcon,
NewMsetIcon,
DesignIcon,
NewPatternIcon,
PluginIcon,
ShowcaseIcon,
RssIcon,
CsetIcon,
OpackIcon,
} from 'shared/components/icons.mjs'
// Translation namespaces used on this page
// Note that we include the account namespace here for the 'new' keyword
const namespaces = [...pageNs, 'account']
const Box = ({ title, Icon, description, href }) => {
const linkProps = {
href,
className:
'p-8 -ml-4 -mr-4 md:m-0 rounded-none md:rounded-xl md:shadow hover:bg-secondary bg-base-200 hover:bg-opacity-10 w-full max-w-lg',
}
const inner = (
<>
<h4 className="flex flex-row items-start justify-between w-full m-0 p-0 text-inherit">
<span>{title}</span>
<Icon className="w-12 h-12 -mt-2" stroke={1.5} />
</h4>
<div className={`normal-case text-base font-medium text-left pt-2 text-inherit`}>
{description}
</div>
</>
)
return href.slice(0, 4) === 'http' ? (
<a {...linkProps}>{inner}</a>
) : (
<Link {...linkProps}>{inner}</Link>
)
}
/*
* Each page MUST be wrapped in the PageWrapper component.
* You also MUST spread props.page into this wrapper component
* when path and locale come from static props (as here)
* or set them manually.
*/
const NewIndexPage = ({ page }) => {
const { t } = useTranslation(['account'])
const { account } = useAccount()
const control = account.control ? account.control : 99
return (
<PageWrapper {...page} title={t('new')}>
<h2>{t('newPopular')}</h2>
<div className="w-full max-w-7xl flex flex-row flex-wrap gap-4">
<Box
title={t('patternNew')}
Icon={NewPatternIcon}
description={t('patternNewInfo')}
href="/new/pattern"
/>
<Box title={t('newSet')} Icon={NewMsetIcon} description={t('setNewInfo')} href="/new/set" />
</div>
{control > 3 ? (
<>
<h2>{t('newShare')}</h2>
<div className="w-full max-w-7xl flex flex-row flex-wrap gap-4">
<Box
title={t('csetNew')}
Icon={CsetIcon}
description={t('csetNewInfo')}
href="/new/cset"
/>
<Box
title={t('opackNew')}
Icon={OpackIcon}
description={t('opackNewInfo')}
href="/new/opack"
/>
<Box
title={t('showcaseNew')}
Icon={ShowcaseIcon}
description={t('showcaseNewInfo')}
href="/new/showcase"
/>
<Box
title={t('blogNew')}
Icon={RssIcon}
description={t('blogNewInfo')}
href="/new/blog"
/>
</div>
<h2>{t('newDev')}</h2>
<div className="w-full max-w-7xl flex flex-row flex-wrap gap-4">
<Box
title={t('newApikey')}
Icon={KeyIcon}
description={t('keyNewInfo')}
href="/new/apikey"
/>
<Box
title={t('designNew')}
Icon={DesignIcon}
description={t('designNewInfo')}
href="https://freesewing.dev/tutorials/pattern-design"
/>
<Box
title={t('pluginNew')}
Icon={PluginIcon}
description={t('pluginNewInfo')}
href="https://freesewing.dev/guides/plugins"
/>
</div>
</>
) : null}
</PageWrapper>
)
}
export default NewIndexPage
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale, namespaces)),
page: {
locale,
path: ['new'],
},
},
}
}

View file

@ -0,0 +1,43 @@
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { nsMerge } from 'shared/utils.mjs'
// Hooks
import { useTranslation } from 'next-i18next'
// Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { ns as authNs } from 'shared/components/wrappers/auth/index.mjs'
import { ns as setsNs } from 'shared/components/account/sets.mjs'
import { DesignPicker, ns as designNs } from 'shared/components/designs/design-picker.mjs'
// Translation namespaces used on this page
const ns = nsMerge(designNs, setsNs, authNs, pageNs)
/*
* Each page MUST be wrapped in the PageWrapper component.
* You also MUST spread props.page into this wrapper component
* when path and locale come from static props (as here)
* or set them manually.
*/
const NewSetPage = ({ page }) => {
const { t } = useTranslation(ns)
return (
<PageWrapper {...page} title={t('newPattern')}>
<DesignPicker />
</PageWrapper>
)
}
export default NewSetPage
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale, ns)),
page: {
locale,
path: ['new', 'pattern'],
},
},
}
}

View file

@ -0,0 +1,92 @@
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { nsMerge } from 'shared/utils.mjs'
// Hooks
import { useEffect, useContext } from 'react'
import { useRouter } from 'next/router'
import { useBackend } from 'shared/hooks/use-backend.mjs'
import { useAccount } from 'shared/hooks/use-account.mjs'
import { useTranslation } from 'next-i18next'
// Context
import { LoadingStatusContext } from 'shared/context/loading-status-context.mjs'
// Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { BareLayout } from 'site/components/layouts/bare.mjs'
//import { SignIn, ns as susiNs } from 'shared/components/susi/sign-in.mjs'
import { Loading } from 'shared/components/spinner.mjs'
const ns = nsMerge(pageNs)
/*
* Each page MUST be wrapped in the PageWrapper component.
* You also MUST spread props.page into this wrapper component
* when path and locale come from static props (as here)
* or set them manually.
*/
const OauthCallbackPage = ({ page, provider }) => {
const router = useRouter()
const { t } = useTranslation(ns)
const backend = useBackend()
const { setAccount, setToken, setSeenUser } = useAccount()
const { setLoadingStatus } = useContext(LoadingStatusContext)
useEffect(() => {
const oauthFlow = async () => {
const urlParams = new URLSearchParams(window.location.search)
const state = urlParams.get('state')
const code = urlParams.get('code')
const result = await backend.oauthSignIn({ state, code, provider })
if (result.data?.account && result.data?.token) {
setAccount(result.data.account)
setToken(result.data.token)
setSeenUser(result.data.account.username)
setLoadingStatus([
true,
t('susi:welcomeBackName', { name: result.data.account.username }),
true,
true,
])
router.push('/welcome')
} else setLoadingStatus([true, 'backendError', true, true])
}
oauthFlow()
}, [provider])
return (
<PageWrapper {...page} layout={BareLayout}>
<div className="flex flex-col items-center h-screen justify-center text-base-content px-4">
<div className="max-w-lg w-full">
<Loading />
</div>
</div>
</PageWrapper>
)
}
export default OauthCallbackPage
export async function getStaticProps({ locale, params }) {
return {
props: {
...(await serverSideTranslations(locale, ns)),
provider: params.provider,
page: {
locale,
path: ['signin', 'callback', params.provider],
},
},
}
}
/*
* getStaticPaths() is used to specify for which routes (think URLs)
* this page should be used to generate the result.
*
* To learn more, see: https://nextjs.org/docs/basic-features/data-fetching
*/
export async function getStaticPaths() {
return {
paths: [`/signin/callback/github`, `/signin/callback/google`],
fallback: false,
}
}

View file

@ -0,0 +1,41 @@
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { nsMerge } from 'shared/utils.mjs'
// Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { BareLayout } from 'site/components/layouts/bare.mjs'
import { SignIn, ns as susiNs } from 'shared/components/susi/sign-in.mjs'
const ns = nsMerge(susiNs, pageNs)
/*
* Each page MUST be wrapped in the PageWrapper component.
* You also MUST spread props.page into this wrapper component
* when path and locale come from static props (as here)
* or set them manually.
*/
const SignInPage = ({ page }) => {
return (
<PageWrapper {...page} layout={BareLayout}>
<div className="flex flex-col items-center h-screen justify-center text-base-content px-4">
<div className="max-w-lg w-full">
<SignIn />
</div>
</div>
</PageWrapper>
)
}
export default SignInPage
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale, ns)),
page: {
locale,
path: ['signin'],
},
},
}
}

View file

@ -16,7 +16,7 @@ import { Popout } from 'shared/components/popout/index.mjs'
import { LeftIcon, PlusIcon, CopyIcon, RightIcon, TrashIcon } from 'shared/components/icons.mjs'
import { PageLink, Link } from 'shared/components/link.mjs'
import { StringInput, ListInput, FormControl } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -11,7 +11,7 @@ import { Icons, welcomeSteps, BackToAccountButton } from './shared.mjs'
import { SaveSettingsButton } from 'shared/components/buttons/save-settings-button.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { MarkdownInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
import { TipIcon } from 'shared/components/icons.mjs'
export const ns = ['account', 'status']

View file

@ -11,7 +11,7 @@ import { PlusIcon, TrashIcon, LeftIcon } from 'shared/components/icons.mjs'
import { PageLink, WebLink, Link } from 'shared/components/link.mjs'
import { DisplayRow } from './shared.mjs'
import { StringInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -11,7 +11,7 @@ import { Icons, welcomeSteps, BackToAccountButton } from './shared.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { ListInput } from 'shared/components/inputs.mjs'
import { OkIcon, NoIcon } from 'shared/components/icons.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -10,7 +10,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
import { BackToAccountButton, Icons, welcomeSteps } from './shared.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { ListInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
import { ControlScore } from 'shared/components/control/score.mjs'
export const ns = ['account', 'status']

View file

@ -12,7 +12,7 @@ import { validateEmail, validateTld } from 'shared/utils.mjs'
import { BackToAccountButton } from './shared.mjs'
import { Popout } from 'shared/components/popout/index.mjs'
import { EmailInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -9,7 +9,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
import { BackToAccountButton } from './shared.mjs'
import { SaveSettingsButton } from 'shared/components/buttons/save-settings-button.mjs'
import { StringInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -12,7 +12,7 @@ import { Icons, welcomeSteps, BackToAccountButton } from './shared.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { SaveSettingsButton } from 'shared/components/buttons/save-settings-button.mjs'
import { PassiveImageInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -9,7 +9,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
import { Icons, welcomeSteps, BackToAccountButton, NumberBullet } from './shared.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { ListInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -8,7 +8,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
// Components
import { BackToAccountButton, NumberBullet } from './shared.mjs'
import { ListInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
// Config
import { siteConfig as conf } from 'site/site.config.mjs'

View file

@ -9,7 +9,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
import { BackToAccountButton, Icons, welcomeSteps } from './shared.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { ListInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
import { OkIcon, NoIcon } from 'shared/components/icons.mjs'
export const ns = ['account', 'status']

View file

@ -13,7 +13,7 @@ import { SaveSettingsButton } from 'shared/components/buttons/save-settings-butt
import { Popout } from 'shared/components/popout/index.mjs'
import { RightIcon } from 'shared/components/icons.mjs'
import { PasswordInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -39,7 +39,7 @@ import { ModalWrapper } from 'shared/components/wrappers/modal.mjs'
import Markdown from 'react-markdown'
import Timeago from 'react-timeago'
import { TableWrapper } from 'shared/components/wrappers/table.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'patterns', 'status']

View file

@ -9,7 +9,7 @@ import { useBackend } from 'shared/hooks/use-backend.mjs'
import { BackToAccountButton } from './shared.mjs'
import { SaveSettingsButton } from 'shared/components/buttons/save-settings-button.mjs'
import { StringInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -47,7 +47,7 @@ import { ModalWrapper } from 'shared/components/wrappers/modal.mjs'
import Markdown from 'react-markdown'
import Timeago from 'react-timeago'
import { DisplayRow } from './shared.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
import {
StringInput,
PassiveImageInput,

View file

@ -10,7 +10,7 @@ import { Icons, welcomeSteps, BackToAccountButton } from './shared.mjs'
import { OkIcon, NoIcon } from 'shared/components/icons.mjs'
import { ContinueButton } from 'shared/components/buttons/continue-button.mjs'
import { StringInput } from 'shared/components/inputs.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['account', 'status']

View file

@ -11,7 +11,7 @@ import Link from 'next/link'
import { Robot } from 'shared/components/robot/index.mjs'
import { StringInput, PasswordInput } from 'shared/components/inputs.mjs'
import { FreeSewingAnimation } from 'shared/components/animations/freesewing.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs as DynamicDocs } from 'site/components/dynamic-org-docs.mjs'
// Translation namespaces used on this page
export const ns = ['signup', 'errros', 'account']

View file

@ -1,7 +1,7 @@
import { nsMerge } from 'shared/utils.mjs'
import { MeasieInput, ns as inputNs } from 'shared/components/inputs.mjs'
import { useTranslation } from 'next-i18next'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = nsMerge('workbench', inputNs)

View file

@ -14,7 +14,7 @@ import { StringInput, MarkdownInput } from 'shared/components/inputs.mjs'
import { UploadIcon, EditIcon, PlusIcon, BookmarkIcon } from 'shared/components/icons.mjs'
import { Popout } from 'shared/components/popout/index.mjs'
import { PageLink } from 'shared/components/link.mjs'
import { DynamicOrgDocs } from 'shared/components/dynamic-docs/org.mjs'
import { DynamicOrgDocs } from 'site/components/dynamic-org-docs.mjs'
export const ns = ['workbench', 'status']

View file

@ -2,15 +2,15 @@ import path from 'path'
import fse from 'fs-extra'
const copyFromOrg = [
['account'],
['confirm'],
['designs'],
//['account'],
//['confirm'],
//['designs'],
['new', 'index.mjs'],
['new', '[design].mjs'],
['patterns'],
['sets'],
//['patterns'],
//['sets'],
['signin'],
['signup'],
//['signup'],
]
const copyOrgFiles = () => {