From cb2e954f1cda70c2246a9481c169fe90a72aa150 Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Tue, 4 Mar 2025 09:12:41 +0800 Subject: [PATCH 01/15] rht --- apps/web/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/index.html b/apps/web/index.html index 6199b0c..2305b2c 100755 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -12,7 +12,7 @@ VITE_APP_VERSION: "$VITE_APP_VERSION", }; - fhmooc + %VITE_APP_APP_NAME% From e043d4417b366c47f36b07c79defc6cca1aed59d Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Tue, 4 Mar 2025 11:13:24 +0800 Subject: [PATCH 02/15] rht --- apps/web/src/components/common/editor/MindEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/common/editor/MindEditor.tsx b/apps/web/src/components/common/editor/MindEditor.tsx index 985e320..08803c7 100755 --- a/apps/web/src/components/common/editor/MindEditor.tsx +++ b/apps/web/src/components/common/editor/MindEditor.tsx @@ -214,7 +214,7 @@ export default function MindEditor({ id }: { id?: string }) { multiple /> - + {id ? : <>}
{canEdit && ( From a5e6768c85094ba5eb12b7b133ddca23845127ee Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Tue, 4 Mar 2025 19:58:10 +0800 Subject: [PATCH 03/15] 02272356 --- apps/web/public/placeholder.webp | Bin .../main/layout/BasePost/BasePostLayout.tsx | 0 .../main/layout/BasePost/SearchModeRadio.tsx | 0 .../components/MyDutyPathContainer.tsx | 0 .../components/MyDutyListContainer.tsx | 0 .../components/MyLearningListContainer.tsx | 0 .../components/MyPathListContainer.tsx | 0 .../src/app/main/path/components/DeptInfo.tsx | 0 .../src/app/main/path/components/TermInfo.tsx | 0 .../search/components/SearchContainer.tsx | 0 .../src/components/common/editor/constant.ts | 0 .../course/detail/JoinLearingButton.tsx | 0 .../src/components/models/post/PostCard.tsx | 0 .../src/components/models/post/PostSelect.tsx | 12 + .../models/post/SubPost/CourseCard.tsx | 0 .../models/post/SubPost/PathCard.tsx | 0 packages/ui/package.json | 38 --- .../ui/src/components/mindmap/MindMap.tsx | 90 ------- .../ui/src/components/mindmap/MindMapEdge.tsx | 16 -- .../ui/src/components/mindmap/MindMapNode.tsx | 83 ------- .../ui/src/components/mindmap/edge/index.ts | 11 - .../mindmap/hooks/useFlowKeyboardControl.ts | 145 ----------- packages/ui/src/components/mindmap/index.ts | 1 - packages/ui/src/components/mindmap/layout.ts | 43 ---- packages/ui/src/components/mindmap/store.ts | 234 ------------------ packages/ui/src/components/mindmap/types.ts | 32 --- packages/ui/src/components/mindmap/utils.ts | 0 packages/ui/src/hooks/useClickOutside.ts | 15 -- packages/ui/src/index.ts | 1 - packages/ui/tsconfig.json | 43 ---- packages/ui/tsup.config.ts | 13 - web-dist/index.html | 0 32 files changed, 12 insertions(+), 765 deletions(-) mode change 100644 => 100755 apps/web/public/placeholder.webp mode change 100644 => 100755 apps/web/src/app/main/layout/BasePost/BasePostLayout.tsx mode change 100644 => 100755 apps/web/src/app/main/layout/BasePost/SearchModeRadio.tsx mode change 100644 => 100755 apps/web/src/app/main/my-duty-path/components/MyDutyPathContainer.tsx mode change 100644 => 100755 apps/web/src/app/main/my-duty/components/MyDutyListContainer.tsx mode change 100644 => 100755 apps/web/src/app/main/my-learning/components/MyLearningListContainer.tsx mode change 100644 => 100755 apps/web/src/app/main/my-path/components/MyPathListContainer.tsx mode change 100644 => 100755 apps/web/src/app/main/path/components/DeptInfo.tsx mode change 100644 => 100755 apps/web/src/app/main/path/components/TermInfo.tsx mode change 100644 => 100755 apps/web/src/app/main/search/components/SearchContainer.tsx mode change 100644 => 100755 apps/web/src/components/common/editor/constant.ts mode change 100644 => 100755 apps/web/src/components/models/course/detail/JoinLearingButton.tsx mode change 100644 => 100755 apps/web/src/components/models/post/PostCard.tsx create mode 100755 apps/web/src/components/models/post/PostSelect.tsx mode change 100644 => 100755 apps/web/src/components/models/post/SubPost/CourseCard.tsx mode change 100644 => 100755 apps/web/src/components/models/post/SubPost/PathCard.tsx delete mode 100755 packages/ui/package.json delete mode 100755 packages/ui/src/components/mindmap/MindMap.tsx delete mode 100755 packages/ui/src/components/mindmap/MindMapEdge.tsx delete mode 100755 packages/ui/src/components/mindmap/MindMapNode.tsx delete mode 100755 packages/ui/src/components/mindmap/edge/index.ts delete mode 100755 packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts delete mode 100755 packages/ui/src/components/mindmap/index.ts delete mode 100755 packages/ui/src/components/mindmap/layout.ts delete mode 100755 packages/ui/src/components/mindmap/store.ts delete mode 100755 packages/ui/src/components/mindmap/types.ts delete mode 100755 packages/ui/src/components/mindmap/utils.ts delete mode 100755 packages/ui/src/hooks/useClickOutside.ts delete mode 100755 packages/ui/src/index.ts delete mode 100755 packages/ui/tsconfig.json delete mode 100755 packages/ui/tsup.config.ts mode change 100644 => 100755 web-dist/index.html diff --git a/apps/web/public/placeholder.webp b/apps/web/public/placeholder.webp old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/layout/BasePost/BasePostLayout.tsx b/apps/web/src/app/main/layout/BasePost/BasePostLayout.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/layout/BasePost/SearchModeRadio.tsx b/apps/web/src/app/main/layout/BasePost/SearchModeRadio.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/my-duty-path/components/MyDutyPathContainer.tsx b/apps/web/src/app/main/my-duty-path/components/MyDutyPathContainer.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/my-duty/components/MyDutyListContainer.tsx b/apps/web/src/app/main/my-duty/components/MyDutyListContainer.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/my-learning/components/MyLearningListContainer.tsx b/apps/web/src/app/main/my-learning/components/MyLearningListContainer.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/my-path/components/MyPathListContainer.tsx b/apps/web/src/app/main/my-path/components/MyPathListContainer.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/path/components/DeptInfo.tsx b/apps/web/src/app/main/path/components/DeptInfo.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/path/components/TermInfo.tsx b/apps/web/src/app/main/path/components/TermInfo.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/search/components/SearchContainer.tsx b/apps/web/src/app/main/search/components/SearchContainer.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/common/editor/constant.ts b/apps/web/src/components/common/editor/constant.ts old mode 100644 new mode 100755 diff --git a/apps/web/src/components/models/course/detail/JoinLearingButton.tsx b/apps/web/src/components/models/course/detail/JoinLearingButton.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/models/post/PostCard.tsx b/apps/web/src/components/models/post/PostCard.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/models/post/PostSelect.tsx b/apps/web/src/components/models/post/PostSelect.tsx new file mode 100755 index 0000000..d5f5324 --- /dev/null +++ b/apps/web/src/components/models/post/PostSelect.tsx @@ -0,0 +1,12 @@ +import { api } from "@nice/client"; + +export default function PostSelect() { + const { data } = api.post.findMany.useQuery({ + where: { + title: { + contains: "" + } + } + }) + +} \ No newline at end of file diff --git a/apps/web/src/components/models/post/SubPost/CourseCard.tsx b/apps/web/src/components/models/post/SubPost/CourseCard.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/models/post/SubPost/PathCard.tsx b/apps/web/src/components/models/post/SubPost/PathCard.tsx old mode 100644 new mode 100755 diff --git a/packages/ui/package.json b/packages/ui/package.json deleted file mode 100755 index f057e65..0000000 --- a/packages/ui/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@nice/ui", - "version": "1.0.0", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "private": true, - "scripts": { - "build": "tsup", - "dev": "tsup --watch", - "clean": "rimraf dist", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@dagrejs/dagre": "^1.1.4", - "@nice/utils": "workspace:^", - "@xyflow/react": "^12.3.6", - "dagre": "^0.8.5", - "nanoid": "^5.0.9", - "react-hotkeys-hook": "^4.6.1", - "zustand": "^5.0.3" - }, - "peerDependencies": { - "react": "18.2.0", - "react-dom": "18.2.0" - }, - "devDependencies": { - "@types/dagre": "^0.7.52", - "@types/node": "^20.3.1", - "@types/react": "18.2.38", - "@types/react-dom": "18.2.15", - "concurrently": "^8.0.0", - "rimraf": "^6.0.1", - "ts-node": "^10.9.1", - "tsup": "^8.3.5", - "typescript": "^5.5.4" - } -} \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/MindMap.tsx b/packages/ui/src/components/mindmap/MindMap.tsx deleted file mode 100755 index 24cb3a2..0000000 --- a/packages/ui/src/components/mindmap/MindMap.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { useCallback, useState, useRef, useEffect } from 'react'; -import { - ReactFlow, - Controls, - Background, - useReactFlow, - Panel, - ReactFlowProvider, - NodeOrigin, - ConnectionLineType, - useStoreApi, - InternalNode, -} from '@xyflow/react'; -import MindMapNode from './MindMapNode'; -import useMindMapStore, { RFState } from './store'; -import { shallow, useShallow } from 'zustand/shallow'; -import MindMapEdge from './MindMapEdge'; -import '@xyflow/react/dist/style.css'; -import { useFlowKeyboardControls } from './hooks/useFlowKeyboardControl'; - -const selector = (state: RFState) => ({ - nodes: state.nodes, - edges: state.edges, - onNodesChange: state.onNodesChange, - onEdgesChange: state.onEdgesChange, - addChildNode: state.addChildNode, - addSiblingNode: state.addSiblingNode, - selectedNodeId: state.selectedNodeId, - setSelectedNodeIdId: state.setSelectedNodeId, - undo: state.undo, - redo: state.redo, - canUndo: state.canUndo, - canRedo: state.canRedo - -}); -const nodeOrigin: NodeOrigin = [0.5, 0.5]; -// 节点类型定义 -const nodeTypes = { - mindmap: MindMapNode, -}; - -const edgeTypes = { - mindmap: MindMapEdge, -}; -const connectionLineStyle = { - stroke: '#999', - strokeWidth: 2, - radius: 20 // Add corner radius for orthogonal lines -}; - -const defaultEdgeOptions = { - style: connectionLineStyle, - type: 'mindmap', - animated: false -}; -export function Flow() { - const { nodes, edges, onNodesChange, undo, redo, setSelectedNodeIdId, onEdgesChange, addChildNode, addSiblingNode, selectedNodeId } = useMindMapStore( - useShallow(selector) - ); - useFlowKeyboardControls() - return ( - - - - React Flow Mind Map - - ); -} -export function MindMap() { - return - - -} \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/MindMapEdge.tsx b/packages/ui/src/components/mindmap/MindMapEdge.tsx deleted file mode 100755 index b67bc3a..0000000 --- a/packages/ui/src/components/mindmap/MindMapEdge.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { BaseEdge, EdgeProps, getBezierPath, getStraightPath } from '@xyflow/react'; - -function MindMapEdge(props: EdgeProps) { - const { sourceX, sourceY, targetX, targetY } = props; - - const [edgePath] = getBezierPath({ - sourceX, - sourceY, - targetX, - targetY, - }); - - return ; -} - -export default MindMapEdge; \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/MindMapNode.tsx b/packages/ui/src/components/mindmap/MindMapNode.tsx deleted file mode 100755 index aff0ba1..0000000 --- a/packages/ui/src/components/mindmap/MindMapNode.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Handle, NodeProps, Position, useEdges } from '@xyflow/react'; -import { MindMapNodeType } from './types'; -import useMindMapStore, { RFState } from './store'; -import { useEffect, useRef, useState } from 'react'; -import { useShallow } from 'zustand/shallow'; -import { useClickOutside } from '../../hooks/useClickOutside'; -import { useHotkeys } from 'react-hotkeys-hook'; -const selector = (state: RFState) => ({ - selectedNodeId: state.selectedNodeId, - editingNodeId: state.editingNodeId, - updateNodeLabel: state.updateNodeLabel, - setSelectedNodeId: state.setSelectedNodeId, - setEditingNodeId: state.setEditingNodeId - -}); -function MindMapNode({ id, data }: NodeProps) { - const nodeRef = useRef(null); - const inputRef = useRef(null); - const [inputValue, setInputValue] = useState(data.label); - - const { - updateNodeLabel, - selectedNodeId, - setSelectedNodeId, - setEditingNodeId, - editingNodeId - } = useMindMapStore(useShallow(selector)); - useEffect(() => { - if (editingNodeId === id) { - setEditingNodeId(id); - setInputValue(data.label); - setTimeout(() => { - inputRef.current?.focus(); - inputRef.current?.select(); - }, 0); - } else { - inputRef.current?.blur() - } - }, [editingNodeId]) - const handleDoubleClick = (e: React.MouseEvent) => { - e.stopPropagation(); - setEditingNodeId(id) - }; - - useHotkeys("space", (e) => { - if (selectedNodeId === id) - setEditingNodeId(id) - }, { preventDefault: true }); - const handleClick = (e: React.MouseEvent) => { - setSelectedNodeId(id); - }; - - useClickOutside(nodeRef, () => { - console.log(selectedNodeId, id) - if (selectedNodeId === id) - setSelectedNodeId(null) - if (editingNodeId === id) { - setEditingNodeId(null) - updateNodeLabel(id, inputValue) - } - }); - - return ( -
- setInputValue(e.target.value)} - className="input" - readOnly={id !== editingNodeId} - /> - - -
- ); -} - -export default MindMapNode; \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/edge/index.ts b/packages/ui/src/components/mindmap/edge/index.ts deleted file mode 100755 index d702aa7..0000000 --- a/packages/ui/src/components/mindmap/edge/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Edge, EdgeTypes } from "@xyflow/react"; - -export const initialEdges = [ - { id: "a->c", source: "a", target: "c", animated: true }, - { id: "b->d", source: "b", target: "d" }, - { id: "c->d", source: "c", target: "d", animated: true }, -] satisfies Edge[]; - -export const edgeTypes = { - // Add your custom edge types here! -} satisfies EdgeTypes; diff --git a/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts b/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts deleted file mode 100755 index 74835c4..0000000 --- a/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { useCallback } from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { useStoreApi } from '@xyflow/react'; -import useMindMapStore, { RFState } from '../store'; -import { useShallow } from 'zustand/shallow'; - -const controlsSelector = (state: RFState) => ({ - selectedNodeId: state.selectedNodeId, - setSelectedNodeId: state.setSelectedNodeId, - addChildNode: state.addChildNode, - addSiblingNode: state.addSiblingNode, - undo: state.undo, - redo: state.redo, -}); - -export function useFlowKeyboardControls() { - const { - selectedNodeId, - setSelectedNodeId, - addChildNode, - addSiblingNode, - undo, - redo, - } = useMindMapStore(useShallow(controlsSelector)); - - const store = useStoreApi(); - - const getNextNodeInDirection = useCallback((direction: 'left' | 'right' | 'up' | 'down') => { - const { nodeLookup, edges } = store.getState(); - if (!selectedNodeId) return null; - - const currentNode = nodeLookup.get(selectedNodeId); - if (!currentNode) return null; - - // 构建节点关系图 - const nodeRelations = new Map(); - - edges.forEach(edge => { - const source = edge.source; - const target = edge.target; - - if (!nodeRelations.has(source)) { - nodeRelations.set(source, { parent: null, children: [], siblings: [] }); - } - if (!nodeRelations.has(target)) { - nodeRelations.set(target, { parent: null, children: [], siblings: [] }); - } - - nodeRelations.get(target)!.parent = source; - nodeRelations.get(source)!.children.push(target); - }); - - // 找出同级节点 - const currentRelation = nodeRelations.get(selectedNodeId); - if (currentRelation?.parent) { - const parentRelation = nodeRelations.get(currentRelation.parent); - if (parentRelation) { - currentRelation.siblings = parentRelation.children.filter(id => id !== selectedNodeId); - } - } - - // 根据方向决定下一个节点 - switch (direction) { - case 'left': { - // 如果当前节点是子节点,优先选择父节点 - if (currentRelation?.parent) { - const parentNode = nodeLookup.get(currentRelation.parent); - if (parentNode && parentNode.position.x < currentNode.position.x) { - return currentRelation.parent; - } - } - break; - } - case 'right': { - // 如果有子节点,选择第一个子节点 - const children = currentRelation?.children || []; - if (children.length > 0) { - return children[0]; - } - break; - } - case 'up': { - // 在同级节点中找位置靠上的节点 - const siblings = currentRelation?.siblings || []; - const upperSiblings = siblings - .map(id => nodeLookup.get(id)) - .filter(node => node && node.position.y < currentNode.position.y) - .sort((a, b) => b!.position.y - a!.position.y); - - if (upperSiblings.length > 0) { - return upperSiblings[0]!.id; - } - break; - } - case 'down': { - // 在同级节点中找位置靠下的节点 - const siblings = currentRelation?.siblings || []; - const lowerSiblings = siblings - .map(id => nodeLookup.get(id)) - .filter(node => node && node.position.y > currentNode.position.y) - .sort((a, b) => a!.position.y - b!.position.y); - - if (lowerSiblings.length > 0) { - return lowerSiblings[0]!.id; - } - break; - } - } - - return null; - }, [selectedNodeId, store]); - - // Tab 键添加子节点 - useHotkeys('tab', (e) => { - e.preventDefault(); - if (selectedNodeId) addChildNode(selectedNodeId); - }, { enableOnFormTags: true, preventDefault: true }); - - // Enter 键添加同级节点 - useHotkeys('enter', (e) => { - e.preventDefault(); - if (selectedNodeId) addSiblingNode(selectedNodeId); - }, { enableOnFormTags: true, preventDefault: true }); - - // 撤销重做 - // useHotkeys('ctrl+z, cmd+z', (e) => { - - // undo(); - // }, { enableOnFormTags: false }); - - // useHotkeys('ctrl+y, cmd+y', (e) => { - - // redo(); - // }, { enableOnFormTags: false }); - - // 方向键导航 - const directions = ['left', 'right', 'up', 'down'] as const; - directions.forEach(direction => { - useHotkeys(direction, (e) => { - e.preventDefault(); - const nextNodeId = getNextNodeInDirection(direction); - if (nextNodeId) setSelectedNodeId(nextNodeId); - }, { enableOnFormTags: true }); - }); -} \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/index.ts b/packages/ui/src/components/mindmap/index.ts deleted file mode 100755 index 3505c9b..0000000 --- a/packages/ui/src/components/mindmap/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./MindMap" \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/layout.ts b/packages/ui/src/components/mindmap/layout.ts deleted file mode 100755 index 7b66c09..0000000 --- a/packages/ui/src/components/mindmap/layout.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Edge, Node } from '@xyflow/react'; -import dagre from 'dagre'; - -export const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'LR') => { - const dagreGraph = new dagre.graphlib.Graph(); - dagreGraph.setDefaultEdgeLabel(() => ({})); - - const nodeWidth = 200; - const nodeHeight = 50; - - dagreGraph.setGraph({ - rankdir: direction, - nodesep: 80, - ranksep: 100 - }); - - // 添加节点 - nodes.forEach((node) => { - dagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight }); - }); - - // 添加边 - edges.forEach((edge) => { - dagreGraph.setEdge(edge.source, edge.target); - }); - - // 计算布局 - dagre.layout(dagreGraph); - - // 获取新的节点位置 - const layoutedNodes = nodes.map((node) => { - const nodeWithPosition = dagreGraph.node(node.id); - return { - ...node, - position: { - x: nodeWithPosition.x - nodeWidth / 2, - y: nodeWithPosition.y - nodeHeight / 2, - }, - }; - }); - - return { nodes: layoutedNodes, edges }; -}; \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/store.ts b/packages/ui/src/components/mindmap/store.ts deleted file mode 100755 index 26f1242..0000000 --- a/packages/ui/src/components/mindmap/store.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { - Edge, - EdgeChange, - Node, - NodeChange, - OnNodesChange, - OnEdgesChange, - applyNodeChanges, - applyEdgeChanges, - XYPosition, -} from '@xyflow/react'; -import { nanoid } from 'nanoid'; -import { create } from 'zustand'; -import { HistoryData, HistoryState, NodeLayout, NodeRelationType } from './types'; -import { getLayoutedElements } from './layout'; - - -const createHistoryState = (initialPresent: HistoryData): HistoryState => ({ - past: [], - present: initialPresent, - future: [], -}); - -const initialNodes: Node[] = [{ - id: 'root', - type: 'mindmap', - data: { label: 'React Flow Mind Map' }, - position: { x: 0, y: 0 }, -}]; - -export type RFState = { - nodes: Node[]; - edges: Edge[]; - onNodesChange: OnNodesChange; - onEdgesChange: OnEdgesChange; - history: HistoryState; - addChildNode: (nodeId: string, position?: XYPosition) => void; - updateNodeLabel: (nodeId: string, label: string) => void - addSiblingNode: (nodeId: string, position?: XYPosition) => void - selectedNodeId: string | null; - setSelectedNodeId: (nodeId: string | null) => void; - editingNodeId: string | null; - setEditingNodeId: (nodeId: string | null) => void; - isEditing: boolean; - undo: () => void; - redo: () => void; - canUndo: boolean; - canRedo: boolean; -}; -const useMindMapStore = create((set, get) => { - const updateHistory = (newState: Partial) => { - const currentState = get().history.present; - return { - past: [...get().history.past, currentState], - present: { ...currentState, ...newState }, - future: [], - }; - }; - - const createNewNode = (label: string = 'New Node'): Node => ({ - id: nanoid(), - type: 'mindmap', - data: { label }, - position: { x: 0, y: 0 } - }); - const addNode = ( - parentId: string, - relationType: NodeRelationType - ) => { - const { nodes, edges, editingNodeId } = get(); - const parentNode = nodes.find(node => node.id === parentId); - if (!parentNode) return; - const newNode = createNewNode(); - const newEdge = { - id: nanoid(), - source: relationType === 'child' ? parentId : edges.find(e => e.target === parentId)?.source ?? parentId, - target: newNode.id, - type: 'smoothstep', - }; - const newNodes = [...nodes, newNode]; - const newEdges = [...edges, newEdge]; - const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedElements(newNodes, newEdges); - set({ - nodes: layoutedNodes, - edges: layoutedEdges, - selectedNodeId: newNode.id, - history: updateHistory({ - nodes: layoutedNodes, - edges: layoutedEdges, - selectedNodeId: newNode.id, - editingNodeId, - }), - }); - }; - return { - nodes: initialNodes, - edges: [], - isEditing: false, - history: createHistoryState({ nodes: initialNodes, edges: [], selectedNodeId: null, editingNodeId: null }), - editingNodeId: null, - setEditingNodeId: (nodeId: string | null) => { - const { nodes, edges, selectedNodeId } = get(); - set({ - editingNodeId: nodeId, - isEditing: Boolean(nodeId), - history: { - past: [...get().history.past, get().history.present], - present: { - nodes, - edges, - selectedNodeId, - editingNodeId: nodeId - }, - future: [], - }, - }); - }, - selectedNodeId: null, - setSelectedNodeId: (nodeId: string | null) => { - const { nodes, edges, editingNodeId } = get(); - set({ - selectedNodeId: nodeId, - history: { - past: [...get().history.past, get().history.present], - present: { nodes, edges, selectedNodeId: nodeId, editingNodeId }, - future: [], - }, - }); - }, - updateNodeLabel: (nodeId: string, label: string) => { - const { nodes, edges, selectedNodeId, editingNodeId } = get(); - const newNodes = nodes.map((node) => { - if (node.id === nodeId) { - return { ...node, data: { ...node.data, label } }; - } - return node; - }); - set({ - nodes: newNodes, - edges, - selectedNodeId, - history: { - past: [...get().history.past, get().history.present], - present: { nodes: newNodes, edges, selectedNodeId, editingNodeId }, - future: [], - }, - }); - }, - onNodesChange: (changes: NodeChange[]) => { - console.log('on node change', changes) - const { nodes, edges, selectedNodeId } = get(); - const newNodes = applyNodeChanges(changes, nodes); - set({ nodes: newNodes }); - }, - onEdgesChange: (changes: EdgeChange[]) => { - const { nodes, edges, selectedNodeId } = get(); - const newEdges = applyEdgeChanges(changes, edges); - - set({ edges: newEdges }); - }, - addChildNode: (nodeId: string) => - addNode(nodeId, 'child'), - addSiblingNode: (nodeId: string) => - addNode(nodeId, 'sibling'), - undo: () => { - const { history } = get(); - console.log('[Undo] Starting undo operation'); - - if (history.past.length === 0) { - console.log('[Undo] No past states available, undo skipped'); - return; - } - const previous = history.past[history.past.length - 1]; - const newPast = history.past.slice(0, -1); - const newPresent = { ...history.present }; - console.log('[Undo] Previous state:', previous); - console.log('[Undo] New past length:', newPast.length); - - set({ - nodes: previous.nodes, - edges: previous.edges, - selectedNodeId: previous.selectedNodeId, - editingNodeId: previous.editingNodeId, - history: { - past: newPast, - present: previous, - future: [newPresent, ...history.future], - }, - }); - - console.log('[Undo] Operation completed'); - }, - - redo: () => { - const { history } = get(); - console.log('[Redo] Starting redo operation'); - - if (history.future.length === 0) { - console.log('[Redo] No future states available, redo skipped'); - return; - } - - const next = history.future[0]; - const newFuture = history.future.slice(1); - - console.log('[Redo] Next state:', next); - console.log('[Redo] New future length:', newFuture.length); - - set({ - nodes: next.nodes, - edges: next.edges, - selectedNodeId: next.selectedNodeId, - editingNodeId: next.editingNodeId, - history: { - past: [...history.past, history.present], - present: next, - future: newFuture, - }, - }); - - console.log('[Redo] Operation completed'); - }, - get canUndo() { - return get().history.past.length > 0; - }, - - get canRedo() { - return get().history.future.length > 0; - }, - } -}); - - -export default useMindMapStore; \ No newline at end of file diff --git a/packages/ui/src/components/mindmap/types.ts b/packages/ui/src/components/mindmap/types.ts deleted file mode 100755 index 72911e2..0000000 --- a/packages/ui/src/components/mindmap/types.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { Node, NodeTypes, BuiltInNode, Edge } from "@xyflow/react"; - -export type MindMapNodeType = Node< - { - label: string - level: number - isExpanded?: boolean - metadata?: Record - }, "mindmap"> - -export type MindMapEdgeType = Edge<{ - label: string -}, "mindmap"> - -export type HistoryState = { - past: T[]; - present: T; - future: T[]; -}; -export type HistoryData = { - nodes: Node[]; - edges: Edge[]; - selectedNodeId: string | null; - editingNodeId: string | null; // Add this -}; -export type NodeRelationType = 'child' | 'sibling'; -export type NodeLayout = { - horizontalSpacing: number; - verticalSpacing: number; - nodeWidth: number; - nodeHeight: number; -}; diff --git a/packages/ui/src/components/mindmap/utils.ts b/packages/ui/src/components/mindmap/utils.ts deleted file mode 100755 index e69de29..0000000 diff --git a/packages/ui/src/hooks/useClickOutside.ts b/packages/ui/src/hooks/useClickOutside.ts deleted file mode 100755 index affd62d..0000000 --- a/packages/ui/src/hooks/useClickOutside.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { useEffect, RefObject } from 'react'; - -export function useClickOutside(ref: RefObject, handler: () => void) { - useEffect(() => { - function handleClickOutside(event: MouseEvent) { - console.log(event.target) - if (ref.current && !ref.current.contains(event.target as Node)) { - handler(); - } - } - - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, [ref, handler]); -} \ No newline at end of file diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts deleted file mode 100755 index 33ff1f5..0000000 --- a/packages/ui/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./components/mindmap" diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json deleted file mode 100755 index f2c2a6d..0000000 --- a/packages/ui/tsconfig.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "esnext", - "allowJs": true, - "lib": [ - "DOM", - "es2022", - "DOM.Iterable" - ], - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "removeComments": true, - "skipLibCheck": true, - "strict": true, - "isolatedModules": true, - "jsx": "react-jsx", - "esModuleInterop": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": false, - "noFallthroughCasesInSwitch": false, - "noUncheckedIndexedAccess": false, - "noImplicitOverride": false, - "noPropertyAccessFromIndexSignature": false, - "outDir": "dist", - "incremental": true, - "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" - }, - "include": [ - "src" - ], - "exclude": [ - "node_modules", - "dist", - "**/*.test.ts", - "**/*.spec.ts", - "**/__tests__" - ] -} \ No newline at end of file diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts deleted file mode 100755 index f21629b..0000000 --- a/packages/ui/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'tsup' - -export default defineConfig({ - entry: ['src/index.ts'], - format: ['esm', 'cjs'], - dts: true, - clean: true, - sourcemap: true, - minify: true, - external: ['react', 'react-dom'], - bundle: true, - target: "esnext" -}) \ No newline at end of file diff --git a/web-dist/index.html b/web-dist/index.html old mode 100644 new mode 100755 From 8be58c2f1026699efaa272b26cd07a2b71a5a310 Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Tue, 4 Mar 2025 22:15:34 +0800 Subject: [PATCH 04/15] 03042215 --- .gitignore | 3 ++- Dockerfile | 6 ------ apps/web/index.html | 10 ++++++---- web-dist/index.html | 47 ++++++++++++++++++++++----------------------- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 2e6bac7..4954c82 100755 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ backup # dependencies **/node_modules/ volumes +web-dist /.pnp .pnp.js *.tar @@ -69,4 +70,4 @@ yarn-error.log* **/.idea/ uploads packages/mind-elixir-core -config/nginx/conf.d/web.conf \ No newline at end of file +config/nginx/conf.d/web.conf diff --git a/Dockerfile b/Dockerfile index 0a51235..3a9ff79 100755 --- a/Dockerfile +++ b/Dockerfile @@ -108,21 +108,15 @@ CMD ["/usr/bin/entrypoint.sh"] # 使用 Nginx 的 Alpine 版本作为基础镜像 FROM nginx:stable-alpine as nginx - # 替换 Alpine 的软件源为阿里云镜像 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories - # 设置工作目录 WORKDIR /usr/share/nginx/html - # 设置环境变量 ENV NODE_ENV production - # 安装 envsubst 和 inotify-tools RUN apk add --no-cache gettext inotify-tools - # 创建 /data/uploads 目录 RUN mkdir -p /data/uploads - # 暴露 80 端口 EXPOSE 80 \ No newline at end of file diff --git a/apps/web/index.html b/apps/web/index.html index 2305b2c..31078c2 100755 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -7,12 +7,14 @@ - %VITE_APP_APP_NAME% + $APP_NAME diff --git a/web-dist/index.html b/web-dist/index.html index 73a792f..44e046f 100755 --- a/web-dist/index.html +++ b/web-dist/index.html @@ -1,27 +1,26 @@ - - - - - - fhmooc - - - - -
- - + + + + + + $APP_NAME + + + + + +
+ + + \ No newline at end of file From 99bbc982e12d33681fd6776f75ee7f71512c571e Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Tue, 4 Mar 2025 22:24:28 +0800 Subject: [PATCH 05/15] rht --- apps/web/src/main.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 962b763..34a26e2 100755 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -11,6 +11,7 @@ ModuleRegistry.registerModules([ClientSideRowModelModule]); LicenseManager.setLicenseKey( 'LICENSE_KEY_BODY[version=v3][0102]_EXPIRY_NDg4NDc0ODcwNTExMw==094bf1c7852b11df1841f4d14457ae96' ); + ReactDOM.createRoot(document.getElementById("root")!).render( From 889e5abb87f427fc0c1eb728bb9fc5b78cdd9f6b Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Tue, 4 Mar 2025 22:24:52 +0800 Subject: [PATCH 06/15] 03042223 --- apps/web/package.json | 1 - .../app/main/home/components/HeroSection.tsx | 10 -- config/nginx/conf.d/web.conf | 2 +- pnpm-lock.yaml | 166 ++++-------------- web-dist/index.html | 12 +- 5 files changed, 41 insertions(+), 150 deletions(-) mode change 100755 => 100644 web-dist/index.html diff --git a/apps/web/package.json b/apps/web/package.json index 909aa90..b484901 100755 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -34,7 +34,6 @@ "@nice/common": "workspace:^", "@nice/config": "workspace:^", "@nice/iconer": "workspace:^", - "@nice/ui": "workspace:^", "@nice/utils": "workspace:^", "@tanstack/query-async-storage-persister": "^5.51.9", "@tanstack/react-query": "^5.51.21", diff --git a/apps/web/src/app/main/home/components/HeroSection.tsx b/apps/web/src/app/main/home/components/HeroSection.tsx index 74643fb..f4c21fd 100755 --- a/apps/web/src/app/main/home/components/HeroSection.tsx +++ b/apps/web/src/app/main/home/components/HeroSection.tsx @@ -18,16 +18,6 @@ import type { CarouselRef } from "antd/es/carousel"; import { useAppConfig } from "@nice/client"; import { useNavigate } from "react-router-dom"; -const { Title, Text } = Typography; - -interface CarouselItem { - title: string; - desc: string; - image: string; - action: string; - color: string; -} - interface PlatformStat { icon: React.ReactNode; value: number; diff --git a/config/nginx/conf.d/web.conf b/config/nginx/conf.d/web.conf index 88fa2c9..67302b8 100755 --- a/config/nginx/conf.d/web.conf +++ b/config/nginx/conf.d/web.conf @@ -100,7 +100,7 @@ server { # 仅供内部使用 internal; # 代理到认证服务 - proxy_pass http://host.docker.internal:3006/auth/file; + proxy_pass http://host.docker.internal:3000/auth/file; # 请求优化:不传递请求体 proxy_pass_request_body off; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 382d2e7..0efc82c 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: dependencies: '@nestjs/bullmq': specifier: ^10.2.0 - version: 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8) + version: 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(bullmq@5.34.8) '@nestjs/common': specifier: ^10.3.10 version: 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -33,7 +33,7 @@ importers: version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1) '@nestjs/schedule': specifier: ^4.1.0 - version: 4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)) + version: 4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15) '@nestjs/websockets': specifier: ^10.3.10 version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -148,7 +148,7 @@ importers: version: 10.2.3(chokidar@3.6.0)(typescript@5.7.2) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)) + version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-express@10.4.15) '@types/exceljs': specifier: ^1.3.0 version: 1.3.2 @@ -296,9 +296,6 @@ importers: '@nice/iconer': specifier: workspace:^ version: link:../../packages/iconer - '@nice/ui': - specifier: workspace:^ - version: link:../../packages/ui '@nice/utils': specifier: workspace:^ version: link:../../packages/utils @@ -785,64 +782,6 @@ importers: specifier: ^5.5.4 version: 5.7.2 - packages/ui: - dependencies: - '@dagrejs/dagre': - specifier: ^1.1.4 - version: 1.1.4 - '@nice/utils': - specifier: workspace:^ - version: link:../utils - '@xyflow/react': - specifier: ^12.3.6 - version: 12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - dagre: - specifier: ^0.8.5 - version: 0.8.5 - nanoid: - specifier: ^5.0.9 - version: 5.0.9 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hotkeys-hook: - specifier: ^4.6.1 - version: 4.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - zustand: - specifier: ^5.0.3 - version: 5.0.3(@types/react@18.2.38)(react@18.2.0)(use-sync-external-store@1.4.0(react@18.2.0)) - devDependencies: - '@types/dagre': - specifier: ^0.7.52 - version: 0.7.52 - '@types/node': - specifier: ^20.3.1 - version: 20.17.12 - '@types/react': - specifier: 18.2.38 - version: 18.2.38 - '@types/react-dom': - specifier: 18.2.15 - version: 18.2.15 - concurrently: - specifier: ^8.0.0 - version: 8.2.2 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2) - tsup: - specifier: ^8.3.5 - version: 8.3.5(@microsoft/api-extractor@7.49.2(@types/node@20.17.12))(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0) - typescript: - specifier: ^5.5.4 - version: 5.7.2 - packages/utils: devDependencies: '@types/node': @@ -1395,13 +1334,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dagrejs/dagre@1.1.4': - resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==} - - '@dagrejs/graphlib@2.2.4': - resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} - engines: {node: '>17.0.0'} - '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -1987,67 +1919,79 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -2515,51 +2459,61 @@ packages: resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.30.1': resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.30.1': resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.30.1': resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.30.1': resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.30.1': resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.30.1': resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.30.1': resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.30.1': resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.30.1': resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} @@ -2918,24 +2872,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.10.6': resolution: {integrity: sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.10.6': resolution: {integrity: sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.10.6': resolution: {integrity: sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.10.6': resolution: {integrity: sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==} @@ -4275,9 +4233,6 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} - dagre@0.8.5: - resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} - dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -5016,9 +4971,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphlib@2.1.8: - resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} - hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -6706,12 +6658,6 @@ packages: react: '>=16' react-dom: '>=16' - react-hotkeys-hook@4.6.1: - resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==} - peerDependencies: - react: '>=16.8.1' - react-dom: '>=16.8.1' - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -7885,24 +7831,6 @@ packages: react: optional: true - zustand@5.0.3: - resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=18.0.0' - immer: '>=9.0.6' - react: '>=18.0.0' - use-sync-external-store: '>=1.2.0' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - use-sync-external-store: - optional: true - snapshots: '@ag-grid-community/client-side-row-model@32.3.3': @@ -8911,12 +8839,6 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dagrejs/dagre@1.1.4': - dependencies: - '@dagrejs/graphlib': 2.2.4 - - '@dagrejs/graphlib@2.2.4': {} - '@dnd-kit/accessibility@3.1.1(react@18.2.0)': dependencies: react: 18.2.0 @@ -9654,15 +9576,15 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))': + '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)': dependencies: '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1) tslib: 2.8.1 - '@nestjs/bullmq@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8)': + '@nestjs/bullmq@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(bullmq@5.34.8)': dependencies: - '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)) + '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15) '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1) bullmq: 5.34.8 @@ -9759,7 +9681,7 @@ snapshots: - supports-color - utf-8-validate - '@nestjs/schedule@4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))': + '@nestjs/schedule@4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)': dependencies: '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -9777,7 +9699,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15))': + '@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-express@10.4.15)': dependencies: '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -12118,11 +12040,6 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dagre@0.8.5: - dependencies: - graphlib: 2.1.8 - lodash: 4.17.21 - dargs@7.0.0: {} date-fns@2.30.0: @@ -12984,10 +12901,6 @@ snapshots: graphemer@1.4.0: {} - graphlib@2.1.8: - dependencies: - lodash: 4.17.21 - hard-rejection@2.1.0: {} has-flag@4.0.0: {} @@ -14872,11 +14785,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-hotkeys-hook@4.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is@16.13.1: {} react-is@18.3.1: {} @@ -16106,9 +16014,3 @@ snapshots: optionalDependencies: '@types/react': 18.2.38 react: 18.2.0 - - zustand@5.0.3(@types/react@18.2.38)(react@18.2.0)(use-sync-external-store@1.4.0(react@18.2.0)): - optionalDependencies: - '@types/react': 18.2.38 - react: 18.2.0 - use-sync-external-store: 1.4.0(react@18.2.0) diff --git a/web-dist/index.html b/web-dist/index.html old mode 100755 new mode 100644 index 44e046f..2bfb23d --- a/web-dist/index.html +++ b/web-dist/index.html @@ -7,14 +7,14 @@ - $APP_NAME + test From 7e79e8aca2b6eb416b8c9a79b0106b079ddc3471 Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Wed, 5 Mar 2025 08:30:42 +0800 Subject: [PATCH 07/15] rht --- apps/server/src/tasks/init/init.service.ts | 5 ++--- config/nginx/entrypoint.sh | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/server/src/tasks/init/init.service.ts b/apps/server/src/tasks/init/init.service.ts index 8d6a955..3844ffb 100755 --- a/apps/server/src/tasks/init/init.service.ts +++ b/apps/server/src/tasks/init/init.service.ts @@ -41,12 +41,11 @@ export class InitService { const existingTaxonomies = await db.taxonomy.findMany(); const existingTaxonomyMap = new Map( - existingTaxonomies.map((taxonomy) => [taxonomy.name, taxonomy]), + existingTaxonomies.map((taxonomy) => [taxonomy.slug, taxonomy]), ); for (const [index, taxonomy] of InitTaxonomies.entries()) { - const existingTaxonomy = existingTaxonomyMap.get(taxonomy.name); - + const existingTaxonomy = existingTaxonomyMap.get(taxonomy.slug); if (!existingTaxonomy) { // Create new taxonomy await db.taxonomy.create({ diff --git a/config/nginx/entrypoint.sh b/config/nginx/entrypoint.sh index cb85633..9fa65b4 100755 --- a/config/nginx/entrypoint.sh +++ b/config/nginx/entrypoint.sh @@ -14,7 +14,7 @@ done # Check if the index.html file exists before processing if [ -f "/usr/share/nginx/html/index.html" ]; then # Use envsubst to replace environment variable placeholders - envsubst < /usr/share/nginx/html/index.html > /usr/share/nginx/html/index.html.tmp + envsubst < /usr/share/nginx/html/index.temp > /usr/share/nginx/html/index.html.tmp mv /usr/share/nginx/html/index.html.tmp /usr/share/nginx/html/index.html else echo "Info: /usr/share/nginx/html/index.html does not exist , skip replace env" From ab208201aa8213723b17125218bf6711685eb253 Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Wed, 5 Mar 2025 09:17:36 +0800 Subject: [PATCH 08/15] 202503050917 --- Dockerfile | 43 +- apps/web/index.html | 2 +- apps/web/src/providers/auth-provider.tsx | 3 + apps/web/src/utils/axios-client.ts | 1 + config/nginx/conf.d/web.conf | 4 +- config/nginx/entrypoint.sh | 5 +- docker-compose.example.yml | 243 ++- packages/client/src/api/hooks/useAppConfig.ts | 2 +- packages/common/package.json | 5 +- packages/tus/package.json | 2 +- packages/utils/package.json | 3 +- .../account-location-BCNgMMMw-BzoBAix2.js | 1 - web-dist/assets/add-DBGs_LmH-DpLM9lGv.js | 1 - .../admin-outlined-DXTGKZe5-CSnArnXa.js | 1 - web-dist/assets/airport-DmUdZQah-68aQ4GjS.js | 1 - .../assets/align-center-kIaj1t0E-DSHMqphX.js | 1 - .../assets/align-justify-DtkZpgWd-BQKEWNTl.js | 1 - .../assets/align-left-nz355YSx-D-lOXVaJ.js | 1 - .../assets/align-right-CuY2aKVp-B5IVFIpK.js | 1 - web-dist/assets/approve-C2CuyqjZ-BJC-OpBy.js | 1 - .../arrow-drop-down-C-Cm0O58-BQbfQyoC.js | 1 - .../assets/blocks-group-BnKCc4Rj-DtG3Oj_8.js | 1 - web-dist/assets/bold-C7Q6mc6R-W4qoDjlW.js | 1 - .../assets/caret-right-Buv6m22q-WQMBnvfk.js | 1 - .../category-outline-DFeZz2a4-CqJmdfxm.js | 1 - web-dist/assets/check-CwiFW30S-D5xY4LY6.js | 1 - .../assets/check-one-DZsEj4Rc-D5ek0kT8.js | 1 - web-dist/assets/config-HpgzD5LZ-CHZjFB5m.js | 1 - web-dist/assets/content-CVv2xHwr-Cko-e_iv.js | 1 - web-dist/assets/copy-CVj4__by-DSjUrowX.js | 1 - .../assets/cube-duotone-C5nZlt1x-DvU0aR3O.js | 1 - .../assets/date-time-C-XupEct-CJ91Fn1h.js | 1 - web-dist/assets/delete-B_03_u2H-B4iPfa6w.js | 1 - web-dist/assets/edit-Dt4jUBOK-lOkX0YCB.js | 1 - .../assets/error-duotone-C1DxTjTu-DAfaeZ3p.js | 1 - .../assets/error-outline-BtU6WRxh-DZbxbVEK.js | 1 - web-dist/assets/exit-BrT4707H-Kqn9ARZ4.js | 1 - web-dist/assets/filter-DjN42YHn-Db70LXPs.js | 1 - .../assets/fluent-person-CxE3zAkd-BXa47Cvo.js | 1 - web-dist/assets/get-text-BQOd1CsX-DUhw41GT.js | 1 - .../assets/group-work-CMKVD9ib-CqRoZfas.js | 1 - .../assets/health-circle-SAB-DqvX-BjjqKyAX.js | 1 - web-dist/assets/history-DwvuvWV7-Bcpk_weY.js | 1 - web-dist/assets/home-InqRf4oC-D2m0I5nB.js | 1 - .../horizontal-rule-DqqTWGF1-BpTivvNz.js | 1 - web-dist/assets/image-CnEjCzXp-z7MLBKjQ.js | 1 - web-dist/assets/inbox-CQ1akO08-CzpJlaLd.js | 1 - web-dist/assets/index-BL-ZztvJ.css | 7 - web-dist/assets/index-De5TXRhh.js | 1545 ----------------- web-dist/assets/italic-DMSQgFnS-DOEZCEZ1.js | 1 - web-dist/assets/link-KeHiWBJT-CuqIlkZm.js | 1 - web-dist/assets/link-off-DZAgsSxK-B6xMXQPC.js | 1 - web-dist/assets/list-Bs6u--UJ-eA9pjrj3.js | 1 - web-dist/assets/logout-B0mQe5Qi-DF17owpB.js | 1 - web-dist/assets/loop-dsNm_gaj-DkPa6i0D.js | 1 - web-dist/assets/more-DOWiYiPH-GRR8ysNy.js | 1 - web-dist/assets/note-Bqaccb7j-CtYQDrQt.js | 1 - .../assets/number-symbol--0U5ng1u-DX0-tc7o.js | 1 - web-dist/assets/org-ct1252nQ-BfTllgJB.js | 1 - .../assets/people-32-DWkG_AEs-B_1jrXMT.js | 1 - web-dist/assets/people-BlGM0esi-C_qKpv6V.js | 1 - .../assets/people-group-DAJyorhy-Dn2EYOeo.js | 1 - .../assets/people-plus-CaZDHm6f-B7a-LqC-.js | 1 - .../assets/person-board-CGwlcXCK-B9agoP0y.js | 1 - .../assets/person-hair-cux4Oez7-BVg-7YyY.js | 1 - .../assets/person-home-TVkRmIXv-BBpURoUQ.js | 1 - web-dist/assets/plane-CNSX_xPZ-B35Y6xpd.js | 1 - .../assets/plane-takeoff-D8MEJ99K-Cl_SEXXf.js | 1 - web-dist/assets/progress-xq5clHAn-CenFRX2W.js | 1 - .../assets/radar-chart-kqL_3xwo-DfBIfHEG.js | 1 - web-dist/assets/react-CwSRowEQ-QgYTcSqt.js | 1 - web-dist/assets/redo-BlWi9gwZ-CP18WXEp.js | 1 - .../assets/right-line-CZxB4z-S-C6nFMNve.js | 1 - .../assets/seal-check-Bzc_Rg44-8y04pjyN.js | 1 - web-dist/assets/search-D5rwXZnU-BmKuypdd.js | 1 - web-dist/assets/setting-BWVSKyb7-CGHVVIJN.js | 1 - web-dist/assets/share-DD20P1bR-CAqP37_K.js | 1 - web-dist/assets/strike-Db1W3LH4-B4uYXTO1.js | 1 - .../subject-rounded-RPHxzAM6-E3h55KVy.js | 1 - web-dist/assets/sum-CP8qw4zJ-C9b5UdlC.js | 1 - web-dist/assets/target-BQR-JIzR-DeRp7ACo.js | 1 - .../assets/text-indent-mVfgassO-DqLu7JTK.js | 1 - .../assets/text-outdent-CzeeK6rs-D_Idhyv0.js | 1 - web-dist/assets/time-8zVe6vD_-CO9arZM0.js | 1 - .../assets/underline-BAa1Ttlz-B1xR8ou1.js | 1 - web-dist/assets/undo-B5Chp__o-BHoJTHTM.js | 1 - web-dist/assets/user-id-Q2t8rpnY-DhvGaTDn.js | 1 - web-dist/assets/work-TRqMhsot-B18ZEvZr.js | 1 - web-dist/assets/zoomin-D7FfpJa4-CzlKcEgh.js | 1 - web-dist/assets/zoomout-CBVN6dw0-9Fcs0kz7.js | 1 - web-dist/index.html | 26 - web-dist/index_BACKUP.html | 27 - web-dist/logo.svg | 1 - web-dist/params.json | 2 - web-dist/placeholder.webp | Bin 1900 -> 0 bytes web-dist/vite.svg | 1 - 96 files changed, 134 insertions(+), 1865 deletions(-) delete mode 100644 web-dist/assets/account-location-BCNgMMMw-BzoBAix2.js delete mode 100644 web-dist/assets/add-DBGs_LmH-DpLM9lGv.js delete mode 100644 web-dist/assets/admin-outlined-DXTGKZe5-CSnArnXa.js delete mode 100644 web-dist/assets/airport-DmUdZQah-68aQ4GjS.js delete mode 100644 web-dist/assets/align-center-kIaj1t0E-DSHMqphX.js delete mode 100644 web-dist/assets/align-justify-DtkZpgWd-BQKEWNTl.js delete mode 100644 web-dist/assets/align-left-nz355YSx-D-lOXVaJ.js delete mode 100644 web-dist/assets/align-right-CuY2aKVp-B5IVFIpK.js delete mode 100644 web-dist/assets/approve-C2CuyqjZ-BJC-OpBy.js delete mode 100644 web-dist/assets/arrow-drop-down-C-Cm0O58-BQbfQyoC.js delete mode 100644 web-dist/assets/blocks-group-BnKCc4Rj-DtG3Oj_8.js delete mode 100644 web-dist/assets/bold-C7Q6mc6R-W4qoDjlW.js delete mode 100644 web-dist/assets/caret-right-Buv6m22q-WQMBnvfk.js delete mode 100644 web-dist/assets/category-outline-DFeZz2a4-CqJmdfxm.js delete mode 100644 web-dist/assets/check-CwiFW30S-D5xY4LY6.js delete mode 100644 web-dist/assets/check-one-DZsEj4Rc-D5ek0kT8.js delete mode 100644 web-dist/assets/config-HpgzD5LZ-CHZjFB5m.js delete mode 100644 web-dist/assets/content-CVv2xHwr-Cko-e_iv.js delete mode 100644 web-dist/assets/copy-CVj4__by-DSjUrowX.js delete mode 100644 web-dist/assets/cube-duotone-C5nZlt1x-DvU0aR3O.js delete mode 100644 web-dist/assets/date-time-C-XupEct-CJ91Fn1h.js delete mode 100644 web-dist/assets/delete-B_03_u2H-B4iPfa6w.js delete mode 100644 web-dist/assets/edit-Dt4jUBOK-lOkX0YCB.js delete mode 100644 web-dist/assets/error-duotone-C1DxTjTu-DAfaeZ3p.js delete mode 100644 web-dist/assets/error-outline-BtU6WRxh-DZbxbVEK.js delete mode 100644 web-dist/assets/exit-BrT4707H-Kqn9ARZ4.js delete mode 100644 web-dist/assets/filter-DjN42YHn-Db70LXPs.js delete mode 100644 web-dist/assets/fluent-person-CxE3zAkd-BXa47Cvo.js delete mode 100644 web-dist/assets/get-text-BQOd1CsX-DUhw41GT.js delete mode 100644 web-dist/assets/group-work-CMKVD9ib-CqRoZfas.js delete mode 100644 web-dist/assets/health-circle-SAB-DqvX-BjjqKyAX.js delete mode 100644 web-dist/assets/history-DwvuvWV7-Bcpk_weY.js delete mode 100644 web-dist/assets/home-InqRf4oC-D2m0I5nB.js delete mode 100644 web-dist/assets/horizontal-rule-DqqTWGF1-BpTivvNz.js delete mode 100644 web-dist/assets/image-CnEjCzXp-z7MLBKjQ.js delete mode 100644 web-dist/assets/inbox-CQ1akO08-CzpJlaLd.js delete mode 100644 web-dist/assets/index-BL-ZztvJ.css delete mode 100644 web-dist/assets/index-De5TXRhh.js delete mode 100644 web-dist/assets/italic-DMSQgFnS-DOEZCEZ1.js delete mode 100644 web-dist/assets/link-KeHiWBJT-CuqIlkZm.js delete mode 100644 web-dist/assets/link-off-DZAgsSxK-B6xMXQPC.js delete mode 100644 web-dist/assets/list-Bs6u--UJ-eA9pjrj3.js delete mode 100644 web-dist/assets/logout-B0mQe5Qi-DF17owpB.js delete mode 100644 web-dist/assets/loop-dsNm_gaj-DkPa6i0D.js delete mode 100644 web-dist/assets/more-DOWiYiPH-GRR8ysNy.js delete mode 100644 web-dist/assets/note-Bqaccb7j-CtYQDrQt.js delete mode 100644 web-dist/assets/number-symbol--0U5ng1u-DX0-tc7o.js delete mode 100644 web-dist/assets/org-ct1252nQ-BfTllgJB.js delete mode 100644 web-dist/assets/people-32-DWkG_AEs-B_1jrXMT.js delete mode 100644 web-dist/assets/people-BlGM0esi-C_qKpv6V.js delete mode 100644 web-dist/assets/people-group-DAJyorhy-Dn2EYOeo.js delete mode 100644 web-dist/assets/people-plus-CaZDHm6f-B7a-LqC-.js delete mode 100644 web-dist/assets/person-board-CGwlcXCK-B9agoP0y.js delete mode 100644 web-dist/assets/person-hair-cux4Oez7-BVg-7YyY.js delete mode 100644 web-dist/assets/person-home-TVkRmIXv-BBpURoUQ.js delete mode 100644 web-dist/assets/plane-CNSX_xPZ-B35Y6xpd.js delete mode 100644 web-dist/assets/plane-takeoff-D8MEJ99K-Cl_SEXXf.js delete mode 100644 web-dist/assets/progress-xq5clHAn-CenFRX2W.js delete mode 100644 web-dist/assets/radar-chart-kqL_3xwo-DfBIfHEG.js delete mode 100644 web-dist/assets/react-CwSRowEQ-QgYTcSqt.js delete mode 100644 web-dist/assets/redo-BlWi9gwZ-CP18WXEp.js delete mode 100644 web-dist/assets/right-line-CZxB4z-S-C6nFMNve.js delete mode 100644 web-dist/assets/seal-check-Bzc_Rg44-8y04pjyN.js delete mode 100644 web-dist/assets/search-D5rwXZnU-BmKuypdd.js delete mode 100644 web-dist/assets/setting-BWVSKyb7-CGHVVIJN.js delete mode 100644 web-dist/assets/share-DD20P1bR-CAqP37_K.js delete mode 100644 web-dist/assets/strike-Db1W3LH4-B4uYXTO1.js delete mode 100644 web-dist/assets/subject-rounded-RPHxzAM6-E3h55KVy.js delete mode 100644 web-dist/assets/sum-CP8qw4zJ-C9b5UdlC.js delete mode 100644 web-dist/assets/target-BQR-JIzR-DeRp7ACo.js delete mode 100644 web-dist/assets/text-indent-mVfgassO-DqLu7JTK.js delete mode 100644 web-dist/assets/text-outdent-CzeeK6rs-D_Idhyv0.js delete mode 100644 web-dist/assets/time-8zVe6vD_-CO9arZM0.js delete mode 100644 web-dist/assets/underline-BAa1Ttlz-B1xR8ou1.js delete mode 100644 web-dist/assets/undo-B5Chp__o-BHoJTHTM.js delete mode 100644 web-dist/assets/user-id-Q2t8rpnY-DhvGaTDn.js delete mode 100644 web-dist/assets/work-TRqMhsot-B18ZEvZr.js delete mode 100644 web-dist/assets/zoomin-D7FfpJa4-CzlKcEgh.js delete mode 100644 web-dist/assets/zoomout-CBVN6dw0-9Fcs0kz7.js delete mode 100644 web-dist/index.html delete mode 100644 web-dist/index_BACKUP.html delete mode 100755 web-dist/logo.svg delete mode 100755 web-dist/params.json delete mode 100644 web-dist/placeholder.webp delete mode 100755 web-dist/vite.svg diff --git a/Dockerfile b/Dockerfile index 3a9ff79..3d15a41 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,23 @@ # 基础镜像 FROM node:18.17-alpine as base -# 更改 apk 镜像源为阿里云 -# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories - -# 使用阿里云镜像源 + 完整仓库声明 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories -# 安装最新稳定版 PostgreSQL 客户端(15.11) -RUN apk update --no-cache && \ - apk add --no-cache \ - postgresql15-client \ - libpq \ - readline - - RUN apk add --no-cache ffmpeg - -# 设置 npm 镜像源 RUN yarn config set registry https://registry.npmmirror.com - -# 全局安装 pnpm 并设置其镜像源 RUN yarn global add pnpm && pnpm config set registry https://registry.npmmirror.com - -# 设置工作目录 WORKDIR /app - -# 复制 pnpm workspace 配置文件 COPY pnpm-workspace.yaml ./ - -# 首先复制 package.json, package-lock.json 和 pnpm-lock.yaml 文件 COPY package*.json pnpm-lock.yaml* ./ - COPY tsconfig.base.json . -# 利用 Docker 缓存机制,如果依赖没有改变则不会重新执行 pnpm install -#100-500 5-40 + FROM base As server-build WORKDIR /app -COPY packages/common /app/packages/common -COPY packages/tus /app/packages/tus -COPY apps/server /app/apps/server -RUN pnpm config set registry https://registry.npmmirror.com/ -RUN pnpm install --filter common -RUN pnpm install --filter tus -RUN pnpm install --filter server -RUN pnpm --filter common generate && pnpm --filter common build:cjs +COPY . . +RUN pnpm install +RUN pnpm --filter common build RUN pnpm --filter tus build +RUN pnpm --filter utils build RUN pnpm --filter server build FROM base As server-prod-dep @@ -55,6 +27,7 @@ COPY packages/tus /app/packages/tus COPY apps/server /app/apps/server RUN pnpm install --filter common --prod RUN pnpm install --filter tus --prod +RUN pnpm install --filter utils --prod RUN pnpm install --filter server --prod @@ -66,10 +39,8 @@ COPY --from=server-build /app/packages/common/dist ./packages/common/dist COPY --from=server-build /app/packages/tus/dist ./packages/tus/dist COPY --from=server-build /app/apps/server/dist ./apps/server/dist COPY apps/server/entrypoint.sh ./apps/server/entrypoint.sh - RUN chmod +x ./apps/server/entrypoint.sh -RUN apk add --no-cache postgresql-client - +RUN apk add --no-cache ffmpeg EXPOSE 3000 diff --git a/apps/web/index.html b/apps/web/index.html index 31078c2..4af329b 100755 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -8,7 +8,7 @@ - test - - - - - -
- - - \ No newline at end of file diff --git a/web-dist/index_BACKUP.html b/web-dist/index_BACKUP.html deleted file mode 100644 index fa1c56f..0000000 --- a/web-dist/index_BACKUP.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - fhmooc - - - - - -
- - diff --git a/web-dist/logo.svg b/web-dist/logo.svg deleted file mode 100755 index 39a6980..0000000 --- a/web-dist/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web-dist/params.json b/web-dist/params.json deleted file mode 100755 index 7a73a41..0000000 --- a/web-dist/params.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/web-dist/placeholder.webp b/web-dist/placeholder.webp deleted file mode 100644 index 1f474a5eae6104fb2afe57410c2a51245b548765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmWIYbaP8#XJ80-bqWXzuuzBqvJH9|<}zxvFn?sUGnD9XQBv%fvP6KfDJpuuyjuAr z!2?t8GXB3^z2r4p!rcY2DX#=S$H#q}yXTZc(=5TeftR{6+)LfPG#AQVmDO0*QXW#W zXqXBYFUy(v?t{{WV+q38JSwqU1L5 z$$FJlpfAU}6)#;)ly@z3b?e)yxP0O}hBAQ#Z$5j5x$fB-@%*6AHCJoy?&USIxe-UN zbX$pG2B^f6Q}JPWsk5C$rL}4@_Z;Y49{79C#Lo`$)v6AszTL@lfA=pEJzChhBa)JK zUguvPIU(YU)f)Q@ul5&z&jo(`9lJv`eMetbmY5S-q;bt&sn8*%));>3Cd-7#-}~!- zD6G66HhJP6ufN41CINvpoWDW7SiDr^Lf@;tDZw_E1Vze47`S$Ze%5u(zZzDmFf+`6 zyIko;>n@T+wMoRu2pe(SuhVZcFJ-t$BR2t-nDp(&s%%hHF3hbKMIm&Qkrpgg`ejfeG7F7JeXe?&Her%XZgLE ztBS(s#P7;tIy|5ISYQ0d-BGhzC!nQNx2Mz0|B0{7OyUs~JaLzK(IFP!y8b&)uI1KD z3G3q0Z?w-q(O}VZj^py5JncUf2`<-xAsKN*W|~U0>b##^7$$?W#*MNmXweV%7Tmeu zR57fD9T^z@{eQiZ0U0prB${kd^Y2V%m3Na8T3kIZt@>kFc#!|WC0rZV*Uw1tTV?A1 z;O%s2#U!2D>wce(l^4J3y;|`y%=fkWE`#YSExX$rmfmC9H20^dkJy2;jTNUSc{?Np z-V>I)$my|a!hxKN55Y!~dUk;_SqAe!)lnsfl_Dr|!S<_WH{e$;(Sh*v!+;ocyEsh9{Es*@4qb z4_r2H-6n5t&fz|Pr}bnf&I1z4hwQg}=P+EvH?e8TG(+A8kFGFs-+1<6agmB|=lGgS6um!9f7v3qeU03q7o3kzo^9h;`|^+5>O&8?)3X~C9b-hTIleII zJ>JdOGxwKns$pquZ+=SFJG0*NCxzxMI(#+s=J$)&e>$9XKDS%#n8%ShCpI_dJ#6Sd z^!`dbokXh+?; zlDmIeA6@%4{o<0xpQSsi?@xZidccvD@$U0mZf~>#aux;Je)rnBw??GMQeTWw`>(~1 wYQw1>9MY*hLPxlMDkUdymYtitbia3SlgWOoM@|`QlU&#)#~c(uPSj8~0FUs1WB>pF diff --git a/web-dist/vite.svg b/web-dist/vite.svg deleted file mode 100755 index 78260dd..0000000 --- a/web-dist/vite.svg +++ /dev/null @@ -1 +0,0 @@ - From 7d21f45eca10574669c3998128b51613fdd315f6 Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Wed, 5 Mar 2025 09:37:45 +0800 Subject: [PATCH 09/15] rht --- apps/server/src/tasks/init/init.service.ts | 4 ++-- apps/web/src/components/common/editor/MindEditor.tsx | 2 +- config/nginx/conf.d/web.conf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/server/src/tasks/init/init.service.ts b/apps/server/src/tasks/init/init.service.ts index 3844ffb..b4f94b1 100755 --- a/apps/server/src/tasks/init/init.service.ts +++ b/apps/server/src/tasks/init/init.service.ts @@ -55,12 +55,12 @@ export class InitService { }, }); this.logger.log(`Created new taxonomy: ${taxonomy.name}`); - } else { + } else if(process.env.NODE_ENV === 'development'){ // Check for differences and update if necessary const differences = Object.keys(taxonomy).filter( (key) => taxonomy[key] !== existingTaxonomy[key], ); - + if (differences.length > 0) { await db.taxonomy.update({ where: { id: existingTaxonomy.id }, diff --git a/apps/web/src/components/common/editor/MindEditor.tsx b/apps/web/src/components/common/editor/MindEditor.tsx index 08803c7..e9a20b2 100755 --- a/apps/web/src/components/common/editor/MindEditor.tsx +++ b/apps/web/src/components/common/editor/MindEditor.tsx @@ -214,7 +214,7 @@ export default function MindEditor({ id }: { id?: string }) { multiple /> - {id ? : <>} + {post && id ? : <>}
{canEdit && ( diff --git a/config/nginx/conf.d/web.conf b/config/nginx/conf.d/web.conf index 67302b8..2c6260a 100755 --- a/config/nginx/conf.d/web.conf +++ b/config/nginx/conf.d/web.conf @@ -100,7 +100,7 @@ server { # 仅供内部使用 internal; # 代理到认证服务 - proxy_pass http://host.docker.internal:3000/auth/file; + proxy_pass http://host.docker.internal:3001/auth/file; # 请求优化:不传递请求体 proxy_pass_request_body off; From d50d826c0740f807122bc5f981dad12420aebd46 Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Wed, 5 Mar 2025 09:40:05 +0800 Subject: [PATCH 10/15] 03050940 --- apps/web/.env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/.env.example b/apps/web/.env.example index 4d30872..826fc8f 100755 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1,4 +1,4 @@ -VITE_APP_SERVER_IP=192.168.252.239 +VITE_APP_SERVER_IP=localhost VITE_APP_SERVER_PORT=3000 VITE_APP_FILE_PORT=80 VITE_APP_VERSION=0.3.0 From 1c080304e4f76aa987aa102a83559d78fc31b5b6 Mon Sep 17 00:00:00 2001 From: Rao <1227431568@qq.com> Date: Wed, 5 Mar 2025 16:50:47 +0800 Subject: [PATCH 11/15] rht --- .../components/common/editor/MindEditor.tsx | 21 ++++++++++++++----- .../course/detail/CourseDetailDisplayArea.tsx | 2 +- .../models/post/PostSelect/PostSelect.tsx | 1 + .../video-player/VideoDisplay.tsx | 9 +++++++- apps/web/src/routes/index.tsx | 4 +--- config/nginx/conf.d/web.conf | 4 ++-- config/nginx/entrypoint.sh | 2 +- 7 files changed, 30 insertions(+), 13 deletions(-) diff --git a/apps/web/src/components/common/editor/MindEditor.tsx b/apps/web/src/components/common/editor/MindEditor.tsx index e9a20b2..13d7cb1 100755 --- a/apps/web/src/components/common/editor/MindEditor.tsx +++ b/apps/web/src/components/common/editor/MindEditor.tsx @@ -20,9 +20,11 @@ import { useTusUpload } from "@web/src/hooks/useTusUpload"; import { useNavigate } from "react-router-dom"; import { useAuth } from "@web/src/providers/auth-provider"; import { MIND_OPTIONS } from "./constant"; -import { SaveOutlined } from "@ant-design/icons"; +import { GlobalOutlined, SaveOutlined } from "@ant-design/icons"; import JoinButton from "../../models/course/detail/CourseOperationBtns/JoinButton"; import { CourseDetailContext } from "../../models/course/detail/PostDetailContext"; +import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; export default function MindEditor({ id }: { id?: string }) { const containerRef = useRef(null); const { @@ -57,6 +59,17 @@ export default function MindEditor({ id }: { id?: string }) { }); const { handleFileUpload } = useTusUpload(); const [form] = Form.useForm(); + const CustomLinkIconPlugin = (mind) => { + mind.bus.addListener('operation', async () => { + const hyperLinkElement = await document.querySelectorAll('.hyper-link'); + console.log('hyperLinkElement', hyperLinkElement); + hyperLinkElement.forEach((item) => { + const hyperLinkDom = createRoot(item) + hyperLinkDom.render() + }); + + }); + }; useEffect(() => { if (post?.id && id) { read.mutateAsync({ @@ -98,6 +111,7 @@ export default function MindEditor({ id }: { id?: string }) { nodeMenu: canEdit, // 禁用节点右键菜单 keypress: canEdit, // 禁用键盘快捷键 }); + mind.install(CustomLinkIconPlugin); mind.init(MindElixir.new("新思维导图")); containerRef.current.hidden = true; //挂载实例 @@ -173,16 +187,13 @@ export default function MindEditor({ id }: { id?: string }) { } console.log(result); }, - (error) => {}, + (error) => { }, `mind-thumb-${new Date().toString()}` ); }; useEffect(() => { containerRef.current.style.height = `${Math.floor(window.innerHeight - 271)}px`; }, []); - useEffect(()=>{ - console.log(canEdit,user?.id,post?.author?.id) - }) return (
{taxonomies && ( diff --git a/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx b/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx index f95c29d..d24f7e6 100755 --- a/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx +++ b/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx @@ -40,7 +40,7 @@ export const CourseDetailDisplayArea: React.FC = () => { opacity: videoOpacity, }} className="w-full bg-black rounded-lg "> -
+
diff --git a/apps/web/src/components/models/post/PostSelect/PostSelect.tsx b/apps/web/src/components/models/post/PostSelect/PostSelect.tsx index 63f4058..f97d148 100644 --- a/apps/web/src/components/models/post/PostSelect/PostSelect.tsx +++ b/apps/web/src/components/models/post/PostSelect/PostSelect.tsx @@ -91,6 +91,7 @@ export default function PostSelect({ dropdownStyle={{ minWidth: 200, // 设置合适的最小宽度 }} + autoClearSearchValue placeholder={placeholder} onChange={onChange} filterOption={false} diff --git a/apps/web/src/components/presentation/video-player/VideoDisplay.tsx b/apps/web/src/components/presentation/video-player/VideoDisplay.tsx index 32b1109..976495b 100755 --- a/apps/web/src/components/presentation/video-player/VideoDisplay.tsx +++ b/apps/web/src/components/presentation/video-player/VideoDisplay.tsx @@ -191,8 +191,15 @@ export const VideoDisplay: React.FC = ({ }; }, [src, onError, autoPlay]); + const handleVideoClick = () => { + if (videoRef.current) { + videoRef.current.pause(); + setIsPlaying(false); + } + }; + return ( -
+