From 2b37b5f5686b96c8438d41c420be2da292b88247 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 30 Apr 2024 16:35:25 +0800 Subject: [PATCH] feat: subscribe page --- package.json | 10 +- pnpm-lock.yaml | 220 ++++++++++++++++++ .../src/components/feed-column/index.tsx | 13 +- .../feed-column/subscribe-dialog.tsx | 17 -- src/renderer/src/components/ui/checkbox.tsx | 28 +++ src/renderer/src/components/ui/command.tsx | 153 ++++++++++++ src/renderer/src/components/ui/form.tsx | 176 ++++++++++++++ src/renderer/src/components/ui/input.tsx | 25 ++ src/renderer/src/components/ui/label.tsx | 24 ++ src/renderer/src/components/ui/popover.tsx | 29 +++ src/renderer/src/components/ui/select.tsx | 158 +++++++++++++ src/renderer/src/lib/types.ts | 1 + src/renderer/src/main.tsx | 4 + src/renderer/src/pages/(main)/layout.tsx | 5 + src/renderer/src/pages/(main)/subscribe.tsx | 59 +++++ 15 files changed, 896 insertions(+), 26 deletions(-) delete mode 100644 src/renderer/src/components/feed-column/subscribe-dialog.tsx create mode 100644 src/renderer/src/components/ui/checkbox.tsx create mode 100644 src/renderer/src/components/ui/command.tsx create mode 100644 src/renderer/src/components/ui/form.tsx create mode 100644 src/renderer/src/components/ui/input.tsx create mode 100644 src/renderer/src/components/ui/label.tsx create mode 100644 src/renderer/src/components/ui/popover.tsx create mode 100644 src/renderer/src/components/ui/select.tsx create mode 100644 src/renderer/src/pages/(main)/subscribe.tsx diff --git a/package.json b/package.json index 5d7304fbd..9fcac5d48 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,14 @@ "@electron-toolkit/utils": "^3.0.0", "@fontsource/sn-pro": "5.0.1", "@hono/auth-js": "1.0.4", + "@hookform/resolvers": "3.3.4", "@radix-ui/react-avatar": "1.0.4", + "@radix-ui/react-checkbox": "1.0.4", "@radix-ui/react-collapsible": "1.0.3", "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-label": "2.0.2", + "@radix-ui/react-popover": "1.0.7", + "@radix-ui/react-select": "2.0.0", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-tabs": "1.0.4", "@radix-ui/react-tooltip": "1.0.7", @@ -41,6 +46,7 @@ "@use-gesture/react": "10.3.1", "class-variance-authority": "0.7.0", "clsx": "2.1.1", + "cmdk": "1.0.0", "dayjs": "1.11.10", "dotenv": "16.4.5", "electron-updater": "^6.1.7", @@ -48,6 +54,7 @@ "hast-util-to-jsx-runtime": "2.3.0", "lethargy": "1.0.9", "lucide-react": "0.376.0", + "react-hook-form": "7.51.3", "react-router-dom": "6.23.0", "rehype-infer-description-meta": "2.0.0", "rehype-parse": "9.0.0", @@ -57,7 +64,8 @@ "tailwindcss-animate": "1.0.7", "unified": "11.0.4", "unist-util-visit": "5.0.0", - "vfile": "6.0.1" + "vfile": "6.0.1", + "zod": "3.23.5" }, "devDependencies": { "@egoist/tailwindcss-icons": "1.7.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd9b30b86..ff9c41b62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,15 +20,30 @@ importers: '@hono/auth-js': specifier: 1.0.4 version: 1.0.4(@auth/core@0.30.0)(hono@4.2.7)(react@18.3.0) + '@hookform/resolvers': + specifier: 3.3.4 + version: 3.3.4(react-hook-form@7.51.3(react@18.3.0)) '@radix-ui/react-avatar': specifier: 1.0.4 version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-checkbox': + specifier: 1.0.4 + version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) '@radix-ui/react-collapsible': specifier: 1.0.3 version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) '@radix-ui/react-dialog': specifier: 1.0.5 version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-label': + specifier: 2.0.2 + version: 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-popover': + specifier: 1.0.7 + version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-select': + specifier: 2.0.0 + version: 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) '@radix-ui/react-slot': specifier: 1.0.2 version: 1.0.2(@types/react@18.3.0)(react@18.3.0) @@ -56,6 +71,9 @@ importers: clsx: specifier: 2.1.1 version: 2.1.1 + cmdk: + specifier: 1.0.0 + version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) dayjs: specifier: 1.11.10 version: 1.11.10 @@ -77,6 +95,9 @@ importers: lucide-react: specifier: 0.376.0 version: 0.376.0(react@18.3.0) + react-hook-form: + specifier: 7.51.3 + version: 7.51.3(react@18.3.0) react-router-dom: specifier: 6.23.0 version: 6.23.0(react-dom@18.3.0(react@18.3.0))(react@18.3.0) @@ -107,6 +128,9 @@ importers: vfile: specifier: 6.0.1 version: 6.0.1 + zod: + specifier: 3.23.5 + version: 3.23.5 devDependencies: '@egoist/tailwindcss-icons': specifier: 1.7.4 @@ -725,6 +749,11 @@ packages: hono: '>=3.*' react: '>=18' + '@hookform/resolvers@3.3.4': + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + peerDependencies: + react-hook-form: ^7.0.0 + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -815,6 +844,9 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@radix-ui/number@1.0.1': + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} @@ -844,6 +876,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-checkbox@1.0.4': + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collapsible@1.0.3': resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: @@ -954,6 +999,32 @@ packages: '@types/react': optional: true + '@radix-ui/react-label@2.0.2': + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.0.7': + resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-popper@1.1.3': resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: @@ -1019,6 +1090,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-select@2.0.0': + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.0.2': resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: @@ -1090,6 +1174,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-previous@1.0.1': + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-rect@1.0.1': resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: @@ -1771,6 +1864,12 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmdk@1.0.0: + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -3470,6 +3569,12 @@ packages: peerDependencies: react: ^18.3.0 + react-hook-form@7.51.3: + resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4159,6 +4264,9 @@ packages: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} + zod@3.23.5: + resolution: {integrity: sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4661,6 +4769,10 @@ snapshots: hono: 4.2.7 react: 18.3.0 + '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.3.0))': + dependencies: + react-hook-form: 7.51.3(react@18.3.0) + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4765,6 +4877,10 @@ snapshots: '@pkgr/core@0.1.1': {} + '@radix-ui/number@1.0.1': + dependencies: + '@babel/runtime': 7.24.4 + '@radix-ui/primitive@1.0.1': dependencies: '@babel/runtime': 7.24.4 @@ -4792,6 +4908,23 @@ snapshots: '@types/react': 18.3.0 '@types/react-dom': 18.3.0 + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.0)(react@18.3.0) + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + optionalDependencies: + '@types/react': 18.3.0 + '@types/react-dom': 18.3.0 + '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': dependencies: '@babel/runtime': 7.24.4 @@ -4907,6 +5040,40 @@ snapshots: optionalDependencies: '@types/react': 18.3.0 + '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + optionalDependencies: + '@types/react': 18.3.0 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.0)(react@18.3.0) + aria-hidden: 1.2.4 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + react-remove-scroll: 2.5.5(@types/react@18.3.0)(react@18.3.0) + optionalDependencies: + '@types/react': 18.3.0 + '@types/react-dom': 18.3.0 + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': dependencies: '@babel/runtime': 7.24.4 @@ -4975,6 +5142,36 @@ snapshots: '@types/react': 18.3.0 '@types/react-dom': 18.3.0 + '@radix-ui/react-select@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.0)(react@18.3.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + aria-hidden: 1.2.4 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + react-remove-scroll: 2.5.5(@types/react@18.3.0)(react@18.3.0) + optionalDependencies: + '@types/react': 18.3.0 + '@types/react-dom': 18.3.0 + '@radix-ui/react-slot@1.0.2(@types/react@18.3.0)(react@18.3.0)': dependencies: '@babel/runtime': 7.24.4 @@ -5051,6 +5248,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.0 + '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.0)(react@18.3.0)': + dependencies: + '@babel/runtime': 7.24.4 + react: 18.3.0 + optionalDependencies: + '@types/react': 18.3.0 + '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.0)(react@18.3.0)': dependencies: '@babel/runtime': 7.24.4 @@ -5897,6 +6101,16 @@ snapshots: clsx@2.1.1: {} + cmdk@1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0): + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -8007,6 +8221,10 @@ snapshots: react: 18.3.0 scheduler: 0.23.1 + react-hook-form@7.51.3(react@18.3.0): + dependencies: + react: 18.3.0 + react-is@16.13.1: {} react-refresh@0.14.0: {} @@ -8848,4 +9066,6 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 + zod@3.23.5: {} + zwitch@2.0.4: {} diff --git a/src/renderer/src/components/feed-column/index.tsx b/src/renderer/src/components/feed-column/index.tsx index a2d8c35ad..84ebb5682 100644 --- a/src/renderer/src/components/feed-column/index.tsx +++ b/src/renderer/src/components/feed-column/index.tsx @@ -13,8 +13,7 @@ import { FeedList } from "./list" import { ActivedList } from "@renderer/lib/types" import { UserButton } from "@renderer/components/user-button" import { views } from "@renderer/lib/constants" -import { Dialog, DialogTrigger } from "@renderer/components/ui/dialog" -import { SubscribeDialog } from "./subscribe-dialog" +import { Link } from "react-router-dom" const lethargy = new Lethargy() @@ -69,6 +68,7 @@ export function FeedColumn({ id: active, name: views[active].name, view: active, + preventNavigate: true, }) } > @@ -76,12 +76,9 @@ export function FeedColumn({
ReadOK
- - - - - - + + +
diff --git a/src/renderer/src/components/feed-column/subscribe-dialog.tsx b/src/renderer/src/components/feed-column/subscribe-dialog.tsx deleted file mode 100644 index bd7301ec0..000000000 --- a/src/renderer/src/components/feed-column/subscribe-dialog.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@renderer/components/ui/dialog" - -export function SubscribeDialog() { - return ( - - - Subscribe - description - - - ) -} diff --git a/src/renderer/src/components/ui/checkbox.tsx b/src/renderer/src/components/ui/checkbox.tsx new file mode 100644 index 000000000..8ae0080a2 --- /dev/null +++ b/src/renderer/src/components/ui/checkbox.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@renderer/lib/utils" + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/src/renderer/src/components/ui/command.tsx b/src/renderer/src/components/ui/command.tsx new file mode 100644 index 000000000..bcbef8f72 --- /dev/null +++ b/src/renderer/src/components/ui/command.tsx @@ -0,0 +1,153 @@ +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@renderer/lib/utils" +import { Dialog, DialogContent } from "@renderer/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/src/renderer/src/components/ui/form.tsx b/src/renderer/src/components/ui/form.tsx new file mode 100644 index 000000000..d85a90788 --- /dev/null +++ b/src/renderer/src/components/ui/form.tsx @@ -0,0 +1,176 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form" + +import { cn } from "@renderer/lib/utils" +import { Label } from "@renderer/components/ui/label" + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName +} + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState, formState } = useFormContext() + + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error("useFormField should be used within ") + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext( + {} as FormItemContextValue, +) + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId() + + return ( + +
+ + ) +}) +FormItem.displayName = "FormItem" + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField() + + return ( +