diff --git a/moon/apps/web/components/Issues/IssueDetailPage.tsx b/moon/apps/web/components/Issues/IssueDetailPage.tsx index 766c9f06a..e2d236b8f 100644 --- a/moon/apps/web/components/Issues/IssueDetailPage.tsx +++ b/moon/apps/web/components/Issues/IssueDetailPage.tsx @@ -2,13 +2,13 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { IssueClosedIcon, IssueOpenedIcon, IssueReopenedIcon } from '@primer/octicons-react' -import { Stack } from '@primer/react' +import { Stack, TextInput } from '@primer/react' import { useAtom } from 'jotai' import { useRouter } from 'next/router' import toast from 'react-hot-toast' import { CommonResultIssueDetailRes } from '@gitmono/types' -import { Button, LoadingSpinner, PicturePlusIcon } from '@gitmono/ui' +import { Button, LoadingSpinner, PicturePlusIcon, UIText } from '@gitmono/ui' import { EMPTY_HTML } from '@/atoms/markdown' import { useHandleBottomScrollOffset } from '@/components/NoteEditor/useHandleBottomScrollOffset' @@ -19,6 +19,7 @@ import { usePostIssueAssignees } from '@/hooks/issues/usePostIssueAssignees' import { usePostIssueClose } from '@/hooks/issues/usePostIssueClose' import { usePostIssueComment } from '@/hooks/issues/usePostIssueComment' import { usePostIssueReopen } from '@/hooks/issues/usePostIssueReopen' +import { usePostIssueTitle } from '@/hooks/issues/usePostIssueTitle' import { useGetCurrentUser } from '@/hooks/useGetCurrentUser' import { useGetOrganizationMember } from '@/hooks/useGetOrganizationMember' import { usePostIssueLabels } from '@/hooks/usePostIssueLabels' @@ -42,15 +43,6 @@ import { } from './utils/sideEffect' import { idAtom } from './utils/store' -// interface IssueDetail { -// status: string -// conversations: Conversation[] -// title: string -// assignees?: string[] -// } - -// let needComment = false - export default function IssueDetailPage({ link }: { link: string }) { const [id] = useAtom(idAtom) const [login, setLogin] = useState(false) @@ -88,6 +80,10 @@ export default function IssueDetailPage({ link }: { link: string }) { const issueDetail = issueDetailObj?.data as CommonResultIssueDetailRes['data'] | undefined + const [isEdit, setIsEdit] = useState(false) + const [editTitle, setEditTitle] = useState(issueDetail?.title) + const [titleloading, setTitleLoading] = useState(false) + const applyDetailData = (detail: CommonResultIssueDetailRes | undefined) => { if (!detail || !detail.req_result || !detail.data) return setInfo({ @@ -285,12 +281,66 @@ export default function IssueDetailPage({ link }: { link: string }) { } }) + const { mutate: modifyTitle } = usePostIssueTitle() + const handleSave = () => { + if (editTitle === issueDetail?.title || editTitle === '') { + apiErrorToast(new Error('Nothing Changed or is Empty')) + return + } + setTitleLoading(true) + modifyTitle( + { link, data: { content: editTitle as string } }, + { + onError: (err) => apiErrorToast(err), + onSuccess: async () => await refetch({ throwOnError: true }), + onSettled: () => { + setIsEdit(false) + setTitleLoading(false) + } + } + ) + } + return ( <>
{info?.title && (
-
{info.title}
+
+ {!isEdit && ( + <> +
+ + {`${issueDetail?.title || ''}`} + + +
+ + )} + {isEdit && ( + <> +
+ setEditTitle(e.target.value)} + className='new-issue-input no-border-input w-[80%]' + trailingVisual={() => (titleloading ? : '')} + /> +
+ + +
+
+ + )} +
{info.status === 'open' ? ( <> diff --git a/moon/apps/web/components/MrView/components/Checks/index.tsx b/moon/apps/web/components/MrView/components/Checks/index.tsx new file mode 100644 index 000000000..65fa8b017 --- /dev/null +++ b/moon/apps/web/components/MrView/components/Checks/index.tsx @@ -0,0 +1,55 @@ +import { memo, useEffect, useRef, useState } from 'react' +import { LazyLog } from '@melloware/react-logviewer' + +import { useSSM } from '../../hook/useSSM' + +enum Status { + Pending = 'pending', + Fullfilled = 'fullfilled', + Rejected = 'rejected' +} + +const Checks = () => { + const serverStream = useRef('') + const es = useRef() + const baseUrl = useRef('http://47.79.95.33:3000/logs?follow=true') + const status = useRef(Status.Pending) + const [displayTest, setDisplayText] = useState('') + const { createEventSource } = useSSM() + + // 页面初始化时建立连接 + useEffect(() => { + if (status.current !== Status.Fullfilled) { + createEventSource(baseUrl.current) + .then((res) => { + es.current = res + status.current = Status.Fullfilled + es.current.onmessage = (event) => { + serverStream.current += event.data + '\n' + setDisplayText(serverStream.current) + } + }) + .catch(() => (status.current = Status.Rejected)) + } + + return () => { + // 关闭连接 + status.current = Status.Pending + es.current?.close() + es.current = null + serverStream.current = '' + setDisplayText('') + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return ( + <> +
+ {displayTest && } +
+ + ) +} + +export default memo(Checks) diff --git a/moon/apps/web/components/MrView/hook/useSSM.ts b/moon/apps/web/components/MrView/hook/useSSM.ts new file mode 100644 index 000000000..64d5887a5 --- /dev/null +++ b/moon/apps/web/components/MrView/hook/useSSM.ts @@ -0,0 +1,18 @@ +export const useSSM = () => { + const createEventSource = (baseUrl: string): Promise => { + return new Promise((res, rej) => { + const es = new EventSource(baseUrl) + + es.onopen = () => { + res(es) + } + es.onerror = () => { + rej('eventsource建立失败') + } + }) + } + + return { + createEventSource + } +} diff --git a/moon/apps/web/hooks/MR/usePostMrTitle.ts b/moon/apps/web/hooks/MR/usePostMrTitle.ts new file mode 100644 index 000000000..f3ed9c0b9 --- /dev/null +++ b/moon/apps/web/hooks/MR/usePostMrTitle.ts @@ -0,0 +1,11 @@ +import { useMutation } from '@tanstack/react-query' + +import { ContentPayload, PostApiMrTitleData, RequestParams } from '@gitmono/types/generated' + +import { legacyApiClient } from '@/utils/queryClient' + +export function usePostMrTitle() { + return useMutation({ + mutationFn: ({ link, data, params }) => legacyApiClient.v1.postApiMrTitle().request(link, data, params) + }) +} diff --git a/moon/apps/web/hooks/issues/usePostIssueTitle.ts b/moon/apps/web/hooks/issues/usePostIssueTitle.ts new file mode 100644 index 000000000..e68215e84 --- /dev/null +++ b/moon/apps/web/hooks/issues/usePostIssueTitle.ts @@ -0,0 +1,11 @@ +import { useMutation } from '@tanstack/react-query' + +import { ContentPayload, PostApiIssueTitleData, RequestParams } from '@gitmono/types/generated' + +import { legacyApiClient } from '@/utils/queryClient' + +export function usePostIssueTitle() { + return useMutation({ + mutationFn: ({ link, data, params }) => legacyApiClient.v1.postApiIssueTitle().request(link, data, params) + }) +} diff --git a/moon/apps/web/next.config.js b/moon/apps/web/next.config.js index bbc02e793..ce2ba1ee1 100644 --- a/moon/apps/web/next.config.js +++ b/moon/apps/web/next.config.js @@ -61,7 +61,8 @@ const cspResourcesByDirective = { 'https://gitmono.imgix.net', process.env.NODE_ENV !== 'production' && 'https://campsite-dev.imgix.net', 'https://react-tweet.vercel.app', // for react-tweet embeds - 'https://media.tenor.com' // used for Tenor gifs + 'https://media.tenor.com', // used for Tenor gifs + 'http://47.79.95.33:3000' ], 'font-src': ["'self'"], 'img-src': [ diff --git a/moon/apps/web/package.json b/moon/apps/web/package.json index 70928a651..59659acbe 100644 --- a/moon/apps/web/package.json +++ b/moon/apps/web/package.json @@ -28,6 +28,7 @@ "@heroicons/react": "catalog:", "@hocuspocus/provider": "catalog:", "@hookform/resolvers": "catalog:", + "@melloware/react-logviewer": "^6.3.2", "@mui/icons-material": "catalog:", "@mui/material": "catalog:", "@mui/x-tree-view": "catalog:", diff --git a/moon/apps/web/pages/[org]/mr/[link]/index.tsx b/moon/apps/web/pages/[org]/mr/[link]/index.tsx index 9eef2d614..b996aab14 100644 --- a/moon/apps/web/pages/[org]/mr/[link]/index.tsx +++ b/moon/apps/web/pages/[org]/mr/[link]/index.tsx @@ -2,7 +2,7 @@ import React, { useRef, useState } from 'react' import { ChecklistIcon, CommentDiscussionIcon, FileDiffIcon } from '@primer/octicons-react' -import { BaseStyles, ThemeProvider } from '@primer/react' +import { BaseStyles, TextInput, ThemeProvider } from '@primer/react' import { useAtom } from 'jotai' import { useRouter } from 'next/router' import { toast } from 'react-hot-toast' @@ -28,6 +28,7 @@ import { import { mridAtom } from '@/components/Issues/utils/store' import { AppLayout } from '@/components/Layout/AppLayout' import { MemberAvatar } from '@/components/MemberAvatar' +import Checks from '@/components/MrView/components/Checks' import TimelineItems from '@/components/MrView/TimelineItems' import { useHandleBottomScrollOffset } from '@/components/NoteEditor/useHandleBottomScrollOffset' import AuthAppProviders from '@/components/Providers/AuthAppProviders' @@ -35,6 +36,7 @@ import { ComposerReactionPicker } from '@/components/Reactions/ComposerReactionP import { SimpleNoteContent, SimpleNoteContentRef } from '@/components/SimpleNoteEditor/SimpleNoteContent' import { useScope } from '@/contexts/scope' import { usePostMRAssignees } from '@/hooks/issues/usePostMRAssignees' +import { usePostMrTitle } from '@/hooks/MR/usePostMrTitle' import { useGetMrDetail } from '@/hooks/useGetMrDetail' import { useGetMrFilesChanged } from '@/hooks/useGetMrFilesChanged' import { usePostMrClose } from '@/hooks/usePostMrClose' @@ -68,12 +70,16 @@ const MRDetailPage: PageWithLayout = () => { const { closeHint, needComment, handleChange } = useChange({ title: 'Close Merge Request' }) const { mutate: mrAssignees } = usePostMRAssignees() const { mutate: mrLabels } = usePostMRLabels() + const [isEdit, setIsEdit] = useState(false) + const [editTitle, setEditTitle] = useState(mrDetail?.title) + const [loading, setLoading] = useState(false) if (mrDetail && typeof mrDetail.status === 'string') { mrDetail.status = mrDetail.status.toLowerCase() } const { data: MrFilesChangedData, isLoading: fileChgIsLoading } = useGetMrFilesChanged(id) + const { mutate: modifyTitle } = usePostMrTitle() const { mutate: approveMr, isPending: mrMergeIsPending } = usePostMrMerge(id) const handleMrApprove = () => { @@ -198,199 +204,250 @@ const MRDetailPage: PageWithLayout = () => { } }) + const handleSave = () => { + if (editTitle === mrDetail?.title || editTitle === '') { + apiErrorToast(new Error('Nothing Changed or is Empty')) + return + } + setLoading(true) + modifyTitle( + { link: id, data: { content: editTitle as string } }, + { + onError: (err) => apiErrorToast(err), + onSuccess: async () => await refetch({ throwOnError: true }), + onSettled: () => { + setIsEdit(false) + setLoading(false) + } + } + ) + } + return ( -
-
- - {`${mrDetail?.title || ''}#${id}`} - -
-
- - Conversation - Checks - Files Changed - -
-
- {detailIsLoading ? ( -
- + + +
+
+ {!isEdit && ( + <> +
+ + {`${mrDetail?.title || ''}`} +   + ${id} + + +
+ + )} + {isEdit && ( + <> +
+ setEditTitle(e.target.value)} + className='new-issue-input no-border-input w-[80%]' + trailingVisual={() => (loading ? : '')} + /> +
+ +
- ) : ( - mrDetail && - )} -
-
- {mrDetail && mrDetail.status === 'open' && ( - +
+ + )} +
+
+ + Conversation + Checks + Files Changed + +
+
+ {detailIsLoading ? ( +
+ +
+ ) : ( + mrDetail && )} +
+
+ {mrDetail && mrDetail.status === 'open' && ( + + )} +
+

Add a comment

+ +
+ handleChange(html)} + /> +
+
+ {mrDetail && mrDetail.status === 'open' && ( + + )} + {mrDetail && mrDetail.status === 'closed' && ( + + )} + +
+
-

Add a comment

- -
- handleChange(html)} - /> -
-
- {mrDetail && mrDetail.status === 'open' && ( - - )} - {mrDetail && mrDetail.status === 'closed' && ( - - )} - -
-
-
- {/* */} -
- handleAssignees(selected)} - open={open} - // eslint-disable-next-line react-hooks/rules-of-hooks - onOpenChange={(open) => handleOpenChange(open)} - selected={fetchSelected} - > - {(el) => { - const names = Array.from(new Set(splitFun(el))) - - return ( - <> - {names.map((i, index) => ( - // eslint-disable-next-line react/no-array-index-key -
- - {i} -
- ))} - - ) - }} -
- handleLabels(selected)} - open={label_open} - onOpenChange={(open) => label_handleOpenChange(open)} - selected={label_fetchSelected} - > - {(el) => { - const names = splitFun(el) - - return ( - <> -
- {names.map((i, index) => { - const label = labelMap.get(i) ?? {} + {(el) => { + const names = Array.from(new Set(splitFun(el))) - return ( + return ( + <> + {names.map((i, index) => ( // eslint-disable-next-line react/no-array-index-key -
-
- {label.name} -
+
+ + {i}
- ) - })} -
- - ) - }} - - - - -
-
- - -
Checks
-
- - {fileChgIsLoading ? ( -
- -
- ) : MrFilesChangedData?.data?.content ? ( - - ) : ( -
No files changed
- )} -
- -
-
+ ))} + + ) + }} + + handleLabels(selected)} + open={label_open} + onOpenChange={(open) => label_handleOpenChange(open)} + selected={label_fetchSelected} + > + {(el) => { + const names = splitFun(el) + + return ( + <> +
+ {names.map((i, index) => { + const label = labelMap.get(i) ?? {} + + return ( + // eslint-disable-next-line react/no-array-index-key +
+
+ {label.name} +
+
+ ) + })} +
+ + ) + }} +
+ + + +
+
+ + + + + + {fileChgIsLoading ? ( +
+ +
+ ) : MrFilesChangedData?.data?.content ? ( + + ) : ( +
No files changed
+ )} +
+ +
+
+ + ) } MRDetailPage.getProviders = (page, pageProps) => { return ( - - - {page} - - + {page} ) } diff --git a/moon/pnpm-lock.yaml b/moon/pnpm-lock.yaml index 8783f2730..069ad57ea 100644 --- a/moon/pnpm-lock.yaml +++ b/moon/pnpm-lock.yaml @@ -21,18 +21,36 @@ catalogs: '@emotion/styled': specifier: ^11.14.0 version: 11.14.0 + '@flydotio/dockerfile': + specifier: ^0.4.11 + version: 0.4.11 '@git-diff-view/react': specifier: 0.0.26 version: 0.0.26 '@heroicons/react': specifier: ^2.2.0 version: 2.2.0 + '@hocuspocus/extension-database': + specifier: ^2.13.5 + version: 2.15.2 + '@hocuspocus/extension-logger': + specifier: ^2.13.5 + version: 2.15.2 '@hocuspocus/provider': specifier: ^2.13.5 version: 2.13.5 + '@hocuspocus/server': + specifier: ^2.13.5 + version: 2.15.2 + '@hocuspocus/transformer': + specifier: ^2.13.5 + version: 2.15.2 '@hookform/resolvers': specifier: ^3.3.1 version: 3.3.1 + '@ianvs/prettier-plugin-sort-imports': + specifier: ^4.2.1 + version: 4.2.1 '@mui/icons-material': specifier: ^7.1.0 version: 7.1.0 @@ -66,15 +84,24 @@ catalogs: '@radix-ui/react-accordion': specifier: ^1.2.0 version: 1.2.11 + '@radix-ui/react-context-menu': + specifier: ^2.2.1 + version: 2.2.15 '@radix-ui/react-dialog': specifier: ^1.1.1 version: 1.1.14 + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.1 + version: 2.1.15 '@radix-ui/react-hover-card': specifier: ^1.1.1 version: 1.1.14 '@radix-ui/react-popover': specifier: ^1.1.1 version: 1.1.14 + '@radix-ui/react-popper': + specifier: ^1.2.0 + version: 1.2.7 '@radix-ui/react-portal': specifier: ^1.1.1 version: 1.1.9 @@ -84,15 +111,36 @@ catalogs: '@radix-ui/react-slider': specifier: ^1.2.0 version: 1.3.5 + '@radix-ui/react-slot': + specifier: ^1.1.0 + version: 1.2.3 + '@radix-ui/react-switch': + specifier: ^1.1.0 + version: 1.2.5 '@radix-ui/react-tabs': specifier: ^1.1.0 version: 1.1.12 + '@radix-ui/react-toggle-group': + specifier: ^1.1.0 + version: 1.1.10 + '@radix-ui/react-tooltip': + specifier: ^1.1.2 + version: 1.2.7 + '@radix-ui/react-visually-hidden': + specifier: ^1.1.0 + version: 1.2.3 '@radix-ui/themes': specifier: ^3.2.1 version: 3.2.1 + '@sentry/cli': + specifier: ^2.30.1 + version: 2.30.1 '@sentry/nextjs': specifier: ^8.17.0 version: 8.17.0 + '@sentry/node': + specifier: ^7.106.1 + version: 7.120.3 '@shopify/react-shortcuts': specifier: ^5.2.0 version: 5.2.0 @@ -126,6 +174,18 @@ catalogs: '@swc-jotai/react-refresh': specifier: ^0.0.7 version: 0.0.7 + '@tailwindcss/container-queries': + specifier: ^0.1.1 + version: 0.1.1 + '@tailwindcss/forms': + specifier: ^0.5.2 + version: 0.5.3 + '@tailwindcss/typography': + specifier: ^0.5.9 + version: 0.5.9 + '@tanstack/eslint-plugin-query': + specifier: ^4.34.1 + version: 4.38.0 '@tanstack/react-query': specifier: ^5.56.2 version: 5.59.0 @@ -138,15 +198,99 @@ catalogs: '@testing-library/react': specifier: ^15.0.7 version: 15.0.7 + '@tiptap-pro/extension-details': + specifier: ^2.10.11 + version: 2.10.11 + '@tiptap-pro/extension-details-content': + specifier: ^2.10.11 + version: 2.10.11 + '@tiptap-pro/extension-details-summary': + specifier: ^2.10.11 + version: 2.10.11 '@tiptap/core': specifier: ^2.6.4 version: 2.13.0 + '@tiptap/extension-blockquote': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-bold': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-bullet-list': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-code': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-code-block': + specifier: ^2.6.4 + version: 2.13.0 '@tiptap/extension-collaboration': specifier: ^2.6.4 version: 2.6.4 '@tiptap/extension-collaboration-cursor': specifier: ^2.6.4 version: 2.6.4 + '@tiptap/extension-document': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-dropcursor': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-hard-break': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-heading': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-history': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-horizontal-rule': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-italic': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-link': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-list-item': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-list-keymap': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-ordered-list': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-paragraph': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-placeholder': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-strike': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-task-item': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-task-list': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-text': + specifier: ^2.6.4 + version: 2.13.0 + '@tiptap/extension-typography': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/extension-underline': + specifier: ^2.6.4 + version: 2.6.4 + '@tiptap/html': + specifier: ^2.6.4 + version: 2.13.0 '@tiptap/pm': specifier: ^2.6.4 version: 2.13.0 @@ -165,6 +309,12 @@ catalogs: '@types/d3-zoom': specifier: ^3.0.3 version: 3.0.3 + '@types/diff': + specifier: ^5.0.5 + version: 5.0.5 + '@types/markdown-it': + specifier: ^13.0.7 + version: 13.0.7 '@types/node': specifier: ^20.12.4 version: 20.12.4 @@ -180,6 +330,12 @@ catalogs: '@types/uuid': specifier: ^9.0.4 version: 9.0.4 + '@typescript-eslint/eslint-plugin': + specifier: ^7.11.0 + version: 7.11.0 + '@typescript-eslint/parser': + specifier: ^7.11.0 + version: 7.11.0 '@vercel/og': specifier: ^0.6.2 version: 0.6.2 @@ -195,6 +351,9 @@ catalogs: autoprefixer: specifier: ^10.4.8 version: 10.4.14 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -219,9 +378,33 @@ catalogs: deepmerge: specifier: ^4.3.1 version: 4.3.1 + diff: + specifier: ^5.1.0 + version: 5.1.0 + dotenv: + specifier: ^16.3.1 + version: 16.4.5 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-next: + specifier: ^14.2.3 + version: 14.2.3 + eslint-config-turbo: + specifier: ^2.0.9 + version: 2.0.9 + eslint-plugin-react: + specifier: ^7.34.1 + version: 7.34.1 + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2 eslint-plugin-storybook: specifier: ^0.8.0 version: 0.8.0 + eslint-plugin-unused-imports: + specifier: ^3.2.0 + version: 3.2.0 fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 @@ -246,6 +429,9 @@ catalogs: js-base64: specifier: ^3.7.5 version: 3.7.5 + jsdom: + specifier: ^24.0.0 + version: 24.0.0 jszip: specifier: ^3.10.1 version: 3.10.1 @@ -258,6 +444,9 @@ catalogs: lottie-web: specifier: ^5.11.0 version: 5.11.0 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 material-file-icons: specifier: ^2.4.0 version: 2.4.0 @@ -333,6 +522,18 @@ catalogs: postcss: specifier: ^8.4.29 version: 8.5.4 + postcss-import: + specifier: ^15.1.0 + version: 15.1.0 + prettier: + specifier: ^3.2.5 + version: 3.3.3 + prettier-plugin-packagejson: + specifier: ^2.4.14 + version: 2.4.14 + prettier-plugin-tailwindcss: + specifier: ^0.6.8 + version: 0.6.8 prism-react-renderer: specifier: ^2.4.1 version: 2.4.1 @@ -345,6 +546,9 @@ catalogs: react-aria: specifier: ^3.27.0 version: 3.27.0 + react-day-picker: + specifier: ^8.10.1 + version: 8.10.1 react-device-detect: specifier: ^2.2.2 version: 2.2.3 @@ -354,6 +558,9 @@ catalogs: react-dropzone: specifier: ^14.2.2 version: 14.2.3 + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13 react-hook-form: specifier: ^7.46.1 version: 7.46.1 @@ -387,6 +594,9 @@ catalogs: react-select: specifier: ^5.7.0 version: 5.7.0 + react-textarea-autosize: + specifier: ^8.5.3 + version: 8.5.3 react-timeago: specifier: ^7.2.0 version: 7.2.0 @@ -399,9 +609,15 @@ catalogs: react-wrap-balancer: specifier: ^0.5.0 version: 0.5.0 + refractor: + specifier: ^4.8.1 + version: 4.8.1 remeda: specifier: ^1.23.0 version: 1.23.0 + rfc6902: + specifier: ^5.0.1 + version: 5.0.1 slugify: specifier: ^1.6.6 version: 1.6.6 @@ -411,12 +627,33 @@ catalogs: styled-components: specifier: ^6.1.19 version: 6.1.19 + swagger-typescript-api: + specifier: ^12.0.4 + version: 12.0.4 + tailwind-merge: + specifier: ^2.3.0 + version: 2.3.0 + tailwind-scrollbar-hide: + specifier: ^1.1.7 + version: 1.1.7 tailwindcss: specifier: ^3.4.3 version: 3.4.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7 + tailwindcss-safe-area: + specifier: ^0.4.1 + version: 0.4.1 tippy.js: specifier: ^6.3.7 version: 6.3.7 + tsup: + specifier: ^8.0.2 + version: 8.0.2 + turbo: + specifier: ^2.1.2 + version: 2.1.2 typescript: specifier: ^5.4.3 version: 5.4.3 @@ -575,6 +812,9 @@ importers: '@hookform/resolvers': specifier: 'catalog:' version: 3.3.1(react-hook-form@7.46.1(react@18.2.0)) + '@melloware/react-logviewer': + specifier: ^6.3.2 + version: 6.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3)) '@mui/icons-material': specifier: 'catalog:' version: 7.1.0(@mui/material@7.1.0(@emotion/react@11.14.0(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.74)(react@18.2.0) @@ -670,7 +910,7 @@ importers: version: 0.6.2 '@vercel/speed-insights': specifier: 'catalog:' - version: 1.0.10(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@4.2.19)(vue@3.5.12(typescript@5.4.3)) + version: 1.0.10(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3)) clsx: specifier: 'catalog:' version: 2.1.1 @@ -2707,6 +2947,12 @@ packages: '@types/react': ^18.0.0 react: '>=16' + '@melloware/react-logviewer@6.3.2': + resolution: {integrity: sha512-+cNGEI1nZkqxvkTXrD5jZ46QEm77dn+uyHLbWypgiz1Kxerndp+wsC016WNU2dztsGcYIPUi39G1Yor/xJIrZg==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@metascraper/helpers@5.36.0': resolution: {integrity: sha512-sxZDJKRnlNUQrsIq+DMqumMdYphxENdY8Lm4XCLcUan7iq2ASkSmel4fcgOJ8AMdOeiewd17hyZku276bGUuLA==} engines: {node: '>= 16'} @@ -6422,9 +6668,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -6632,10 +6875,6 @@ packages: css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -7813,6 +8052,9 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hotkeys-js@3.13.15: + resolution: {integrity: sha512-gHh8a/cPTCpanraePpjRxyIlxDFrIhYqjuh01UHWEwDpglJKCnvLW8kqSx5gQtOuSsJogNZXLhOdbSExpgUiqg==} + howler@2.2.4: resolution: {integrity: sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==} @@ -8148,9 +8390,6 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.3: - resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -8484,9 +8723,6 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - locate-character@3.0.0: - resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8630,9 +8866,6 @@ packages: mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -8925,6 +9158,9 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -9391,9 +9627,6 @@ packages: peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -10043,6 +10276,10 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-string-replace@1.1.1: + resolution: {integrity: sha512-26TUbLzLfHQ5jO5N7y3Mx88eeKo0Ml0UjCQuX4BMfOd/JX+enQqlKpL1CZnmjeBRvQE8TR+ds9j1rqx9CxhKHQ==} + engines: {node: '>=0.12.0'} + react-style-singleton@2.2.3: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} @@ -10752,10 +10989,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} - swagger-schema-official@2.0.0-bab6bed: resolution: {integrity: sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==} @@ -11405,6 +11638,26 @@ packages: resolution: {integrity: sha512-TriMl18BHEsh2KuuSA065tbu4SNAC9fge7k8uKoTTofTq89+Xsg4K1BGbmSVETwUZhqSjd9KwRCNwXAW/buXMg==} engines: {node: '>=0.10.0'} + virtua@0.41.5: + resolution: {integrity: sha512-x1vsA9qIQNBFcCs1rzCjyYdMvDu/kT6o6zwwQnyqFOFdOyIzqyzU3WfR/hJC8WxUZXSCo2LkuoqapL8VDDMQPg==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + solid-js: '>=1.0' + svelte: '>=5.0' + vue: '>=3.2' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + vite-node@1.5.2: resolution: {integrity: sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==} engines: {node: ^18.0.0 || >=20.0.0} @@ -13168,6 +13421,19 @@ snapshots: '@types/react': 18.2.74 react: 18.2.0 + '@melloware/react-logviewer@6.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3))': + dependencies: + hotkeys-js: 3.13.15 + mitt: 3.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-string-replace: 1.1.1 + virtua: 0.41.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3)) + transitivePeerDependencies: + - solid-js + - svelte + - vue + '@metascraper/helpers@5.36.0': dependencies: audio-extensions: 0.0.0 @@ -17340,11 +17606,10 @@ snapshots: satori: 0.10.9 yoga-wasm-web: 0.3.3 - '@vercel/speed-insights@1.0.10(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(svelte@4.2.19)(vue@3.5.12(typescript@5.4.3))': + '@vercel/speed-insights@1.0.10(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3))': optionalDependencies: next: 14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 - svelte: 4.2.19 vue: 3.5.12(typescript@5.4.3) '@vitejs/plugin-react@4.3.0(vite@5.2.10(@types/node@20.12.4)(terser@5.30.3))': @@ -18275,15 +18540,6 @@ snapshots: clsx@2.1.1: {} - code-red@1.0.4: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.7 - acorn: 8.14.1 - estree-walker: 3.0.3 - periscopic: 3.1.0 - optional: true - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -18508,12 +18764,6 @@ snapshots: css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - optional: true - css-what@6.1.0: {} css.escape@1.5.1: {} @@ -19959,6 +20209,8 @@ snapshots: hosted-git-info@2.8.9: {} + hotkeys-js@3.13.15: {} + howler@2.2.4: {} hsluv@1.0.1: {} @@ -20272,11 +20524,6 @@ snapshots: dependencies: '@types/estree': 1.0.7 - is-reference@3.0.3: - dependencies: - '@types/estree': 1.0.7 - optional: true - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -20685,9 +20932,6 @@ snapshots: dependencies: lie: 3.1.1 - locate-character@3.0.0: - optional: true - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -20867,9 +21111,6 @@ snapshots: dependencies: '@types/mdast': 3.0.15 - mdn-data@2.0.30: - optional: true - mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -21303,6 +21544,8 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + mitt@3.0.1: {} + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} @@ -21824,13 +22067,6 @@ snapshots: duplexify: 3.7.1 through2: 2.0.5 - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.7 - estree-walker: 3.0.3 - is-reference: 3.0.3 - optional: true - pg-int8@1.0.1: {} pg-protocol@1.6.1: {} @@ -22588,6 +22824,8 @@ snapshots: transitivePeerDependencies: - '@types/react' + react-string-replace@1.1.1: {} + react-style-singleton@2.2.3(@types/react@18.2.74)(react@18.2.0): dependencies: get-nonce: 1.0.1 @@ -23442,24 +23680,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte@4.2.19: - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.7 - acorn: 8.14.1 - aria-query: 5.3.2 - axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.3 - locate-character: 3.0.0 - magic-string: 0.30.17 - periscopic: 3.1.0 - optional: true - swagger-schema-official@2.0.0-bab6bed: {} swagger-typescript-api@12.0.4(encoding@0.1.13): @@ -24172,6 +24392,12 @@ snapshots: video-extensions@1.2.0: {} + virtua@0.41.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.12(typescript@5.4.3)): + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + vue: 3.5.12(typescript@5.4.3) + vite-node@1.5.2(@types/node@20.12.4)(terser@5.30.3): dependencies: cac: 6.7.14 @@ -24603,4 +24829,4 @@ snapshots: zustand@3.7.2(react@18.2.0): optionalDependencies: - react: 18.2.0 \ No newline at end of file + react: 18.2.0