From 04572a8e5081b1e4871e273cde9dbaaa44c52fe0 Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Wed, 13 Mar 2024 21:43:44 +0000 Subject: structure: Create apps dir and copy tooling dir from t3-turbo repo --- packages/browser-extension/.eslintrc.cjs | 3 - packages/browser-extension/.gitignore | 24 -- packages/browser-extension/index.html | 13 - packages/browser-extension/manifest.json | 19 -- packages/browser-extension/package.json | 44 ---- packages/browser-extension/postcss.config.js | 6 - packages/browser-extension/public/logo-128.png | Bin 2362 -> 0 bytes packages/browser-extension/public/logo-16.png | Bin 287 -> 0 bytes packages/browser-extension/public/logo-48.png | Bin 780 -> 0 bytes packages/browser-extension/public/logo.png | Bin 412 -> 0 bytes .../browser-extension/src/BookmarkDeletedPage.tsx | 3 - .../browser-extension/src/BookmarkSavedPage.tsx | 62 ----- packages/browser-extension/src/Layout.tsx | 51 ---- packages/browser-extension/src/Logo.tsx | 10 - .../browser-extension/src/NotConfiguredPage.tsx | 47 ---- packages/browser-extension/src/OptionsPage.tsx | 60 ----- packages/browser-extension/src/SavePage.tsx | 60 ----- packages/browser-extension/src/SignInPage.tsx | 89 ------- packages/browser-extension/src/Spinner.tsx | 18 -- packages/browser-extension/src/assets/react.svg | 1 - packages/browser-extension/src/index.css | 72 ------ packages/browser-extension/src/main.tsx | 40 ---- packages/browser-extension/src/utils/providers.tsx | 46 ---- packages/browser-extension/src/utils/settings.ts | 22 -- packages/browser-extension/src/utils/trpc.ts | 4 - packages/browser-extension/src/vite-env.d.ts | 1 - packages/browser-extension/tailwind.config.js | 10 - packages/browser-extension/tsconfig.json | 25 -- packages/browser-extension/tsconfig.node.json | 11 - packages/browser-extension/vite.config.ts | 9 - packages/db/package.json | 13 +- packages/db/tsconfig.json | 7 +- packages/mobile/.eslintrc.js | 4 - packages/mobile/.gitignore | 39 --- packages/mobile/.npmrc | 1 - packages/mobile/app.json | 57 ----- packages/mobile/app/+not-found.tsx | 6 - packages/mobile/app/_layout.tsx | 53 ----- packages/mobile/app/dashboard/(tabs)/_layout.tsx | 38 --- packages/mobile/app/dashboard/(tabs)/index.tsx | 31 --- packages/mobile/app/dashboard/(tabs)/lists.tsx | 67 ------ packages/mobile/app/dashboard/(tabs)/search.tsx | 35 --- packages/mobile/app/dashboard/(tabs)/settings.tsx | 41 ---- packages/mobile/app/dashboard/_layout.tsx | 38 --- packages/mobile/app/dashboard/add-link.tsx | 57 ----- packages/mobile/app/dashboard/add-note.tsx | 53 ----- packages/mobile/app/dashboard/archive.tsx | 11 - packages/mobile/app/dashboard/favourites.tsx | 11 - packages/mobile/app/dashboard/lists/[slug].tsx | 31 --- packages/mobile/app/error.tsx | 9 - packages/mobile/app/index.tsx | 20 -- packages/mobile/app/sharing.tsx | 99 -------- packages/mobile/app/signin.tsx | 101 -------- packages/mobile/assets/blur.jpeg | Bin 178818 -> 0 bytes packages/mobile/assets/icon.png | Bin 2362 -> 0 bytes packages/mobile/assets/splash.png | Bin 117993 -> 0 bytes packages/mobile/babel.config.js | 9 - packages/mobile/components/Logo.tsx | 11 - .../mobile/components/bookmarks/BookmarkCard.tsx | 243 ------------------- .../mobile/components/bookmarks/BookmarkList.tsx | 61 ----- packages/mobile/components/ui/ActionButton.tsx | 21 -- packages/mobile/components/ui/Button.tsx | 81 ------- packages/mobile/components/ui/Divider.tsx | 28 --- packages/mobile/components/ui/FullPageSpinner.tsx | 9 - packages/mobile/components/ui/Input.tsx | 28 --- packages/mobile/components/ui/Skeleton.tsx | 38 --- packages/mobile/components/ui/Toast.tsx | 183 -------------- packages/mobile/eas.json | 19 -- packages/mobile/globals.css | 80 ------- packages/mobile/lib/last-shared-intent.ts | 15 -- packages/mobile/lib/providers.tsx | 54 ----- packages/mobile/lib/session.ts | 20 -- packages/mobile/lib/settings.ts | 29 --- packages/mobile/lib/storage-state.ts | 51 ---- packages/mobile/lib/trpc.ts | 4 - packages/mobile/lib/utils.ts | 6 - packages/mobile/metro.config.js | 8 - packages/mobile/nativewind-env.d.ts | 1 - packages/mobile/package.json | 53 ----- packages/mobile/tailwind.config.js | 71 ------ packages/mobile/tsconfig.json | 10 - packages/shared/package.json | 15 +- packages/shared/tsconfig.json | 9 + packages/trpc/package.json | 19 +- packages/trpc/tsconfig.json | 9 +- packages/web/README.md | 36 --- packages/web/app/api/auth/[...nextauth]/route.tsx | 3 - packages/web/app/api/trpc/[trpc]/route.ts | 36 --- packages/web/app/dashboard/admin/page.tsx | 203 ---------------- packages/web/app/dashboard/archive/page.tsx | 9 - packages/web/app/dashboard/bookmarks/layout.tsx | 23 -- packages/web/app/dashboard/bookmarks/loading.tsx | 11 - packages/web/app/dashboard/bookmarks/page.tsx | 5 - packages/web/app/dashboard/error.tsx | 9 - packages/web/app/dashboard/favourites/page.tsx | 14 -- packages/web/app/dashboard/layout.tsx | 24 -- packages/web/app/dashboard/lists/[listId]/page.tsx | 44 ---- packages/web/app/dashboard/lists/page.tsx | 14 -- packages/web/app/dashboard/not-found.tsx | 7 - .../app/dashboard/preview/[bookmarkId]/page.tsx | 14 -- packages/web/app/dashboard/search/page.tsx | 41 ---- packages/web/app/dashboard/settings/page.tsx | 9 - packages/web/app/dashboard/tags/[tagName]/page.tsx | 55 ----- packages/web/app/dashboard/tags/page.tsx | 56 ----- packages/web/app/favicon.ico | Bin 15406 -> 0 bytes packages/web/app/globals.css | 76 ------ packages/web/app/layout.tsx | 51 ---- packages/web/app/page.tsx | 12 - packages/web/app/signin/page.tsx | 25 -- packages/web/components.json | 17 -- .../dashboard/bookmarks/AddLinkButton.tsx | 102 -------- .../dashboard/bookmarks/AddToListModal.tsx | 168 ------------- .../dashboard/bookmarks/BookmarkCardSkeleton.tsx | 30 --- .../dashboard/bookmarks/BookmarkOptions.tsx | 185 --------------- .../dashboard/bookmarks/BookmarkPreview.tsx | 101 -------- .../dashboard/bookmarks/BookmarkedTextEditor.tsx | 109 --------- .../dashboard/bookmarks/BookmarkedTextViewer.tsx | 20 -- .../components/dashboard/bookmarks/Bookmarks.tsx | 32 --- .../dashboard/bookmarks/BookmarksGrid.tsx | 64 ----- .../components/dashboard/bookmarks/LinkCard.tsx | 114 --------- .../web/components/dashboard/bookmarks/TagList.tsx | 39 --- .../components/dashboard/bookmarks/TagModal.tsx | 207 ---------------- .../components/dashboard/bookmarks/TextCard.tsx | 94 -------- .../web/components/dashboard/bookmarks/TopNav.tsx | 43 ---- .../components/dashboard/lists/AllListsView.tsx | 66 ------ .../dashboard/lists/DeleteListButton.tsx | 77 ------ .../web/components/dashboard/lists/ListView.tsx | 25 -- .../components/dashboard/search/SearchInput.tsx | 25 -- .../components/dashboard/settings/AddApiKey.tsx | 167 ------------- .../dashboard/settings/ApiKeySettings.tsx | 49 ---- .../components/dashboard/settings/DeleteApiKey.tsx | 74 ------ .../web/components/dashboard/sidebar/AllLists.tsx | 60 ----- .../components/dashboard/sidebar/ModileSidebar.tsx | 24 -- .../dashboard/sidebar/ModileSidebarItem.tsx | 27 --- .../components/dashboard/sidebar/NewListModal.tsx | 170 ------------- .../web/components/dashboard/sidebar/Sidebar.tsx | 66 ------ .../components/dashboard/sidebar/SidebarItem.tsx | 33 --- .../dashboard/sidebar/SidebarProfileOptions.tsx | 35 --- packages/web/components/signin/CredentialsForm.tsx | 222 ----------------- packages/web/components/signin/SignInForm.tsx | 37 --- .../web/components/signin/SignInProviderButton.tsx | 21 -- packages/web/components/ui/action-button.tsx | 25 -- packages/web/components/ui/back-button.tsx | 9 - packages/web/components/ui/badge.tsx | 36 --- packages/web/components/ui/button.tsx | 56 ----- packages/web/components/ui/card.tsx | 86 ------- packages/web/components/ui/dialog.tsx | 122 ---------- packages/web/components/ui/dropdown-menu.tsx | 200 ---------------- packages/web/components/ui/form.tsx | 177 -------------- packages/web/components/ui/imageCard.tsx | 70 ------ packages/web/components/ui/input.tsx | 25 -- packages/web/components/ui/label.tsx | 26 -- packages/web/components/ui/popover.tsx | 31 --- packages/web/components/ui/scroll-area.tsx | 48 ---- packages/web/components/ui/select.tsx | 160 ------------- packages/web/components/ui/separator.tsx | 31 --- packages/web/components/ui/skeleton.tsx | 15 -- packages/web/components/ui/spinner.tsx | 20 -- packages/web/components/ui/table.tsx | 117 --------- packages/web/components/ui/tabs.tsx | 55 ----- packages/web/components/ui/textarea.tsx | 24 -- packages/web/components/ui/toast.tsx | 127 ---------- packages/web/components/ui/toaster.tsx | 35 --- packages/web/components/ui/use-toast.ts | 189 --------------- packages/web/lib/bookmarkUtils.tsx | 22 -- packages/web/lib/hooks/bookmark-search.ts | 73 ------ packages/web/lib/providers.tsx | 75 ------ packages/web/lib/trpc.tsx | 5 - packages/web/lib/utils.ts | 6 - packages/web/next.config.mjs | 43 ---- packages/web/package.json | 74 ------ packages/web/postcss.config.js | 6 - packages/web/public/blur.avif | Bin 52746 -> 0 bytes packages/web/public/icons/logo-128.png | Bin 2362 -> 0 bytes packages/web/public/icons/logo-16.png | Bin 287 -> 0 bytes packages/web/public/icons/logo-48.png | Bin 780 -> 0 bytes packages/web/public/manifest.json | 25 -- packages/web/server/api/client.ts | 16 -- packages/web/server/auth.ts | 96 -------- packages/web/tailwind.config.ts | 89 ------- packages/web/tsconfig.json | 28 --- packages/web/vitest.config.ts | 14 -- packages/workers/crawler.ts | 201 ---------------- packages/workers/index.ts | 16 -- packages/workers/openai.ts | 263 --------------------- packages/workers/package.json | 45 ---- packages/workers/search.ts | 116 --------- packages/workers/tsconfig.json | 11 - 188 files changed, 55 insertions(+), 8890 deletions(-) delete mode 100644 packages/browser-extension/.eslintrc.cjs delete mode 100644 packages/browser-extension/.gitignore delete mode 100644 packages/browser-extension/index.html delete mode 100644 packages/browser-extension/manifest.json delete mode 100644 packages/browser-extension/package.json delete mode 100644 packages/browser-extension/postcss.config.js delete mode 100644 packages/browser-extension/public/logo-128.png delete mode 100644 packages/browser-extension/public/logo-16.png delete mode 100644 packages/browser-extension/public/logo-48.png delete mode 100644 packages/browser-extension/public/logo.png delete mode 100644 packages/browser-extension/src/BookmarkDeletedPage.tsx delete mode 100644 packages/browser-extension/src/BookmarkSavedPage.tsx delete mode 100644 packages/browser-extension/src/Layout.tsx delete mode 100644 packages/browser-extension/src/Logo.tsx delete mode 100644 packages/browser-extension/src/NotConfiguredPage.tsx delete mode 100644 packages/browser-extension/src/OptionsPage.tsx delete mode 100644 packages/browser-extension/src/SavePage.tsx delete mode 100644 packages/browser-extension/src/SignInPage.tsx delete mode 100644 packages/browser-extension/src/Spinner.tsx delete mode 100644 packages/browser-extension/src/assets/react.svg delete mode 100644 packages/browser-extension/src/index.css delete mode 100644 packages/browser-extension/src/main.tsx delete mode 100644 packages/browser-extension/src/utils/providers.tsx delete mode 100644 packages/browser-extension/src/utils/settings.ts delete mode 100644 packages/browser-extension/src/utils/trpc.ts delete mode 100644 packages/browser-extension/src/vite-env.d.ts delete mode 100644 packages/browser-extension/tailwind.config.js delete mode 100644 packages/browser-extension/tsconfig.json delete mode 100644 packages/browser-extension/tsconfig.node.json delete mode 100644 packages/browser-extension/vite.config.ts delete mode 100644 packages/mobile/.eslintrc.js delete mode 100644 packages/mobile/.gitignore delete mode 100644 packages/mobile/.npmrc delete mode 100644 packages/mobile/app.json delete mode 100644 packages/mobile/app/+not-found.tsx delete mode 100644 packages/mobile/app/_layout.tsx delete mode 100644 packages/mobile/app/dashboard/(tabs)/_layout.tsx delete mode 100644 packages/mobile/app/dashboard/(tabs)/index.tsx delete mode 100644 packages/mobile/app/dashboard/(tabs)/lists.tsx delete mode 100644 packages/mobile/app/dashboard/(tabs)/search.tsx delete mode 100644 packages/mobile/app/dashboard/(tabs)/settings.tsx delete mode 100644 packages/mobile/app/dashboard/_layout.tsx delete mode 100644 packages/mobile/app/dashboard/add-link.tsx delete mode 100644 packages/mobile/app/dashboard/add-note.tsx delete mode 100644 packages/mobile/app/dashboard/archive.tsx delete mode 100644 packages/mobile/app/dashboard/favourites.tsx delete mode 100644 packages/mobile/app/dashboard/lists/[slug].tsx delete mode 100644 packages/mobile/app/error.tsx delete mode 100644 packages/mobile/app/index.tsx delete mode 100644 packages/mobile/app/sharing.tsx delete mode 100644 packages/mobile/app/signin.tsx delete mode 100644 packages/mobile/assets/blur.jpeg delete mode 100644 packages/mobile/assets/icon.png delete mode 100644 packages/mobile/assets/splash.png delete mode 100644 packages/mobile/babel.config.js delete mode 100644 packages/mobile/components/Logo.tsx delete mode 100644 packages/mobile/components/bookmarks/BookmarkCard.tsx delete mode 100644 packages/mobile/components/bookmarks/BookmarkList.tsx delete mode 100644 packages/mobile/components/ui/ActionButton.tsx delete mode 100644 packages/mobile/components/ui/Button.tsx delete mode 100644 packages/mobile/components/ui/Divider.tsx delete mode 100644 packages/mobile/components/ui/FullPageSpinner.tsx delete mode 100644 packages/mobile/components/ui/Input.tsx delete mode 100644 packages/mobile/components/ui/Skeleton.tsx delete mode 100644 packages/mobile/components/ui/Toast.tsx delete mode 100644 packages/mobile/eas.json delete mode 100644 packages/mobile/globals.css delete mode 100644 packages/mobile/lib/last-shared-intent.ts delete mode 100644 packages/mobile/lib/providers.tsx delete mode 100644 packages/mobile/lib/session.ts delete mode 100644 packages/mobile/lib/settings.ts delete mode 100644 packages/mobile/lib/storage-state.ts delete mode 100644 packages/mobile/lib/trpc.ts delete mode 100644 packages/mobile/lib/utils.ts delete mode 100644 packages/mobile/metro.config.js delete mode 100644 packages/mobile/nativewind-env.d.ts delete mode 100644 packages/mobile/package.json delete mode 100644 packages/mobile/tailwind.config.js delete mode 100644 packages/mobile/tsconfig.json create mode 100644 packages/shared/tsconfig.json delete mode 100644 packages/web/README.md delete mode 100644 packages/web/app/api/auth/[...nextauth]/route.tsx delete mode 100644 packages/web/app/api/trpc/[trpc]/route.ts delete mode 100644 packages/web/app/dashboard/admin/page.tsx delete mode 100644 packages/web/app/dashboard/archive/page.tsx delete mode 100644 packages/web/app/dashboard/bookmarks/layout.tsx delete mode 100644 packages/web/app/dashboard/bookmarks/loading.tsx delete mode 100644 packages/web/app/dashboard/bookmarks/page.tsx delete mode 100644 packages/web/app/dashboard/error.tsx delete mode 100644 packages/web/app/dashboard/favourites/page.tsx delete mode 100644 packages/web/app/dashboard/layout.tsx delete mode 100644 packages/web/app/dashboard/lists/[listId]/page.tsx delete mode 100644 packages/web/app/dashboard/lists/page.tsx delete mode 100644 packages/web/app/dashboard/not-found.tsx delete mode 100644 packages/web/app/dashboard/preview/[bookmarkId]/page.tsx delete mode 100644 packages/web/app/dashboard/search/page.tsx delete mode 100644 packages/web/app/dashboard/settings/page.tsx delete mode 100644 packages/web/app/dashboard/tags/[tagName]/page.tsx delete mode 100644 packages/web/app/dashboard/tags/page.tsx delete mode 100644 packages/web/app/favicon.ico delete mode 100644 packages/web/app/globals.css delete mode 100644 packages/web/app/layout.tsx delete mode 100644 packages/web/app/page.tsx delete mode 100644 packages/web/app/signin/page.tsx delete mode 100644 packages/web/components.json delete mode 100644 packages/web/components/dashboard/bookmarks/AddLinkButton.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/AddToListModal.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarkCardSkeleton.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarkOptions.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarkPreview.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarkedTextEditor.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarkedTextViewer.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/Bookmarks.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/BookmarksGrid.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/LinkCard.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/TagList.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/TagModal.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/TextCard.tsx delete mode 100644 packages/web/components/dashboard/bookmarks/TopNav.tsx delete mode 100644 packages/web/components/dashboard/lists/AllListsView.tsx delete mode 100644 packages/web/components/dashboard/lists/DeleteListButton.tsx delete mode 100644 packages/web/components/dashboard/lists/ListView.tsx delete mode 100644 packages/web/components/dashboard/search/SearchInput.tsx delete mode 100644 packages/web/components/dashboard/settings/AddApiKey.tsx delete mode 100644 packages/web/components/dashboard/settings/ApiKeySettings.tsx delete mode 100644 packages/web/components/dashboard/settings/DeleteApiKey.tsx delete mode 100644 packages/web/components/dashboard/sidebar/AllLists.tsx delete mode 100644 packages/web/components/dashboard/sidebar/ModileSidebar.tsx delete mode 100644 packages/web/components/dashboard/sidebar/ModileSidebarItem.tsx delete mode 100644 packages/web/components/dashboard/sidebar/NewListModal.tsx delete mode 100644 packages/web/components/dashboard/sidebar/Sidebar.tsx delete mode 100644 packages/web/components/dashboard/sidebar/SidebarItem.tsx delete mode 100644 packages/web/components/dashboard/sidebar/SidebarProfileOptions.tsx delete mode 100644 packages/web/components/signin/CredentialsForm.tsx delete mode 100644 packages/web/components/signin/SignInForm.tsx delete mode 100644 packages/web/components/signin/SignInProviderButton.tsx delete mode 100644 packages/web/components/ui/action-button.tsx delete mode 100644 packages/web/components/ui/back-button.tsx delete mode 100644 packages/web/components/ui/badge.tsx delete mode 100644 packages/web/components/ui/button.tsx delete mode 100644 packages/web/components/ui/card.tsx delete mode 100644 packages/web/components/ui/dialog.tsx delete mode 100644 packages/web/components/ui/dropdown-menu.tsx delete mode 100644 packages/web/components/ui/form.tsx delete mode 100644 packages/web/components/ui/imageCard.tsx delete mode 100644 packages/web/components/ui/input.tsx delete mode 100644 packages/web/components/ui/label.tsx delete mode 100644 packages/web/components/ui/popover.tsx delete mode 100644 packages/web/components/ui/scroll-area.tsx delete mode 100644 packages/web/components/ui/select.tsx delete mode 100644 packages/web/components/ui/separator.tsx delete mode 100644 packages/web/components/ui/skeleton.tsx delete mode 100644 packages/web/components/ui/spinner.tsx delete mode 100644 packages/web/components/ui/table.tsx delete mode 100644 packages/web/components/ui/tabs.tsx delete mode 100644 packages/web/components/ui/textarea.tsx delete mode 100644 packages/web/components/ui/toast.tsx delete mode 100644 packages/web/components/ui/toaster.tsx delete mode 100644 packages/web/components/ui/use-toast.ts delete mode 100644 packages/web/lib/bookmarkUtils.tsx delete mode 100644 packages/web/lib/hooks/bookmark-search.ts delete mode 100644 packages/web/lib/providers.tsx delete mode 100644 packages/web/lib/trpc.tsx delete mode 100644 packages/web/lib/utils.ts delete mode 100644 packages/web/next.config.mjs delete mode 100644 packages/web/package.json delete mode 100644 packages/web/postcss.config.js delete mode 100644 packages/web/public/blur.avif delete mode 100644 packages/web/public/icons/logo-128.png delete mode 100644 packages/web/public/icons/logo-16.png delete mode 100644 packages/web/public/icons/logo-48.png delete mode 100644 packages/web/public/manifest.json delete mode 100644 packages/web/server/api/client.ts delete mode 100644 packages/web/server/auth.ts delete mode 100644 packages/web/tailwind.config.ts delete mode 100644 packages/web/tsconfig.json delete mode 100644 packages/web/vitest.config.ts delete mode 100644 packages/workers/crawler.ts delete mode 100644 packages/workers/index.ts delete mode 100644 packages/workers/openai.ts delete mode 100644 packages/workers/package.json delete mode 100644 packages/workers/search.ts delete mode 100644 packages/workers/tsconfig.json (limited to 'packages') diff --git a/packages/browser-extension/.eslintrc.cjs b/packages/browser-extension/.eslintrc.cjs deleted file mode 100644 index 450106a4..00000000 --- a/packages/browser-extension/.eslintrc.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ignorePatterns: ["dist/"], -}; diff --git a/packages/browser-extension/.gitignore b/packages/browser-extension/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/packages/browser-extension/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/packages/browser-extension/index.html b/packages/browser-extension/index.html deleted file mode 100644 index e4b78eae..00000000 --- a/packages/browser-extension/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/packages/browser-extension/manifest.json b/packages/browser-extension/manifest.json deleted file mode 100644 index d3a27e7b..00000000 --- a/packages/browser-extension/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "manifest_version": 3, - "name": "Hoarder", - "description": "An extension to bookmark links to hoarder.app", - "version": "1.1", - "icons": { - "16": "public/logo-16.png", - "48": "public/logo-48.png", - "128": "public/logo-128.png" - }, - "action": { - "default_popup": "index.html" - }, - "options_ui": { - "page": "index.html#options", - "open_in_tab": false - }, - "permissions": ["storage", "tabs"] -} diff --git a/packages/browser-extension/package.json b/packages/browser-extension/package.json deleted file mode 100644 index b205a257..00000000 --- a/packages/browser-extension/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "browser-extension", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@hoarder/trpc": "0.1.0", - "@tanstack/react-query": "^5.24.8", - "@trpc/client": "11.0.0-next-beta.308", - "@trpc/next": "11.0.0-next-beta.308", - "@trpc/react-query": "11.0.0-next-beta.308", - "@trpc/server": "11.0.0-next-beta.308", - "@types/chrome": "^0.0.260", - "lucide-react": "^0.330.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.22.0", - "use-chrome-storage": "^1.2.2", - "superjson": "^2.2.1", - "zod": "^3.22.4" - }, - "devDependencies": { - "@crxjs/vite-plugin": "^1.0.14", - "@types/react": "^18.2.55", - "@types/react-dom": "^18.2.19", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "autoprefixer": "^10.4.17", - "eslint": "^8.56.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", - "postcss": "^8.4.35", - "tailwindcss": "^3.4.1", - "typescript": "^5.2.2", - "vite": "^5.1.0" - } -} diff --git a/packages/browser-extension/postcss.config.js b/packages/browser-extension/postcss.config.js deleted file mode 100644 index 2aa7205d..00000000 --- a/packages/browser-extension/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/packages/browser-extension/public/logo-128.png b/packages/browser-extension/public/logo-128.png deleted file mode 100644 index 71ead90c..00000000 Binary files a/packages/browser-extension/public/logo-128.png and /dev/null differ diff --git a/packages/browser-extension/public/logo-16.png b/packages/browser-extension/public/logo-16.png deleted file mode 100644 index dd864d44..00000000 Binary files a/packages/browser-extension/public/logo-16.png and /dev/null differ diff --git a/packages/browser-extension/public/logo-48.png b/packages/browser-extension/public/logo-48.png deleted file mode 100644 index 7ba1cd49..00000000 Binary files a/packages/browser-extension/public/logo-48.png and /dev/null differ diff --git a/packages/browser-extension/public/logo.png b/packages/browser-extension/public/logo.png deleted file mode 100644 index ebe0a6a3..00000000 Binary files a/packages/browser-extension/public/logo.png and /dev/null differ diff --git a/packages/browser-extension/src/BookmarkDeletedPage.tsx b/packages/browser-extension/src/BookmarkDeletedPage.tsx deleted file mode 100644 index 23e1d9da..00000000 --- a/packages/browser-extension/src/BookmarkDeletedPage.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function BookmarkDeletedPage() { - return

Bookmark Deleted!

; -} diff --git a/packages/browser-extension/src/BookmarkSavedPage.tsx b/packages/browser-extension/src/BookmarkSavedPage.tsx deleted file mode 100644 index f25a83ba..00000000 --- a/packages/browser-extension/src/BookmarkSavedPage.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Link, useNavigate, useParams } from "react-router-dom"; -import { api } from "./utils/trpc"; -import usePluginSettings from "./utils/settings"; -import { ArrowUpRightFromSquare, Trash } from "lucide-react"; -import Spinner from "./Spinner"; -import { useState } from "react"; - -export default function BookmarkSavedPage() { - const { bookmarkId } = useParams(); - const navigate = useNavigate(); - const [error, setError] = useState(""); - - const { mutate: deleteBookmark, isPending } = - api.bookmarks.deleteBookmark.useMutation({ - onSuccess: () => { - navigate("/bookmarkdeleted"); - }, - onError: (e) => { - setError(e.message); - }, - }); - - const { settings } = usePluginSettings(); - - if (!bookmarkId) { - return
NOT FOUND
; - } - - return ( -
- {error &&

{error}

} -
-

Bookmarked!

-
- - -

Open

- - -
-
-
- ); -} diff --git a/packages/browser-extension/src/Layout.tsx b/packages/browser-extension/src/Layout.tsx deleted file mode 100644 index f8279a18..00000000 --- a/packages/browser-extension/src/Layout.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Outlet } from "react-router-dom"; -import { Home, RefreshCw, Settings, X } from "lucide-react"; -import { useNavigate } from "react-router-dom"; -import usePluginSettings from "./utils/settings"; - -export default function Layout() { - const navigate = useNavigate(); - const { settings, isPending: isInit } = usePluginSettings(); - if (!isInit) { - return
Loading ...
; - } - - if (!settings.apiKey || !settings.address) { - navigate("/notconfigured"); - return; - } - - return ( -
-
- -
-
-
-
- - - Bookmarks - -
-
- {process.env.NODE_ENV == "development" && ( - - )} - - -
-
-
- ); -} diff --git a/packages/browser-extension/src/Logo.tsx b/packages/browser-extension/src/Logo.tsx deleted file mode 100644 index 6b29e68c..00000000 --- a/packages/browser-extension/src/Logo.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { PackageOpen } from "lucide-react"; - -export default function Logo() { - return ( - - -

Hoarder

-
- ); -} diff --git a/packages/browser-extension/src/NotConfiguredPage.tsx b/packages/browser-extension/src/NotConfiguredPage.tsx deleted file mode 100644 index fc5c8f47..00000000 --- a/packages/browser-extension/src/NotConfiguredPage.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useEffect, useState } from "react"; -import { useNavigate } from "react-router-dom"; -import usePluginSettings from "./utils/settings"; -import Logo from "./Logo"; - -export default function NotConfiguredPage() { - const navigate = useNavigate(); - - const { settings, setSettings } = usePluginSettings(); - - const [error, setError] = useState(""); - const [serverAddress, setServerAddress] = useState(settings.address); - useEffect(() => { - setServerAddress(settings.address); - }, [settings.address]); - - const onSave = () => { - if (serverAddress == "") { - setError("Server address is required"); - return; - } - setSettings((s) => ({ ...s, address: serverAddress })); - navigate("/signin"); - }; - - return ( -
- - - To use the plugin, you need to configure it first. - -

{error}

-
- - setServerAddress(e.target.value)} - /> -
- -
- ); -} diff --git a/packages/browser-extension/src/OptionsPage.tsx b/packages/browser-extension/src/OptionsPage.tsx deleted file mode 100644 index 6407b3cc..00000000 --- a/packages/browser-extension/src/OptionsPage.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React, { useEffect } from "react"; -import usePluginSettings from "./utils/settings"; -import { api } from "./utils/trpc"; -import Spinner from "./Spinner"; -import { useNavigate } from "react-router-dom"; -import Logo from "./Logo"; - -export default function OptionsPage() { - const navigate = useNavigate(); - const { settings, setSettings } = usePluginSettings(); - - const { data: whoami, error: whoAmIError } = api.users.whoami.useQuery( - undefined, - { - enabled: settings.address != "", - }, - ); - - const invalidateWhoami = api.useUtils().users.whoami.refetch; - - useEffect(() => { - invalidateWhoami(); - }, [settings, invalidateWhoami]); - - let loggedInMessage: React.ReactNode; - if (whoAmIError) { - if (whoAmIError.data?.code == "UNAUTHORIZED") { - loggedInMessage = Not logged in; - } else { - loggedInMessage = ( - Something went wrong: {whoAmIError.message} - ); - } - } else if (whoami) { - loggedInMessage = {whoami.email}; - } else { - loggedInMessage = ; - } - - const onLogout = () => { - setSettings((s) => ({ ...s, apiKey: "" })); - invalidateWhoami(); - navigate("/notconfigured"); - }; - - return ( -
- - Settings -
-
- Logged in as: - {loggedInMessage} -
- -
- ); -} diff --git a/packages/browser-extension/src/SavePage.tsx b/packages/browser-extension/src/SavePage.tsx deleted file mode 100644 index 638af149..00000000 --- a/packages/browser-extension/src/SavePage.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useEffect, useState } from "react"; -import Spinner from "./Spinner"; -import { api } from "./utils/trpc"; -import { Navigate } from "react-router-dom"; - -export default function SavePage() { - const [error, setError] = useState(undefined); - - const { - data, - mutate: createBookmark, - status, - } = api.bookmarks.createBookmark.useMutation({ - onError: (e) => { - setError("Something went wrong: " + e.message); - }, - }); - - useEffect(() => { - async function runSave() { - let currentUrl; - const [currentTab] = await chrome.tabs.query({ - active: true, - lastFocusedWindow: true, - }); - if (currentTab?.url) { - currentUrl = currentTab.url; - } else { - setError("Couldn't find the URL of the current tab"); - return; - } - - createBookmark({ - type: "link", - url: currentUrl, - }); - } - runSave(); - }, [createBookmark]); - - switch (status) { - case "error": { - return
{error}
; - } - case "success": { - return ; - } - case "pending": { - return ( -
- Saving Bookmark - -
- ); - } - case "idle": { - return
; - } - } -} diff --git a/packages/browser-extension/src/SignInPage.tsx b/packages/browser-extension/src/SignInPage.tsx deleted file mode 100644 index 6db7c348..00000000 --- a/packages/browser-extension/src/SignInPage.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { useState } from "react"; -import { api } from "./utils/trpc"; -import usePluginSettings from "./utils/settings"; -import { useNavigate } from "react-router-dom"; -import Logo from "./Logo"; - -export default function SignInPage() { - const navigate = useNavigate(); - const { setSettings } = usePluginSettings(); - - const { - mutate: login, - error, - isPending, - } = api.apiKeys.exchange.useMutation({ - onSuccess: (resp) => { - setSettings((s) => ({ ...s, apiKey: resp.key })); - navigate("/options"); - }, - onError: () => {}, - }); - - const [formData, setFormData] = useState<{ - email: string; - password: string; - }>({ - email: "", - password: "", - }); - - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - const randStr = (Math.random() + 1).toString(36).substring(5); - login({ ...formData, keyName: `Browser extension: (${randStr})` }); - }; - - let errorMessage = ""; - if (error) { - if (error.data?.code == "UNAUTHORIZED") { - errorMessage = "Wrong username or password"; - } else { - errorMessage = error.message; - } - } - - return ( -
- -

Login

-

{errorMessage}

-
-
- - - setFormData((f) => ({ ...f, email: e.target.value })) - } - type="text" - name="email" - className="h-8 flex-1 rounded-lg border border-gray-300 p-2" - /> -
-
- - - setFormData((f) => ({ - ...f, - password: e.target.value, - })) - } - type="password" - name="password" - className="h-8 flex-1 rounded-lg border border-gray-300 p-2" - /> -
- -
-
- ); -} diff --git a/packages/browser-extension/src/Spinner.tsx b/packages/browser-extension/src/Spinner.tsx deleted file mode 100644 index 9fd8839b..00000000 --- a/packages/browser-extension/src/Spinner.tsx +++ /dev/null @@ -1,18 +0,0 @@ -export default function Spinner() { - return ( - - - - ); -} diff --git a/packages/browser-extension/src/assets/react.svg b/packages/browser-extension/src/assets/react.svg deleted file mode 100644 index 6c87de9b..00000000 --- a/packages/browser-extension/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/browser-extension/src/index.css b/packages/browser-extension/src/index.css deleted file mode 100644 index e7d4bb2f..00000000 --- a/packages/browser-extension/src/index.css +++ /dev/null @@ -1,72 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/packages/browser-extension/src/main.tsx b/packages/browser-extension/src/main.tsx deleted file mode 100644 index 085a5a69..00000000 --- a/packages/browser-extension/src/main.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import ReactDOM from "react-dom/client"; -import "./index.css"; -import OptionsPage from "./OptionsPage.tsx"; -import NotConfiguredPage from "./NotConfiguredPage.tsx"; -import { Providers } from "./utils/providers.tsx"; -import BookmarkSavedPage from "./BookmarkSavedPage.tsx"; -import { HashRouter, Routes, Route } from "react-router-dom"; -import Layout from "./Layout.tsx"; -import SavePage from "./SavePage.tsx"; -import BookmarkDeletedPage from "./BookmarkDeletedPage.tsx"; -import SignInPage from "./SignInPage.tsx"; - -function App() { - return ( -
- - - - }> - } /> - } - /> - } - /> - - } /> - } /> - } /> - - - -
- ); -} - -ReactDOM.createRoot(document.getElementById("root")!).render(); diff --git a/packages/browser-extension/src/utils/providers.tsx b/packages/browser-extension/src/utils/providers.tsx deleted file mode 100644 index d20f2512..00000000 --- a/packages/browser-extension/src/utils/providers.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { httpBatchLink } from "@trpc/client"; -import { useEffect, useState } from "react"; -import { api } from "./trpc"; -import usePluginSettings, { getPluginSettings } from "./settings"; -import superjson from "superjson"; - -function getTRPCClient(address: string) { - return api.createClient({ - links: [ - httpBatchLink({ - url: `${address}/api/trpc`, - async headers() { - const settings = await getPluginSettings(); - return { - Authorization: `Bearer ${settings.apiKey}`, - }; - }, - transformer: superjson, - }), - ], - }); -} - -export function Providers({ children }: { children: React.ReactNode }) { - const { settings } = usePluginSettings(); - const [queryClient] = useState(() => new QueryClient()); - - const [trpcClient, setTrpcClient] = useState< - ReturnType - >(getTRPCClient(settings.address)); - - useEffect(() => { - setTrpcClient(getTRPCClient(settings.address)); - }, [settings.address]); - - return ( - - {children} - - ); -} diff --git a/packages/browser-extension/src/utils/settings.ts b/packages/browser-extension/src/utils/settings.ts deleted file mode 100644 index 37f474c0..00000000 --- a/packages/browser-extension/src/utils/settings.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useChromeStorageSync } from "use-chrome-storage"; - -export type Settings = { - apiKey: string; - address: string; -}; - -export default function usePluginSettings() { - const [settings, setSettings, _1, _2, isInit] = useChromeStorageSync( - "settings", - { - apiKey: "", - address: "", - } as Settings, - ); - - return { settings, setSettings, isPending: isInit }; -} - -export async function getPluginSettings() { - return (await chrome.storage.sync.get("settings")).settings as Settings; -} diff --git a/packages/browser-extension/src/utils/trpc.ts b/packages/browser-extension/src/utils/trpc.ts deleted file mode 100644 index da21a55a..00000000 --- a/packages/browser-extension/src/utils/trpc.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createTRPCReact } from "@trpc/react-query"; -import type { AppRouter } from "@hoarder/trpc/routers/_app"; - -export const api = createTRPCReact(); diff --git a/packages/browser-extension/src/vite-env.d.ts b/packages/browser-extension/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/packages/browser-extension/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/browser-extension/tailwind.config.js b/packages/browser-extension/tailwind.config.js deleted file mode 100644 index 1c0c7c87..00000000 --- a/packages/browser-extension/tailwind.config.js +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -const tailwindConfig = { - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], - theme: { - extend: {}, - }, - plugins: [], -}; - -export default tailwindConfig; diff --git a/packages/browser-extension/tsconfig.json b/packages/browser-extension/tsconfig.json deleted file mode 100644 index a7fc6fbf..00000000 --- a/packages/browser-extension/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/packages/browser-extension/tsconfig.node.json b/packages/browser-extension/tsconfig.node.json deleted file mode 100644 index 97ede7ee..00000000 --- a/packages/browser-extension/tsconfig.node.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true - }, - "include": ["vite.config.ts"] -} diff --git a/packages/browser-extension/vite.config.ts b/packages/browser-extension/vite.config.ts deleted file mode 100644 index 29c6bc6e..00000000 --- a/packages/browser-extension/vite.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react-swc"; -import { crx } from "@crxjs/vite-plugin"; -import manifest from "./manifest.json"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), crx({ manifest })], -}); diff --git a/packages/db/package.json b/packages/db/package.json index 20dee1e9..aebbf8fe 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -4,6 +4,7 @@ "version": "0.1.0", "private": true, "main": "index.ts", + "type": "module", "scripts": { "typecheck": "tsc --noEmit", "migrate": "tsx migrate.ts", @@ -18,8 +19,18 @@ "tsx": "^4.7.1" }, "devDependencies": { + "@hoarder/eslint-config": "workspace:^0.2.0", + "@hoarder/prettier-config": "workspace:^0.1.0", + "@hoarder/tsconfig": "workspace:^0.1.0", "@tsconfig/node21": "^21.0.1", "@types/better-sqlite3": "^7.6.9", "drizzle-kit": "^0.20.14" - } + }, + "eslintConfig": { + "root": true, + "extends": [ + "@hoarder/eslint-config/base" + ] + }, + "prettier": "@hoarder/prettier-config" } diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json index cf49c407..59982ea1 100644 --- a/packages/db/tsconfig.json +++ b/packages/db/tsconfig.json @@ -1,11 +1,10 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@tsconfig/node21/tsconfig.json", + "extends": "@hoarder/tsconfig/node.json", "include": ["**/*.ts"], "exclude": ["node_modules"], "compilerOptions": { - "module": "ESNext", - "moduleResolution": "node", - "esModuleInterop": true + "baseUrl" : ".", + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" } } diff --git a/packages/mobile/.eslintrc.js b/packages/mobile/.eslintrc.js deleted file mode 100644 index 53beac49..00000000 --- a/packages/mobile/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: ["universe/native"], -}; diff --git a/packages/mobile/.gitignore b/packages/mobile/.gitignore deleted file mode 100644 index 2920e5a8..00000000 --- a/packages/mobile/.gitignore +++ /dev/null @@ -1,39 +0,0 @@ -# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files - -# dependencies -node_modules/ - -# Expo -.expo/ -dist/ -web-build/ - -# Native -*.orig.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision - -# Metro -.metro-health-check* - -# debug -npm-debug.* -yarn-debug.* -yarn-error.* - -# macOS -.DS_Store -*.pem - -# local env files -.env*.local - -# typescript -*.tsbuildinfo - -#build files -ios/ -android/ diff --git a/packages/mobile/.npmrc b/packages/mobile/.npmrc deleted file mode 100644 index d67f3748..00000000 --- a/packages/mobile/.npmrc +++ /dev/null @@ -1 +0,0 @@ -node-linker=hoisted diff --git a/packages/mobile/app.json b/packages/mobile/app.json deleted file mode 100644 index e16baa37..00000000 --- a/packages/mobile/app.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "expo": { - "name": "Hoarder App", - "slug": "hoarder", - "scheme": "hoarder", - "version": "1.2.0", - "orientation": "portrait", - "icon": "./assets/icon.png", - "userInterfaceStyle": "light", - "splash": { - "image": "./assets/splash.png", - "resizeMode": "contain", - "backgroundColor": "#ffffff" - }, - "assetBundlePatterns": [ - "**/*" - ], - "ios": { - "supportsTablet": true, - "bundleIdentifier": "app.hoarder.hoardermobile", - "config": { - "usesNonExemptEncryption": false - } - }, - "android": { - "adaptiveIcon": { - "foregroundImage": "./assets/icon.png", - "backgroundColor": "#ffffff" - }, - "package": "app.hoarder.hoardermobile" - }, - "plugins": [ - "expo-router", - [ - "expo-share-intent", - { - "iosActivationRules": { - "NSExtensionActivationSupportsWebURLWithMaxCount": 1, - "NSExtensionActivationSupportsWebPageWithMaxCount": 0, - "NSExtensionActivationSupportsImageWithMaxCount": 0, - "NSExtensionActivationSupportsMovieWithMaxCount": 0, - "NSExtensionActivationSupportsText": true - } - } - ], - "expo-secure-store" - ], - "extra": { - "router": { - "origin": false - }, - "eas": { - "projectId": "d6d14643-ad43-4cd3-902a-92c5944d5e45" - } - } - } -} diff --git a/packages/mobile/app/+not-found.tsx b/packages/mobile/app/+not-found.tsx deleted file mode 100644 index 466505b6..00000000 --- a/packages/mobile/app/+not-found.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { View } from "react-native"; - -// This is kinda important given that the sharing modal always resolve to an unknown route -export default function NotFound() { - return ; -} diff --git a/packages/mobile/app/_layout.tsx b/packages/mobile/app/_layout.tsx deleted file mode 100644 index 6304ced5..00000000 --- a/packages/mobile/app/_layout.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import "@/globals.css"; -import "expo-dev-client"; - -import { useRouter } from "expo-router"; -import { Stack } from "expo-router/stack"; -import { useShareIntent } from "expo-share-intent"; -import { StatusBar } from "expo-status-bar"; -import { useEffect } from "react"; -import { View } from "react-native"; - -import { useLastSharedIntent } from "@/lib/last-shared-intent"; -import { Providers } from "@/lib/providers"; - -export default function RootLayout() { - const router = useRouter(); - const { hasShareIntent, shareIntent, resetShareIntent } = useShareIntent(); - - const lastSharedIntent = useLastSharedIntent(); - - useEffect(() => { - const intentJson = JSON.stringify(shareIntent); - if (hasShareIntent && !lastSharedIntent.isPreviouslyShared(intentJson)) { - // TODO: Remove once https://github.com/achorein/expo-share-intent/issues/14 is fixed - lastSharedIntent.setIntent(intentJson); - router.replace({ - pathname: "sharing", - params: { shareIntent: intentJson }, - }); - resetShareIntent(); - } - }, [hasShareIntent]); - - return ( - - - - - - - - - - ); -} diff --git a/packages/mobile/app/dashboard/(tabs)/_layout.tsx b/packages/mobile/app/dashboard/(tabs)/_layout.tsx deleted file mode 100644 index 5b2d810a..00000000 --- a/packages/mobile/app/dashboard/(tabs)/_layout.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Tabs } from "expo-router"; -import { ClipboardList, Home, Search, Settings } from "lucide-react-native"; -import React from "react"; - -export default function TabLayout() { - return ( - - , - }} - /> - , - }} - /> - , - }} - /> - , - }} - /> - - ); -} diff --git a/packages/mobile/app/dashboard/(tabs)/index.tsx b/packages/mobile/app/dashboard/(tabs)/index.tsx deleted file mode 100644 index b2349525..00000000 --- a/packages/mobile/app/dashboard/(tabs)/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Link, Stack } from "expo-router"; -import { SquarePen, Link as LinkIcon } from "lucide-react-native"; -import { View } from "react-native"; - -import BookmarkList from "@/components/bookmarks/BookmarkList"; - -function HeaderRight() { - return ( - - - - - - - - - ); -} - -export default function Home() { - return ( - <> - , - }} - /> - - - ); -} diff --git a/packages/mobile/app/dashboard/(tabs)/lists.tsx b/packages/mobile/app/dashboard/(tabs)/lists.tsx deleted file mode 100644 index b534ddda..00000000 --- a/packages/mobile/app/dashboard/(tabs)/lists.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Link } from "expo-router"; -import { useEffect, useState } from "react"; -import { FlatList, View } from "react-native"; - -import { api } from "@/lib/trpc"; - -export default function Lists() { - const [refreshing, setRefreshing] = useState(false); - const { data: lists, isPending } = api.lists.list.useQuery(); - const apiUtils = api.useUtils(); - - useEffect(() => { - setRefreshing(isPending); - }, [isPending]); - - if (!lists) { - // Add spinner - return ; - } - - const onRefresh = () => { - apiUtils.lists.list.invalidate(); - }; - - const links = [ - { - id: "fav", - logo: "⭐️", - name: "Favourites", - href: "/dashboard/favourites", - }, - { - id: "arch", - logo: "🗄️", - name: "Archive", - href: "/dashboard/archive", - }, - ]; - - links.push( - ...lists.lists.map((l) => ({ - id: l.id, - logo: l.icon, - name: l.name, - href: `/dashboard/lists/${l.id}`, - })), - ); - - return ( - ( - - - {l.item.logo} {l.item.name} - - - )} - data={links} - refreshing={refreshing} - onRefresh={onRefresh} - /> - ); -} diff --git a/packages/mobile/app/dashboard/(tabs)/search.tsx b/packages/mobile/app/dashboard/(tabs)/search.tsx deleted file mode 100644 index 980cab36..00000000 --- a/packages/mobile/app/dashboard/(tabs)/search.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { keepPreviousData } from "@tanstack/react-query"; -import { useState } from "react"; -import { View } from "react-native"; -import { useDebounce } from "use-debounce"; - -import BookmarkList from "@/components/bookmarks/BookmarkList"; -import { Divider } from "@/components/ui/Divider"; -import { Input } from "@/components/ui/Input"; -import { api } from "@/lib/trpc"; - -export default function Search() { - const [search, setSearch] = useState(""); - - const [query] = useDebounce(search, 200); - - const { data } = api.bookmarks.searchBookmarks.useQuery( - { text: query }, - { placeholderData: keepPreviousData }, - ); - - return ( - - - - {data && b.id)} />} - - ); -} diff --git a/packages/mobile/app/dashboard/(tabs)/settings.tsx b/packages/mobile/app/dashboard/(tabs)/settings.tsx deleted file mode 100644 index 9f86d5ec..00000000 --- a/packages/mobile/app/dashboard/(tabs)/settings.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useRouter } from "expo-router"; -import { useEffect } from "react"; -import { Text, View } from "react-native"; - -import Logo from "@/components/Logo"; -import { Button } from "@/components/ui/Button"; -import { useSession } from "@/lib/session"; -import { api } from "@/lib/trpc"; - -export default function Dashboard() { - const router = useRouter(); - - const { isLoggedIn, logout } = useSession(); - - useEffect(() => { - if (isLoggedIn !== undefined && !isLoggedIn) { - router.replace("signin"); - } - }, [isLoggedIn]); - - const { data, error, isLoading } = api.users.whoami.useQuery(); - - useEffect(() => { - if (error?.data?.code === "UNAUTHORIZED") { - logout(); - } - }, [error]); - - return ( - - - - - {isLoading ? "Loading ..." : data?.email} - - - - - - - Add - - - - - - - ); -} diff --git a/packages/web/components/dashboard/bookmarks/AddToListModal.tsx b/packages/web/components/dashboard/bookmarks/AddToListModal.tsx deleted file mode 100644 index c9fd5da0..00000000 --- a/packages/web/components/dashboard/bookmarks/AddToListModal.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { ActionButton } from "@/components/ui/action-button"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { - Form, - FormControl, - FormField, - FormItem, - FormMessage, -} from "@/components/ui/form"; - -import { toast } from "@/components/ui/use-toast"; -import { api } from "@/lib/trpc"; -import { useState } from "react"; - -import { - Select, - SelectContent, - SelectGroup, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import LoadingSpinner from "@/components/ui/spinner"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; - -export default function AddToListModal({ - bookmarkId, - open, - setOpen, -}: { - bookmarkId: string; - open: boolean; - setOpen: (open: boolean) => void; -}) { - const formSchema = z.object({ - listId: z.string({ - required_error: "Please select a list", - }), - }); - const form = useForm>({ - resolver: zodResolver(formSchema), - }); - - const { data: lists, isPending: isFetchingListsPending } = - api.lists.list.useQuery(); - - const listInvalidationFunction = api.useUtils().lists.get.invalidate; - const bookmarksInvalidationFunction = - api.useUtils().bookmarks.getBookmarks.invalidate; - - const { mutate: addToList, isPending: isAddingToListPending } = - api.lists.addToList.useMutation({ - onSuccess: (_resp, req) => { - toast({ - description: "List has been updated!", - }); - listInvalidationFunction({ listId: req.listId }); - bookmarksInvalidationFunction(); - }, - onError: (e) => { - if (e.data?.code == "BAD_REQUEST") { - toast({ - variant: "destructive", - description: e.message, - }); - } else { - toast({ - variant: "destructive", - title: "Something went wrong", - }); - } - }, - }); - - const isPending = isFetchingListsPending || isAddingToListPending; - - return ( - - -
- { - addToList({ - bookmarkId: bookmarkId, - listId: value.listId, - }); - })} - > - - Add to List - - -
- {lists ? ( - { - return ( - - - - - - - ); - }} - /> - ) : ( - - )} -
- - - - - - Add - - -
- -
-
- ); -} - -export function useAddToListModal(bookmarkId: string) { - const [open, setOpen] = useState(false); - - return { - open, - setOpen, - content: ( - - ), - }; -} diff --git a/packages/web/components/dashboard/bookmarks/BookmarkCardSkeleton.tsx b/packages/web/components/dashboard/bookmarks/BookmarkCardSkeleton.tsx deleted file mode 100644 index 1f5fa433..00000000 --- a/packages/web/components/dashboard/bookmarks/BookmarkCardSkeleton.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { - ImageCard, - ImageCardBody, - ImageCardContent, - ImageCardFooter, - ImageCardTitle, - ImageCardBanner, -} from "@/components/ui/imageCard"; -import { Skeleton } from "@/components/ui/skeleton"; - -export default function BookmarkCardSkeleton() { - return ( - - - - - - - - - - - - - ); -} diff --git a/packages/web/components/dashboard/bookmarks/BookmarkOptions.tsx b/packages/web/components/dashboard/bookmarks/BookmarkOptions.tsx deleted file mode 100644 index 4f08ebee..00000000 --- a/packages/web/components/dashboard/bookmarks/BookmarkOptions.tsx +++ /dev/null @@ -1,185 +0,0 @@ -"use client"; - -import { useToast } from "@/components/ui/use-toast"; -import { api } from "@/lib/trpc"; -import { ZBookmark, ZBookmarkedLink } from "@hoarder/trpc/types/bookmarks"; -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { - Archive, - Link, - List, - MoreHorizontal, - Pencil, - RotateCw, - Star, - Tags, - Trash2, -} from "lucide-react"; -import { useTagModel } from "./TagModal"; -import { useState } from "react"; -import { BookmarkedTextEditor } from "./BookmarkedTextEditor"; -import { useAddToListModal } from "./AddToListModal"; - -export default function BookmarkOptions({ bookmark }: { bookmark: ZBookmark }) { - const { toast } = useToast(); - const linkId = bookmark.id; - - const { setOpen: setTagModalIsOpen, content: tagModal } = - useTagModel(bookmark); - const { setOpen: setAddToListModalOpen, content: addToListModal } = - useAddToListModal(bookmark.id); - - const [isTextEditorOpen, setTextEditorOpen] = useState(false); - - const invalidateAllBookmarksCache = - api.useUtils().bookmarks.getBookmarks.invalidate; - - const invalidateBookmarkCache = - api.useUtils().bookmarks.getBookmark.invalidate; - - const onError = () => { - toast({ - variant: "destructive", - title: "Something went wrong", - description: "There was a problem with your request.", - }); - }; - const deleteBookmarkMutator = api.bookmarks.deleteBookmark.useMutation({ - onSuccess: () => { - toast({ - description: "The bookmark has been deleted!", - }); - }, - onError, - onSettled: () => { - invalidateAllBookmarksCache(); - }, - }); - - const updateBookmarkMutator = api.bookmarks.updateBookmark.useMutation({ - onSuccess: () => { - toast({ - description: "The bookmark has been updated!", - }); - }, - onError, - onSettled: () => { - invalidateBookmarkCache({ bookmarkId: bookmark.id }); - invalidateAllBookmarksCache(); - }, - }); - - const crawlBookmarkMutator = api.bookmarks.recrawlBookmark.useMutation({ - onSuccess: () => { - toast({ - description: "Re-fetch has been enqueued!", - }); - }, - onError, - onSettled: () => { - invalidateBookmarkCache({ bookmarkId: bookmark.id }); - }, - }); - - return ( - <> - {tagModal} - {addToListModal} - - - - - - - {bookmark.content.type === "text" && ( - setTextEditorOpen(true)}> - - Edit - - )} - - updateBookmarkMutator.mutate({ - bookmarkId: linkId, - favourited: !bookmark.favourited, - }) - } - > - - {bookmark.favourited ? "Un-favourite" : "Favourite"} - - - updateBookmarkMutator.mutate({ - bookmarkId: linkId, - archived: !bookmark.archived, - }) - } - > - - {bookmark.archived ? "Un-archive" : "Archive"} - - {bookmark.content.type === "link" && ( - { - navigator.clipboard.writeText( - (bookmark.content as ZBookmarkedLink).url, - ); - toast({ - description: "Link was added to your clipboard!", - }); - }} - > - - Copy Link - - )} - setTagModalIsOpen(true)}> - - Edit Tags - - - setAddToListModalOpen(true)}> - - Add to List - - - {bookmark.content.type === "link" && ( - - crawlBookmarkMutator.mutate({ bookmarkId: bookmark.id }) - } - > - - Refresh - - )} - - deleteBookmarkMutator.mutate({ bookmarkId: bookmark.id }) - } - > - - Delete - - - - - ); -} diff --git a/packages/web/components/dashboard/bookmarks/BookmarkPreview.tsx b/packages/web/components/dashboard/bookmarks/BookmarkPreview.tsx deleted file mode 100644 index 2a8ae1b1..00000000 --- a/packages/web/components/dashboard/bookmarks/BookmarkPreview.tsx +++ /dev/null @@ -1,101 +0,0 @@ -"use client"; - -import { BackButton } from "@/components/ui/back-button"; -import { Skeleton } from "@/components/ui/skeleton"; -import { isBookmarkStillCrawling } from "@/lib/bookmarkUtils"; -import { api } from "@/lib/trpc"; -import { ZBookmark } from "@hoarder/trpc/types/bookmarks"; -import { ArrowLeftCircle, CalendarDays, ExternalLink } from "lucide-react"; -import Link from "next/link"; -import Markdown from "react-markdown"; - -export default function BookmarkPreview({ - initialData, -}: { - initialData: ZBookmark; -}) { - const { data: bookmark } = api.bookmarks.getBookmark.useQuery( - { - bookmarkId: initialData.id, - }, - { - initialData, - refetchInterval: (query) => { - const data = query.state.data; - if (!data) { - return false; - } - // If the link is not crawled or not tagged - if (isBookmarkStillCrawling(data)) { - return 1000; - } - return false; - }, - }, - ); - - const linkHeader = bookmark.content.type == "link" && ( -
-

- {bookmark.content.title || bookmark.content.url} -

- - View Original - - -
- ); - - let content; - switch (bookmark.content.type) { - case "link": { - if (!bookmark.content.htmlContent) { - content = ( -
Failed to fetch link content ...
- ); - } else { - content = ( -
- ); - } - break; - } - case "text": { - content = {bookmark.content.text}; - break; - } - } - - return ( -
-
- - - -
- - {bookmark.createdAt.toLocaleString()} - -
-
-
- {linkHeader} -
- {isBookmarkStillCrawling(bookmark) ? ( -
- - - -
- ) : ( - content - )} -
-
- ); -} diff --git a/packages/web/components/dashboard/bookmarks/BookmarkedTextEditor.tsx b/packages/web/components/dashboard/bookmarks/BookmarkedTextEditor.tsx deleted file mode 100644 index a5b58f1a..00000000 --- a/packages/web/components/dashboard/bookmarks/BookmarkedTextEditor.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { ZBookmark } from "@hoarder/trpc/types/bookmarks"; -import { - Dialog, - DialogClose, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { ActionButton } from "@/components/ui/action-button"; -import { Button } from "@/components/ui/button"; -import { Textarea } from "@/components/ui/textarea"; -import { api } from "@/lib/trpc"; -import { useState } from "react"; -import { toast } from "@/components/ui/use-toast"; - -export function BookmarkedTextEditor({ - bookmark, - open, - setOpen, -}: { - bookmark?: ZBookmark; - open: boolean; - setOpen: (open: boolean) => void; -}) { - const isNewBookmark = bookmark === undefined; - const [noteText, setNoteText] = useState( - bookmark && bookmark.content.type == "text" ? bookmark.content.text : "", - ); - - const invalidateAllBookmarksCache = - api.useUtils().bookmarks.getBookmarks.invalidate; - const invalidateOneBookmarksCache = - api.useUtils().bookmarks.getBookmark.invalidate; - - const { mutate: createBookmarkMutator, isPending: isCreationPending } = - api.bookmarks.createBookmark.useMutation({ - onSuccess: () => { - invalidateAllBookmarksCache(); - toast({ - description: "Note created!", - }); - setOpen(false); - setNoteText(""); - }, - onError: () => { - toast({ description: "Something went wrong", variant: "destructive" }); - }, - }); - const { mutate: updateBookmarkMutator, isPending: isUpdatePending } = - api.bookmarks.updateBookmarkText.useMutation({ - onSuccess: () => { - invalidateOneBookmarksCache({ - bookmarkId: bookmark!.id, - }); - toast({ - description: "Note updated!", - }); - setOpen(false); - }, - onError: () => { - toast({ description: "Something went wrong", variant: "destructive" }); - }, - }); - const isPending = isCreationPending || isUpdatePending; - - const onSave = () => { - if (isNewBookmark) { - createBookmarkMutator({ - type: "text", - text: noteText, - }); - } else { - updateBookmarkMutator({ - bookmarkId: bookmark.id, - text: noteText, - }); - } - }; - - return ( - - - - {isNewBookmark ? "New Note" : "Edit Note"} - - Write your note with markdown support - - -