Skip to content

Commit b33e94d

Browse files
authored
feat(studio): add refresh data button (#28)
1 parent b35fdd6 commit b33e94d

File tree

12 files changed

+70
-18
lines changed

12 files changed

+70
-18
lines changed

.changeset/thin-carrots-cover.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"pinorama-studio": patch
3+
---
4+
5+
add refresh data button

packages/pinorama-client/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
}
2222
},
2323
"types": "./dist/types/pinorama-client.d.ts",
24-
"files": [
25-
"dist"
26-
],
24+
"files": ["dist"],
2725
"scripts": {
2826
"clean": "rimraf dist node_modules",
2927
"build": "rollup --config"

packages/pinorama-server/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
"type": "module",
66
"types": "./dist/index.d.mts",
77
"exports": "./dist/index.mjs",
8-
"files": [
9-
"dist"
10-
],
8+
"files": ["dist"],
119
"scripts": {
1210
"clean": "rimraf dist node_modules",
1311
"build": "tsc"

packages/pinorama-studio/package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
"bin": {
77
"pinorama": "./cli.mjs"
88
},
9-
"files": [
10-
"dist",
11-
"cli.mjs"
12-
],
9+
"files": ["dist", "cli.mjs"],
1310
"scripts": {
1411
"dev": "vite",
1512
"build": "tsc && vite build",

packages/pinorama-studio/src/features/log-explorer/components/log-viewer/components/header/header.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ import { ToggleFiltersButton } from "./toggle-filters-button"
66
import { ToggleLiveButton } from "./toggle-live-button"
77

88
import type { Table } from "@tanstack/react-table"
9+
import { RefreshDataButton } from "./refresh-data-button"
910

1011
type LogViewerHeaderProps = {
1112
table: Table<unknown>
1213
searchText: string
1314
showClearFiltersButton: boolean
1415
liveMode: boolean
16+
isLoading: boolean
1517
onSearchTextChange: (text: string) => void
1618
onToggleFiltersButtonClick: () => void
1719
onClearFiltersButtonClick: () => void
1820
onToggleLiveButtonClick: (live: boolean) => void
21+
onRefreshButtonClick: () => void
1922
}
2023

2124
export function LogViewerHeader(props: LogViewerHeaderProps) {
@@ -35,6 +38,10 @@ export function LogViewerHeader(props: LogViewerHeaderProps) {
3538
pressed={props.liveMode}
3639
onPressedChange={props.onToggleLiveButtonClick}
3740
/>
41+
<RefreshDataButton
42+
onClick={props.onRefreshButtonClick}
43+
loading={props.isLoading}
44+
/>
3845
{props.showClearFiltersButton ? (
3946
<ClearFiltersButton onClick={props.onClearFiltersButtonClick} />
4047
) : null}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Button } from "@/components/ui/button"
2+
import {
3+
Tooltip,
4+
TooltipContent,
5+
TooltipPortal,
6+
TooltipTrigger
7+
} from "@/components/ui/tooltip"
8+
import { cn } from "@/lib/utils"
9+
import { LoaderIcon, RefreshCwIcon } from "lucide-react"
10+
import { useIntl } from "react-intl"
11+
12+
type RefreshDataButtonProps = {
13+
onClick: () => void
14+
loading?: boolean
15+
}
16+
17+
export function RefreshDataButton(props: RefreshDataButtonProps) {
18+
const intl = useIntl()
19+
const label = intl.formatMessage({ id: "logExplorer.refreshData" })
20+
21+
const Icon = props.loading ? LoaderIcon : RefreshCwIcon
22+
23+
return (
24+
<Tooltip>
25+
<TooltipTrigger asChild>
26+
<Button
27+
aria-label={label}
28+
variant="outline2"
29+
className="px-2.5"
30+
onClick={props.onClick}
31+
disabled={props.loading}
32+
>
33+
<Icon
34+
className={cn("h-[18px] w-[18px]", props.loading && "animate-spin")}
35+
/>
36+
</Button>
37+
</TooltipTrigger>
38+
<TooltipPortal>
39+
<TooltipContent>{label}</TooltipContent>
40+
</TooltipPortal>
41+
</Tooltip>
42+
)
43+
}

packages/pinorama-studio/src/features/log-explorer/components/log-viewer/hooks/use-live-logs.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const useLiveLogs = (
3939
getNextPageParam: (lastPage) => lastPage.nextCursor,
4040
staleTime: Number.POSITIVE_INFINITY,
4141
// refetchInterval: POLL_DELAY, // NOTE: This is not working as expected, it doesn't use the nextCursor
42-
enabled: false // NOTE: We will manually poll the data
42+
enabled: false
4343
})
4444

4545
const schedulePoll = useCallback(() => {
@@ -48,18 +48,20 @@ export const useLiveLogs = (
4848
query.fetchNextPage().finally(schedulePoll)
4949
}, POLL_DELAY)
5050
}
51-
}, [enabled, query])
51+
}, [enabled, query.fetchNextPage])
5252

5353
useEffect(() => {
5454
if (enabled) {
55-
schedulePoll()
55+
query.fetchNextPage().finally(() => {
56+
schedulePoll()
57+
})
5658
}
5759
return () => {
5860
if (timeoutRef.current) {
5961
clearTimeout(timeoutRef.current)
6062
}
6163
}
62-
}, [enabled, schedulePoll])
64+
}, [enabled, query.fetchNextPage, schedulePoll])
6365

6466
const flattenedData = useMemo(() => {
6567
return query.data?.pages.flatMap((page) => page.data) ?? []

packages/pinorama-studio/src/features/log-explorer/components/log-viewer/hooks/use-static-logs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const useStaticLogs = (
1414
return useQuery({
1515
queryKey: ["static-logs", searchText, searchFilters],
1616
queryFn: async ({ signal }) => {
17-
await new Promise((resolve) => setTimeout(resolve, 1000))
17+
await new Promise((resolve) => setTimeout(resolve, 300))
1818
if (signal.aborted) return
1919

2020
const payload = buildPayload(searchText, searchFilters)

packages/pinorama-studio/src/features/log-explorer/components/log-viewer/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,12 @@ export function LogViewer(props: LogViewerProps) {
126126
searchText={props.searchText}
127127
liveMode={props.liveMode}
128128
showClearFiltersButton={hasFilters}
129+
isLoading={logsQuery.isFetching}
129130
onSearchTextChange={props.onSearchTextChange}
130131
onToggleFiltersButtonClick={props.onToggleFiltersButtonClick}
131132
onToggleLiveButtonClick={props.onToggleLiveButtonClick}
132133
onClearFiltersButtonClick={props.onClearFiltersButtonClick}
134+
onRefreshButtonClick={logsQuery.refetch}
133135
/>
134136

135137
<div

packages/pinorama-studio/src/features/log-explorer/messages/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"logExplorer.noLogsFound": "No logs found. Please check filters.",
44
"logExplorer.showOrHideFilters": "Show or hide filters",
55
"logExplorer.liveMode": "Live Mode",
6+
"logExplorer.refreshData": "Refresh Data",
67
"logExplorer.clearFilters": "Clear search text and filters",
78
"logExplorer.columns": "Columns",
89
"logExplorer.columnsVisibility": "Columns visibility",

packages/pinorama-studio/src/features/log-explorer/messages/it.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"logExplorer.noLogsFound": "Nessun log trovato. Si prega di controllare i filtri.",
44
"logExplorer.showOrHideFilters": "Mostra o nascondi filtri",
55
"logExplorer.liveMode": "Modalità Live",
6+
"logExplorer.refreshData": "Aggiorna Dati",
67
"logExplorer.clearFilters": "Cancella testo di ricerca e filtri",
78
"logExplorer.columns": "Colonne",
89
"logExplorer.columnsVisibility": "Visibilità delle colonne",

packages/pinorama-transport/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
"bin": {
99
"pino-pinorama": "./dist/cli.mjs"
1010
},
11-
"files": [
12-
"dist"
13-
],
11+
"files": ["dist"],
1412
"scripts": {
1513
"test": "vitest run",
1614
"test:watch": "vitest",

0 commit comments

Comments
 (0)