diff --git a/packages/app/src/components/faq/index.tsx b/packages/app/src/components/faq/index.tsx
index 3ea0498b7a..6c22caffb4 100644
--- a/packages/app/src/components/faq/index.tsx
+++ b/packages/app/src/components/faq/index.tsx
@@ -16,7 +16,7 @@ export const FAQ = () => {
const [showContent, setShowContent] = useState(false);
const { mode } = useTheme();
const { mode: editorMode } = useEditor();
- const { shortcutsModalHandler, triggerContactModal } = useModal();
+ const { triggerShortcutsModal, triggerContactModal } = useModal();
const isEdgelessDark = mode === 'dark' && editorMode === 'edgeless';
return (
@@ -38,7 +38,7 @@ export const FAQ = () => {
isEdgelessDark={isEdgelessDark}
onClick={() => {
setShowContent(false);
- triggerContactModal(true);
+ triggerContactModal();
}}
>
@@ -50,7 +50,7 @@ export const FAQ = () => {
isEdgelessDark={isEdgelessDark}
onClick={() => {
setShowContent(false);
- shortcutsModalHandler(true);
+ triggerShortcutsModal();
}}
>
@@ -74,14 +74,3 @@ export const FAQ = () => {
>
);
};
-
-const routesLIst: any = [
- {
- path: '/',
- children: [
- {
- element: ,
- },
- ],
- },
-];
diff --git a/packages/app/src/components/import/index.tsx b/packages/app/src/components/import/index.tsx
new file mode 100644
index 0000000000..5c3d4fb364
--- /dev/null
+++ b/packages/app/src/components/import/index.tsx
@@ -0,0 +1,59 @@
+import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal';
+import { StyledButtonWrapper, StyledTitle } from './styles';
+import { Button } from '@/ui/button';
+import { Wrapper } from '@/ui/layout';
+import { Loading } from '@/components/loading';
+import { useEffect, useState } from 'react';
+type ImportModalProps = {
+ open: boolean;
+ onClose: () => void;
+};
+export const ImportModal = ({ open, onClose }: ImportModalProps) => {
+ const [status, setStatus] = useState<'unImported' | 'importing'>(
+ 'unImported'
+ );
+
+ useEffect(() => {
+ if (status === 'importing') {
+ setTimeout(() => {
+ setStatus('unImported');
+ }, 3000);
+ }
+ }, [status]);
+
+ return (
+
+
+
+ Import
+
+ {status === 'unImported' && (
+
+
+
+
+ )}
+
+ {status === 'importing' && (
+
+
+
+ )}
+
+
+ );
+};
+
+export default ImportModal;
diff --git a/packages/app/src/components/import/styles.ts b/packages/app/src/components/import/styles.ts
new file mode 100644
index 0000000000..2211d01f70
--- /dev/null
+++ b/packages/app/src/components/import/styles.ts
@@ -0,0 +1,30 @@
+import { styled } from '@/styles';
+
+export const StyledTitle = styled.div(({ theme }) => {
+ return {
+ fontSize: theme.font.h6,
+ fontWeight: 600,
+ textAlign: 'center',
+ marginTop: '45px',
+ color: theme.colors.popoverColor,
+ };
+});
+
+export const StyledButtonWrapper = styled.div(() => {
+ return {
+ width: '280px',
+ margin: '24px auto 0',
+ button: {
+ display: 'block',
+ width: '100%',
+ ':not(:last-child)': {
+ marginBottom: '16px',
+ },
+ },
+ };
+});
+
+export const StyledLoadingWrapper = styled.div(() => {
+ return {
+ }
+})
diff --git a/packages/app/src/components/loading/index.tsx b/packages/app/src/components/loading/index.tsx
index a04cffefb5..76ea2a25b6 100644
--- a/packages/app/src/components/loading/index.tsx
+++ b/packages/app/src/components/loading/index.tsx
@@ -1,13 +1,19 @@
-import { StyledLoading, StyledLoadingItem } from './styled';
+import {
+ StyledLoadingWrapper,
+ StyledLoading,
+ StyledLoadingItem,
+} from './styled';
-export const Loading = () => {
+export const Loading = ({ size = 40 }: { size?: number }) => {
return (
-
-
-
-
-
-
+
+
+
+
+
+
+
+
);
};
diff --git a/packages/app/src/components/loading/styled.ts b/packages/app/src/components/loading/styled.ts
index f267fc9a84..b98a8bfaa5 100644
--- a/packages/app/src/components/loading/styled.ts
+++ b/packages/app/src/components/loading/styled.ts
@@ -1,14 +1,19 @@
import { styled } from '@/styles';
// Inspired by https://codepen.io/graphilla/pen/rNvBMYY
-const loadingItemSize = '40px';
+export const StyledLoadingWrapper = styled.div<{ size?: number }>(
+ ({ size = 40 }) => {
+ return {
+ width: size * 4,
+ height: size * 4,
+ position: 'relative',
+ };
+ }
+);
export const StyledLoading = styled.div`
- position: relative;
- left: 50%;
- transform: rotateX(55deg) rotateZ(-45deg)
- translate(calc(${loadingItemSize} * -2), 0);
- margin-bottom: calc(3 * ${loadingItemSize});
-
+ position: absolute;
+ left: 25%;
+ top: 25%;
@keyframes slide {
0% {
transform: translate(var(--sx), var(--sy));
@@ -21,24 +26,14 @@ export const StyledLoading = styled.div`
transform: translate(var(--ex), var(--ey));
}
}
- @keyframes load {
- 20% {
- content: '.';
- }
- 40% {
- content: '..';
- }
- 80%,
- 100% {
- content: '...';
- }
- }
`;
-export const StyledLoadingItem = styled.div`
+export const StyledLoadingItem = styled.div<{ size: number }>(
+ ({ size = 40 }) => {
+ return `
position: absolute;
- width: ${loadingItemSize};
- height: ${loadingItemSize};
+ width: ${size}px;
+ height: ${size}px;
background: #9dacf9;
animation: slide 0.9s cubic-bezier(0.65, 0.53, 0.59, 0.93) infinite;
@@ -92,3 +87,5 @@ export const StyledLoadingItem = styled.div`
--ey: -50%;
}
`;
+ }
+);
diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx
index ba42f697f7..4291d310d2 100644
--- a/packages/app/src/components/workspace-slider-bar/index.tsx
+++ b/packages/app/src/components/workspace-slider-bar/index.tsx
@@ -47,7 +47,7 @@ const FavoriteList = ({ showList }: { showList: boolean }) => {
);
};
export const WorkSpaceSliderBar = () => {
- const { triggerQuickSearchModal } = useModal();
+ const { triggerQuickSearchModal, triggerImportModal } = useModal();
const [show, setShow] = useState(false);
const [showSubFavorite, setShowSubFavorite] = useState(false);
const { createPage } = useEditor();
@@ -58,7 +58,7 @@ export const WorkSpaceSliderBar = () => {
{
- triggerQuickSearchModal(true);
+ triggerQuickSearchModal();
}}
>
Quick search
@@ -102,7 +102,13 @@ export const WorkSpaceSliderBar = () => {
- Import
+ {
+ triggerImportModal();
+ }}
+ >
+ Import
+
diff --git a/packages/app/src/providers/editor-provider/loading.tsx b/packages/app/src/providers/editor-provider/loading.tsx
index 8f1383b18e..829d2a80fc 100644
--- a/packages/app/src/providers/editor-provider/loading.tsx
+++ b/packages/app/src/providers/editor-provider/loading.tsx
@@ -10,7 +10,7 @@ const StyledLoadingContainer = styled('div')(({ theme }) => {
color: '#6880FF',
h1: {
fontSize: '2em',
- marginTop: '150px',
+ marginTop: '15px',
fontWeight: '600',
},
};
diff --git a/packages/app/src/providers/global-modal-provider.tsx b/packages/app/src/providers/global-modal-provider.tsx
index 90a0a07a23..2459470484 100644
--- a/packages/app/src/providers/global-modal-provider.tsx
+++ b/packages/app/src/providers/global-modal-provider.tsx
@@ -3,17 +3,27 @@ import type { PropsWithChildren } from 'react';
import ShortcutsModal from '@/components/shortcuts-modal';
import ContactModal from '@/components/contact-modal';
import QuickSearch from '@/components/quick-search';
+import { ImportModal } from '@/components/import';
+
type ModalContextValue = {
- shortcutsModalHandler: (visible: boolean) => void;
- triggerContactModal: (visible: boolean) => void;
- triggerQuickSearchModal: (visible: boolean) => void;
+ triggerShortcutsModal: () => void;
+ triggerContactModal: () => void;
+ triggerQuickSearchModal: () => void;
+ triggerImportModal: () => void;
};
type ModalContextProps = PropsWithChildren<{}>;
+type ModalMap = {
+ contact: boolean;
+ shortcuts: boolean;
+ quickSearch: boolean;
+ import: boolean;
+};
export const ModalContext = createContext({
- shortcutsModalHandler: () => {},
+ triggerShortcutsModal: () => {},
triggerContactModal: () => {},
triggerQuickSearchModal: () => {},
+ triggerImportModal: () => {},
});
export const useModal = () => useContext(ModalContext);
@@ -21,59 +31,78 @@ export const useModal = () => useContext(ModalContext);
export const ModalProvider = ({
children,
}: PropsWithChildren) => {
- const [openContactModal, setOpenContactModal] = useState(false);
- const [openShortcutsModal, setOpenShortcutsModal] = useState(false);
- const [openQuickSearchModal, setOpenQuickSearchModal] = useState(false);
+ const [modalMap, setModalMap] = useState({
+ contact: false,
+ shortcuts: false,
+ quickSearch: false,
+ import: false,
+ });
+
+ const triggerHandler = (key: keyof ModalMap, visible?: boolean) => {
+ setModalMap({
+ ...modalMap,
+ [key]: visible ?? !modalMap[key],
+ });
+ };
+
useEffect(() => {
const down = (e: KeyboardEvent) => {
if (e.key === 'k' && e.metaKey) {
const selection = window.getSelection();
if (selection?.toString()) {
- setOpenQuickSearchModal(false);
+ triggerHandler('quickSearch', false);
return;
}
if (selection?.isCollapsed) {
- setOpenQuickSearchModal(
- openQuickSearchModal => !openQuickSearchModal
- );
+ triggerHandler('quickSearch');
}
}
};
document.addEventListener('keydown', down);
return () => document.removeEventListener('keydown', down);
}, []);
+
return (
{
- setOpenShortcutsModal(visible);
+ triggerShortcutsModal: () => {
+ triggerHandler('shortcuts');
},
- triggerContactModal: visible => {
- setOpenContactModal(visible);
+ triggerContactModal: () => {
+ triggerHandler('contact');
},
- triggerQuickSearchModal: visible => {
- setOpenQuickSearchModal(visible);
+ triggerQuickSearchModal: () => {
+ triggerHandler('quickSearch');
+ },
+ triggerImportModal: () => {
+ triggerHandler('import');
},
}}
>
{
- setOpenContactModal(false);
+ triggerHandler('contact', false);
}}
>
{
- setOpenShortcutsModal(false);
+ triggerHandler('shortcuts', false);
}}
>
{
- setOpenQuickSearchModal(false);
+ triggerHandler('quickSearch', false);
}}
>
+ {
+ triggerHandler('import', false);
+ }}
+ >
{children}
);
diff --git a/packages/app/src/ui/confirm/styles.ts b/packages/app/src/ui/confirm/styles.ts
index 03d1ef5bca..54639771e7 100644
--- a/packages/app/src/ui/confirm/styles.ts
+++ b/packages/app/src/ui/confirm/styles.ts
@@ -1,5 +1,4 @@
-import { displayFlex, styled, AffineTheme } from '@/styles';
-import { ConfirmProps } from '@/ui/confirm/confirm';
+import { displayFlex, styled } from '@/styles';
import { ModalWrapper } from '@/ui/modal';
export const StyledModalWrapper = styled(ModalWrapper)(({ theme }) => {
@@ -7,8 +6,6 @@ export const StyledModalWrapper = styled(ModalWrapper)(({ theme }) => {
width: '460px',
height: '240px',
padding: '0 60px',
- background: theme.colors.popoverBackground,
- position: 'relative',
};
});
@@ -37,44 +34,3 @@ export const StyledButtonWrapper = styled.div(() => {
marginTop: '32px',
};
});
-
-const getButtonColors = (
- theme: AffineTheme,
- confirmType: ConfirmProps['confirmType']
-) => {
- switch (confirmType) {
- case 'primary':
- return {
- background: theme.colors.primaryColor,
- color: '#fff',
- borderColor: theme.colors.primaryColor,
- };
- case 'warning':
- return {
- background: theme.colors.warningBackground,
- color: theme.colors.warningColor,
- borderColor: theme.colors.warningBackground,
- ':hover': {
- borderColor: theme.colors.warningColor,
- },
- };
- case 'danger':
- return {
- background: theme.colors.errorBackground,
- color: theme.colors.errorColor,
- borderColor: theme.colors.errorBackground,
- ':hover': {
- borderColor: theme.colors.errorColor,
- },
- };
- default:
- return {
- color: theme.colors.popoverColor,
- borderColor: theme.colors.borderColor,
- ':hover': {
- borderColor: theme.colors.primaryColor,
- color: theme.colors.primaryColor,
- },
- };
- }
-};