Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
2a08f723
提交
2a08f723
authored
4月 23, 2025
作者:
Will Chen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support dyad add integration flow
上级
4294ce57
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
93 行增加
和
3 行删除
+93
-3
DyadAddIntegration.tsx
src/components/chat/DyadAddIntegration.tsx
+73
-0
DyadMarkdownParser.tsx
src/components/chat/DyadMarkdownParser.tsx
+16
-0
app-details.tsx
src/pages/app-details.tsx
+4
-3
没有找到文件。
src/components/chat/DyadAddIntegration.tsx
0 → 100644
浏览文件 @
2a08f723
import
React
from
"react"
;
import
{
useNavigate
}
from
"@tanstack/react-router"
;
import
{
Button
}
from
"@/components/ui/button"
;
import
{
selectedAppIdAtom
}
from
"@/atoms/appAtoms"
;
import
{
useAtomValue
,
atom
,
useAtom
}
from
"jotai"
;
import
{
showError
}
from
"@/lib/toast"
;
import
{
useStreamChat
}
from
"@/hooks/useStreamChat"
;
import
{
selectedChatIdAtom
}
from
"@/atoms/chatAtoms"
;
interface
DyadAddIntegrationProps
{
node
:
{
properties
:
{
provider
:
string
;
};
};
children
:
React
.
ReactNode
;
}
const
isSetupAtom
=
atom
(
false
);
export
const
DyadAddIntegration
:
React
.
FC
<
DyadAddIntegrationProps
>
=
({
node
,
children
,
})
=>
{
const
{
streamMessage
}
=
useStreamChat
();
const
[
isSetup
,
setIsSetup
]
=
useAtom
(
isSetupAtom
);
const
navigate
=
useNavigate
();
const
{
provider
}
=
node
.
properties
;
const
appId
=
useAtomValue
(
selectedAppIdAtom
);
const
selectedChatId
=
useAtomValue
(
selectedChatIdAtom
);
const
handleSetupClick
=
()
=>
{
if
(
!
appId
)
{
showError
(
"No app ID found"
);
return
;
}
navigate
({
to
:
"/app-details"
,
search
:
{
appId
}
});
setIsSetup
(
true
);
};
if
(
isSetup
)
{
return
(
<
Button
onClick=
{
()
=>
{
setIsSetup
(
false
);
if
(
!
selectedChatId
)
{
showError
(
"No chat ID found"
);
return
;
}
streamMessage
({
prompt
:
"OK, I've setup Supabase. Continue"
,
chatId
:
selectedChatId
,
});
}
}
className=
"my-1"
>
Continue | I've setup
{
provider
}
</
Button
>
);
}
return
(
<
div
className=
"flex flex-col gap-2 my-2 p-3 border rounded-md bg-secondary/10"
>
<
div
className=
"text-sm"
>
<
div
className=
"font-medium"
>
Integrate with
{
provider
}
?
</
div
>
<
div
className=
"text-muted-foreground text-xs"
>
{
children
}
</
div
>
</
div
>
<
Button
onClick=
{
handleSetupClick
}
className=
"self-start w-full"
>
Set up
{
provider
}
</
Button
>
</
div
>
);
};
src/components/chat/DyadMarkdownParser.tsx
浏览文件 @
2a08f723
...
...
@@ -6,6 +6,7 @@ import { DyadRename } from "./DyadRename";
import
{
DyadDelete
}
from
"./DyadDelete"
;
import
{
DyadAddDependency
}
from
"./DyadAddDependency"
;
import
{
DyadExecuteSql
}
from
"./DyadExecuteSql"
;
import
{
DyadAddIntegration
}
from
"./DyadAddIntegration"
;
import
{
CodeHighlight
}
from
"./CodeHighlight"
;
import
{
useAtomValue
}
from
"jotai"
;
import
{
isStreamingAtom
}
from
"@/atoms/chatAtoms"
;
...
...
@@ -75,6 +76,7 @@ function preprocessUnclosedTags(content: string): {
"dyad-delete"
,
"dyad-add-dependency"
,
"dyad-execute-sql"
,
"dyad-add-integration"
,
];
let
processedContent
=
content
;
...
...
@@ -134,6 +136,7 @@ function parseCustomTags(content: string): ContentPiece[] {
"dyad-delete"
,
"dyad-add-dependency"
,
"dyad-execute-sql"
,
"dyad-add-integration"
,
];
const
tagPattern
=
new
RegExp
(
...
...
@@ -287,6 +290,19 @@ function renderCustomTag(
</
DyadExecuteSql
>
);
case
"dyad-add-integration"
:
return
(
<
DyadAddIntegration
node=
{
{
properties
:
{
provider
:
attributes
.
provider
||
""
,
},
}
}
>
{
content
}
</
DyadAddIntegration
>
);
default
:
return
null
;
}
...
...
src/pages/app-details.tsx
浏览文件 @
2a08f723
import
{
useNavigate
,
useSearch
}
from
"@tanstack/react-router"
;
import
{
useNavigate
,
use
Router
,
use
Search
}
from
"@tanstack/react-router"
;
import
{
useAtom
,
useAtomValue
}
from
"jotai"
;
import
{
appBasePathAtom
,
appsListAtom
}
from
"@/atoms/appAtoms"
;
import
{
IpcClient
}
from
"@/ipc/ipc_client"
;
...
...
@@ -32,6 +32,7 @@ import { SupabaseConnector } from "@/components/SupabaseConnector";
export
default
function
AppDetailsPage
()
{
const
navigate
=
useNavigate
();
const
router
=
useRouter
();
const
search
=
useSearch
({
from
:
"/app-details"
as
const
});
const
[
appsList
]
=
useAtom
(
appsListAtom
);
const
{
refreshApps
}
=
useLoadApps
();
...
...
@@ -142,7 +143,7 @@ export default function AppDetailsPage() {
return
(
<
div
className=
"relative min-h-screen p-8"
>
<
Button
onClick=
{
()
=>
navigate
({
to
:
"/"
,
search
:
{}
}
)
}
onClick=
{
()
=>
router
.
history
.
back
(
)
}
variant=
"outline"
size=
"sm"
className=
"absolute top-4 left-4 flex items-center gap-2 bg-(--background-lightest) py-5"
...
...
@@ -160,7 +161,7 @@ export default function AppDetailsPage() {
return
(
<
div
className=
"relative min-h-screen p-8 w-full"
>
<
Button
onClick=
{
()
=>
navigate
({
to
:
"/"
,
search
:
{}
}
)
}
onClick=
{
()
=>
router
.
history
.
back
(
)
}
variant=
"outline"
size=
"sm"
className=
"absolute top-4 left-4 flex items-center gap-2 bg-(--background-lightest) py-5"
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论