Skip to content

Commit ded46dc

Browse files
feat: implment find in folder
fix #186
1 parent 7ddc41f commit ded46dc

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ export type Definition = {
5050
id: number
5151
error: Error
5252
}
53+
setIncludeFile: {
54+
includeFile: string
55+
}
5356
}
5457
child2parent: {
5558
search: SearchQuery & {

src/view.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,9 @@ function openFile({
177177
})
178178
}
179179

180-
function setupParentPort(webviewView: vscode.WebviewView) {
181-
const parentPort: ParentPort = new Unport()
180+
const parentPort: ParentPort = new Unport()
182181

182+
function setupParentPort(webviewView: vscode.WebviewView) {
183183
parentPort.implementChannel({
184184
async send(message) {
185185
webviewView.webview.postMessage(message)
@@ -298,5 +298,8 @@ export function findInFolder(data: any) {
298298
window.showErrorMessage('ast-grep Error: folder is not in the workspace')
299299
return
300300
}
301-
window.showInformationMessage('ast-grep: searching in ' + relative)
301+
vscode.commands.executeCommand('ast-grep.search.input.focus')
302+
parentPort.postMessage('setIncludeFile', {
303+
includeFile: relative
304+
})
302305
}

src/webview/SearchSidebar/SearchWidgetContainer/comps/SearchOptions.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { CSSProperties } from 'react'
22
import { VscEllipsis } from 'react-icons/vsc'
3-
import { useBoolean } from 'react-use'
43
import IncludeFile from './IncludeFile'
54

65
const buttonStyle: CSSProperties = {
@@ -29,14 +28,17 @@ interface SearchOptionsProps {
2928
includeFile: string
3029
setIncludeFile: (value: string) => void
3130
refreshResult: () => void
31+
showOptions: boolean
32+
toggleOptions: () => void
3233
}
3334

3435
export default function SearchOptions({
3536
includeFile,
3637
setIncludeFile,
37-
refreshResult
38+
refreshResult,
39+
showOptions,
40+
toggleOptions
3841
}: SearchOptionsProps) {
39-
const [showOptions, toggleOptions] = useBoolean(false)
4042
return (
4143
<div style={optionsStyle}>
4244
<button style={buttonStyle} onClick={toggleOptions}>
@@ -49,7 +51,7 @@ export default function SearchOptions({
4951
setIncludeFile={setIncludeFile}
5052
refreshResult={refreshResult}
5153
/>
52-
{/* TODO: add file include*/}
54+
{/* TODO: add file exclude*/}
5355
</div>
5456
)}
5557
</div>

src/webview/SearchSidebar/SearchWidgetContainer/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const SearchWidgetContainer = ({ onQueryChange }: Props) => {
1212
setInputValue,
1313
includeFile,
1414
setIncludeFile,
15+
showOptions,
16+
toggleOptions,
1517
refreshResult
1618
} = useSearchQuery(onQueryChange)
1719

@@ -26,6 +28,8 @@ const SearchWidgetContainer = ({ onQueryChange }: Props) => {
2628
includeFile={includeFile}
2729
setIncludeFile={setIncludeFile}
2830
refreshResult={refreshResult}
31+
showOptions={showOptions}
32+
toggleOptions={toggleOptions}
2933
/>
3034
</div>
3135
)

src/webview/hooks/useQuery.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { useCallback } from 'react'
2-
import { useLocalStorage } from 'react-use'
3-
import { useDebounce } from 'react-use'
1+
import { useCallback, useEffect } from 'react'
2+
import { useLocalStorage, useDebounce, useBoolean } from 'react-use'
43
import { SearchQuery } from '../../types'
4+
import { childPort } from '../postMessage'
55
export { SearchQuery }
66

77
export function useSearchQuery(startSearch: (query: SearchQuery) => void) {
@@ -13,13 +13,21 @@ export function useSearchQuery(startSearch: (query: SearchQuery) => void) {
1313
'ast-grep-search-panel-include-value',
1414
''
1515
)
16+
const [showOptions, toggleOptions] = useBoolean(Boolean(includeFile))
1617
const refreshResult = useCallback(() => {
1718
startSearch({
1819
inputValue,
1920
includeFile
2021
})
2122
}, [inputValue, includeFile, startSearch])
2223

24+
useEffect(() => {
25+
childPort.onMessage('setIncludeFile', val => {
26+
setIncludeFile(val.includeFile)
27+
toggleOptions(true)
28+
})
29+
}, [])
30+
2331
// auto refresh result when input value changes
2432
useDebounce(refreshResult, 100, [inputValue, includeFile])
2533

@@ -28,6 +36,8 @@ export function useSearchQuery(startSearch: (query: SearchQuery) => void) {
2836
setInputValue,
2937
includeFile,
3038
setIncludeFile,
31-
refreshResult
39+
refreshResult,
40+
showOptions,
41+
toggleOptions
3242
}
3343
}

0 commit comments

Comments
 (0)