Skip to content

Commit 7f64c9a

Browse files
committed
Fix ClientContext
1 parent e8e83c9 commit 7f64c9a

File tree

5 files changed

+33
-12
lines changed

5 files changed

+33
-12
lines changed

src/components/AutoQueryGrid.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { a, grid } from './css'
88
import { asOptions, asStrings, copyText, getTypeName, parseJson, pushState, uniqueIgnoreCase } from '@/use/utils'
99
import { canAccess, useAuth } from '@/use/auth'
1010
import { Sole } from '@/use/config'
11+
import { ClientContext } from '@/use/context'
1112
import EnsureAccess from './EnsureAccess'
1213
import EnsureAccessDialog from './EnsureAccessDialog'
1314
import FilterColumn from './grids/FilterColumn'
@@ -44,13 +45,15 @@ export interface AutoQueryGridRef {
4445
total: number
4546
}
4647

47-
interface AutoQueryGridComponentProps extends AutoQueryGridProps {
48-
// Event handlers
48+
// Event handlers and callbacks
49+
interface AutoQueryGridCallbacks {
4950
onHeaderSelected?: (name: string, e: React.MouseEvent) => void
5051
onRowSelected?: (item: any, ev: React.MouseEvent) => void
5152
onNav?: (args: any) => void
53+
}
5254

53-
// Slot/children props
55+
// Slot/children props
56+
interface AutoQueryGridSlots {
5457
children?: ReactNode
5558
toolbar?: ReactNode
5659
toolbarButtons?: (props: { toolbarButtonClass: string }) => ReactNode
@@ -95,8 +98,8 @@ interface AutoQueryGridComponentProps extends AutoQueryGridProps {
9598
headerSlots?: Record<string, (props: any) => ReactNode>
9699
}
97100

98-
// Context for the client
99-
const ClientContext = React.createContext<JsonServiceClient | null>(null)
101+
// Combined props for internal use
102+
type AutoQueryGridComponentProps = AutoQueryGridProps & AutoQueryGridCallbacks & AutoQueryGridSlots
100103

101104
export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponentProps>((props, ref) => {
102105
const {
@@ -1075,6 +1078,3 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
10751078
AutoQueryGrid.displayName = 'AutoQueryGrid'
10761079

10771080
export default AutoQueryGrid
1078-
1079-
// Export context for use by parent components
1080-
export { ClientContext }

src/demo/App.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,22 @@ import ModalDialog from '../components/ModalDialog'
1313
import SlideOver from '../components/SlideOver'
1414
import DataGrid from '../components/DataGrid'
1515
import AutoForm from '../components/AutoForm'
16+
import AutoQueryGrid from '../components/AutoQueryGrid'
17+
// In production, import from '@servicestack/react':
18+
// import { AutoQueryGrid, ClientContext } from '@servicestack/react'
19+
import { ClientContext } from '../use/context'
1620
import { tracks, RoomType } from './data'
17-
import { ApiResult, EmptyResponse, IReturn, ResponseStatus } from '@servicestack/client'
21+
import { ApiResult, EmptyResponse, IReturn, ResponseStatus, JsonServiceClient } from '@servicestack/client'
1822
import { setMetadata } from '../use/metadata'
1923
import { Sole } from '../use/config'
2024
import metadataJson from './metadata.json'
2125
import PrimaryButton from '../components/PrimaryButton'
2226

2327
setMetadata(metadataJson)
2428

29+
// Create a JsonServiceClient instance for AutoQueryGrid
30+
const client = new JsonServiceClient('https://blazor-gallery.jamstacks.net')
31+
2532
class Forecast {
2633
public date?: string;
2734
public temperatureC?: number;
@@ -147,6 +154,7 @@ export default function App() {
147154

148155
return (
149156
<>
157+
<ClientContext.Provider value={client}>
150158
<div className="absolute top-2 right-2">
151159
<DarkModeToggle />
152160
</div>
@@ -404,7 +412,6 @@ export default function App() {
404412
{/* Contextual Validation Test Section */}
405413
<div className="max-w-4xl mx-auto p-8">
406414
<h2 className="text-2xl font-bold mb-6">AutoForm Contextual Validation Test</h2>
407-
<div className="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
408415
<p className="mb-4 text-gray-600 dark:text-gray-400">
409416
This form demonstrates contextual validation. When you submit, it will return field-specific errors
410417
that are automatically displayed on the corresponding inputs via ApiStateContext.
@@ -449,8 +456,19 @@ export default function App() {
449456
: new ApiResult({ response: new EmptyResponse() })
450457
}}
451458
/>
459+
</div>
460+
461+
{/* AutoQuery Bookings Test */}
462+
<div className="max-w-4xl mx-auto p-8">
463+
<h2 className="text-2xl font-bold mb-6">AutoQuery Bookings Test</h2>
464+
<div className="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
465+
<p className="mb-4 text-gray-600 dark:text-gray-400">
466+
</p>
467+
<AutoQueryGrid type="Booking" />
452468
</div>
453469
</div>
470+
471+
</ClientContext.Provider>
454472
</>
455473
)
456474
}

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import { useAuth } from './use/auth'
66
import { useFiles } from './use/files'
77
import { useMetadata } from './use/metadata'
88
import { useFormatters } from './use/formatters'
9-
import { useApiState } from './use/context'
9+
import { useApiState, ClientContext, ApiStateContext } from './use/context'
1010
import * as css from './components/css'
1111

1212
// Export component types
1313
export * from './components/types'
1414
export * from './types'
1515

1616
// Export hooks and utilities
17-
export { useUtils, useConfig, useClient, useAuth, useMetadata, useFiles, useFormatters, useApiState, css }
17+
export { useUtils, useConfig, useClient, useAuth, useMetadata, useFiles, useFormatters, useApiState, ClientContext, ApiStateContext, css }
1818

1919
// Import components (this will be excluded from type generation)
2020

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export type ApiState = {
6565
unRefs: <T extends Record<string, any>>(o: T) => T
6666
setError: ({ message, errorCode, fieldName, errors }: IResponseStatus) => ResponseStatus
6767
addFieldError: ({ fieldName, message, errorCode }: IResponseError) => void
68+
clearErrors(): void
6869
loading: boolean
6970
error: ResponseStatus | undefined
7071
api: <TResponse>(request: IReturn<TResponse> | ApiRequest, args?: any, method?: string) => Promise<ApiResult<TResponse>>

src/use/client.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export function useClient(use?: JsonServiceClient) {
1313
const [response, setResponse] = useState<any>()
1414
const contextClient = useContext(ClientContext)
1515
const client = use ?? contextClient!
16+
const clearErrors = () => setError(undefined)
1617

1718
/** Set error state with summary or field validation error */
1819
function setErrorState({ message, errorCode, fieldName, errors }: IResponseStatus) {
@@ -122,6 +123,7 @@ export function useClient(use?: JsonServiceClient) {
122123
const ctx: ApiState = {
123124
setError: setErrorState,
124125
addFieldError,
126+
clearErrors,
125127
loading,
126128
error,
127129
api,

0 commit comments

Comments
 (0)