From 3190eebf6e4310598d8fd3547e70a79530662b59 Mon Sep 17 00:00:00 2001 From: "Kilu.He" <108015703+qinluhe@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:10:36 +0800 Subject: [PATCH] fix: modified universal link (#7094) --- .../.well-known/apple-app-site-association | 26 +------ .../public/.well-known/assetlinks.json | 3 +- .../__tests__/shortcuts/Markdown.cy.tsx | 1 + .../src/components/login/Login.tsx | 14 +++- .../src/components/main/App.tsx | 29 +++---- .../src/components/quick-note/AddNote.tsx | 7 +- .../src/components/quick-note/QuickNote.tsx | 76 +++++++++++++------ .../appflowy_web_app/src/utils/open_schema.ts | 22 ++++-- frontend/resources/translations/en.json | 12 +-- 9 files changed, 104 insertions(+), 86 deletions(-) diff --git a/frontend/appflowy_web_app/public/.well-known/apple-app-site-association b/frontend/appflowy_web_app/public/.well-known/apple-app-site-association index ae5a32410b..7a7f3e89ea 100644 --- a/frontend/appflowy_web_app/public/.well-known/apple-app-site-association +++ b/frontend/appflowy_web_app/public/.well-known/apple-app-site-association @@ -1,25 +1 @@ -{ - "applinks": { - "apps": [], - "details": [ - { - "appIDs": [ - "VHB67HRSZG.com.appflowy.appflowy.flutter" - ], - "paths": [ - "*" - ], - "components": [ - { - "/": "/*" - } - ] - } - ] - }, - "webcredentials": { - "apps": [ - "VHB67HRSZG.com.appflowy.appflowy.flutter" - ] - } -} \ No newline at end of file +{"applinks":{"apps":[],"details":[{"appIDs":["VHB67HRSZG.com.appflowy.appflowy.flutter"],"paths":["/download","/download/*"],"components":[{"/":"/download","comment":"Matches any URL whose path starts with /download"},{"/":"/download/*","comment":"Matches any URL whose path starts with /download/"}]}]},"webcredentials":{"apps":["VHB67HRSZG.com.appflowy.appflowy.flutter"]}} \ No newline at end of file diff --git a/frontend/appflowy_web_app/public/.well-known/assetlinks.json b/frontend/appflowy_web_app/public/.well-known/assetlinks.json index 9161081308..c1dd118199 100644 --- a/frontend/appflowy_web_app/public/.well-known/assetlinks.json +++ b/frontend/appflowy_web_app/public/.well-known/assetlinks.json @@ -8,7 +8,8 @@ "package_name": "io.appflowy.appflowy", "sha256_cert_fingerprints": [ "19:13:85:33:DB:B3:A2:FD:65:2F:61:D7:F2:35:95:79:FE:6E:CC:B5:AC:94:AA:02:9E:BE:E7:0E:02:6B:45:FF" - ] + ], + "path_prefix": "/download" } } ] \ No newline at end of file diff --git a/frontend/appflowy_web_app/src/components/editor/__tests__/shortcuts/Markdown.cy.tsx b/frontend/appflowy_web_app/src/components/editor/__tests__/shortcuts/Markdown.cy.tsx index f5dc98a856..9a644d7047 100644 --- a/frontend/appflowy_web_app/src/components/editor/__tests__/shortcuts/Markdown.cy.tsx +++ b/frontend/appflowy_web_app/src/components/editor/__tests__/shortcuts/Markdown.cy.tsx @@ -27,6 +27,7 @@ describe('Markdown editing', () => { // Test `Bold` cy.get('@editor').type('**bold'); cy.get('@editor').realPress(['*', '*']); + cy.wait(50); expectedJson = [{ type: 'paragraph', data: {}, diff --git a/frontend/appflowy_web_app/src/components/login/Login.tsx b/frontend/appflowy_web_app/src/components/login/Login.tsx index ff565756c8..521af59bb6 100644 --- a/frontend/appflowy_web_app/src/components/login/Login.tsx +++ b/frontend/appflowy_web_app/src/components/login/Login.tsx @@ -5,7 +5,7 @@ import React from 'react'; import { ReactComponent as Logo } from '@/assets/logo.svg'; import { useTranslation } from 'react-i18next'; -export function Login({ redirectTo }: { redirectTo: string }) { +export function Login ({ redirectTo }: { redirectTo: string }) { const { t } = useTranslation(); return ( @@ -27,11 +27,19 @@ export function Login({ redirectTo }: { redirectTo: string }) { } > {t('web.signInAgreement')} - + {t('web.termOfUse')} {' '} {t('web.and')}{' '} - + {t('web.privacyPolicy')} . diff --git a/frontend/appflowy_web_app/src/components/main/App.tsx b/frontend/appflowy_web_app/src/components/main/App.tsx index 941db2d226..77764ba364 100644 --- a/frontend/appflowy_web_app/src/components/main/App.tsx +++ b/frontend/appflowy_web_app/src/components/main/App.tsx @@ -20,35 +20,35 @@ const AppMain = withAppWrapper(() => { } + element={} /> } + element={} /> } + element={} /> } + element={} /> } + element={} /> } + element={} /> } + element={} /> } + element={} /> { path="/app/*" element={ - + } /> } + element={} /> ); }); -function App() { - const path = window.location.pathname; - - if (path.startsWith('/.well-known')) { - return null; - } +function App () { return ( - + ); } diff --git a/frontend/appflowy_web_app/src/components/quick-note/AddNote.tsx b/frontend/appflowy_web_app/src/components/quick-note/AddNote.tsx index 7f8966014f..1ba3633fe4 100644 --- a/frontend/appflowy_web_app/src/components/quick-note/AddNote.tsx +++ b/frontend/appflowy_web_app/src/components/quick-note/AddNote.tsx @@ -5,7 +5,7 @@ import { QuickNote } from '@/application/types'; import { Button, CircularProgress } from '@mui/material'; import { useTranslation } from 'react-i18next'; -function AddNote({ +function AddNote ({ onEnterNote, onAdd, }: { @@ -27,9 +27,10 @@ function AddNote({ diff --git a/frontend/appflowy_web_app/src/components/quick-note/QuickNote.tsx b/frontend/appflowy_web_app/src/components/quick-note/QuickNote.tsx index bacb741525..876e56a48c 100644 --- a/frontend/appflowy_web_app/src/components/quick-note/QuickNote.tsx +++ b/frontend/appflowy_web_app/src/components/quick-note/QuickNote.tsx @@ -1,3 +1,4 @@ +import CircularProgress from '@mui/material/CircularProgress'; import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { IconButton, Tooltip, Zoom, Snackbar, Portal } from '@mui/material'; import { ReactComponent as EditIcon } from '@/assets/edit.svg'; @@ -16,7 +17,7 @@ import { getPopoverPosition, setPopoverPosition } from '@/components/quick-note/ import Note from '@/components/quick-note/Note'; const PAPER_SIZE = [480, 396]; -const Transition = React.forwardRef(function Transition( +const Transition = React.forwardRef(function Transition ( props: TransitionProps & { children: React.ReactElement; }, @@ -33,7 +34,7 @@ enum QuickNoteRoute { LIST = 'list', } -export function QuickNote() { +export function QuickNote () { const { t } = useTranslation(); const modifier = useMemo(() => createHotKeyLabel(HOT_KEY_NAME.QUICK_NOTE), []); const [open, setOpen] = React.useState(false); @@ -197,6 +198,7 @@ export function QuickNote() { useEffect(() => { resetPosition(); }, [resetPosition]); + const [loading, setLoading] = React.useState(false); const buttonRef = useRef(null); const handleOpen = useCallback(async (forceCreate?: boolean) => { @@ -217,7 +219,7 @@ export function QuickNote() { } : prev); } - await initNoteList(); + void initNoteList(); if (route === QuickNoteRoute.LIST || forceCreate) { await handleAdd(); @@ -232,7 +234,9 @@ export function QuickNote() { e.stopPropagation(); e.preventDefault(); + if (loading) return; void (async () => { + setLoading(true); try { await handleOpen(true); // eslint-disable-next-line @@ -240,6 +244,8 @@ export function QuickNote() { console.error(e); handleOpenToast(e.message); } + + setLoading(false); })(); } else if (createHotkey(HOT_KEY_NAME.ESCAPE)(e)) { handleClose(); @@ -251,7 +257,7 @@ export function QuickNote() { return () => { document.removeEventListener('keydown', handleKeyDown); }; - }, [handleOpen, handleOpenToast]); + }, [handleOpen, handleOpenToast, loading]); const handleMouseDown = (event: React.MouseEvent) => { if (!position) return; @@ -393,7 +399,8 @@ export function QuickNote() { expand={expand} onToggleExpand={handleToggleExpand} onClose={handleClose} - onBack={handleBackList}/> + onBack={handleBackList} + /> ); } @@ -423,26 +430,40 @@ export function QuickNote() { return ( <> - -
{t('quickNote.label')}
-
{modifier}
- - }> + +
{t('quickNote.label')}
+
{modifier}
+ + } + > { + onClick={async (e) => { e.currentTarget.blur(); if (open) { handleClose(); return; } - void handleOpen(); + try { + setLoading(true); + await handleOpen(); + // eslint-disable-next-line + } catch (e: any) { + console.error(e); + handleOpenToast(e.message); + } + + setLoading(false); + }} + disabled={loading} > - + {loading ? : + }
- { - setToastMessage(''); - setOpenToast(false); - }, - open: openToast, - }}> + { + setToastMessage(''); + setOpenToast(false); + }, + open: openToast, + }} + >
+ className={'bg-note-header py-2 px-5 flex items-center justify-between gap-5 h-[44px] w-full'} + >
{renderHeader()}
{ handleUpdateNodeData(currentNote.id, data); - }}/> + }} + /> : { }; }; -export function openOnly(schema?: string) { +export function openOnly (schema?: string) { return openAppOrDownload({ appScheme: schema || openAppFlowySchema, }); } -export function openOrDownload(schema?: string) { +export function openOrDownload (schema?: string) { const os = getOS(); - - const downloadUrl = os === 'ios' ? iosDownloadLink : os === 'android' ? androidDownloadLink : desktopDownloadLink; + + if (os === 'ios' || os === 'android') { + const universalLink = 'https://appflowy.io/download'; + const intentUrl = `intent://appflowy.io/download#Intent;` + + 'scheme=https;' + + 'package=io.appflowy.app;' + + `S.browser_fallback_url=${encodeURIComponent(androidDownloadLink)};` + + 'end'; + + window.location.href = os === 'ios' ? universalLink : intentUrl; + return; + } return openAppOrDownload({ appScheme: schema || openAppFlowySchema, - downloadUrl, + downloadUrl: desktopDownloadLink, }); } \ No newline at end of file diff --git a/frontend/resources/translations/en.json b/frontend/resources/translations/en.json index ef8078a2a8..bec922f153 100644 --- a/frontend/resources/translations/en.json +++ b/frontend/resources/translations/en.json @@ -2962,16 +2962,16 @@ "emails": "Email" }, "quickNote": { - "label": "Quick note", - "quickNotes": "Quick notes", - "search": "Search quick notes", + "label": "Quick Note", + "quickNotes": "Quick Notes", + "search": "Search Quick Notes", "collapseFullView": "Collapse full view", "expandFullView": "Expand full view", - "createFailed": "Failed to create quick note", - "quickNotesEmpty": "No quick notes", + "createFailed": "Failed to create Quick Note", + "quickNotesEmpty": "No Quick Notes", "emptyNote": "Empty note", "deleteNotePrompt": "The selected note will be deleted permanently. Are you sure you want to delete it?", - "addNote": "New note", + "addNote": "New Note", "noAdditionalText": "No additional text" }, "subscribe": {