Re-add legacy shot-sim operations alongside GetShotLabVideos
Mobile master's shot-simulation-screen still uses LiveStreamPicker and
RecordedShotPicker (GetLiveStreams / GetRecordedShots) while ALSO using
the video-first GetShotLabVideos picker — a transitional state. 1a95439
replaced the old operations, so no gql commit carried the union, which
left mobile master's submodule pointer unable to satisfy its own code
(master pinned an old pointer and typechecks silently broke — CI only
runs on PRs). Additive and operation-only; drop these again when the
old pickers are deleted.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
258
src/index.tsx
258
src/index.tsx
@@ -5414,6 +5414,43 @@ export type GetMyDrillRunsQuery = {
|
|||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type GetLiveStreamsQueryVariables = Exact<{
|
||||||
|
limit?: Scalars["Int"]["input"];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type GetLiveStreamsQuery = {
|
||||||
|
__typename?: "Query";
|
||||||
|
getFeedVideos: {
|
||||||
|
__typename?: "VideoHistoryGQL";
|
||||||
|
videos: Array<{
|
||||||
|
__typename?: "VideoGQL";
|
||||||
|
id: number;
|
||||||
|
name?: string | null;
|
||||||
|
startTime?: any | null;
|
||||||
|
createdAt?: any | null;
|
||||||
|
screenshotUri?: string | null;
|
||||||
|
elapsedTime?: number | null;
|
||||||
|
owner?: {
|
||||||
|
__typename?: "UserGQL";
|
||||||
|
id: number;
|
||||||
|
username: string;
|
||||||
|
profileImageUri?: string | null;
|
||||||
|
} | null;
|
||||||
|
stream?: {
|
||||||
|
__typename?: "UploadStreamGQL";
|
||||||
|
id: string;
|
||||||
|
isCompleted: boolean;
|
||||||
|
lastSegmentUploadedAt?: any | null;
|
||||||
|
} | null;
|
||||||
|
}>;
|
||||||
|
pageInfo: {
|
||||||
|
__typename?: "PageInfoGQL";
|
||||||
|
hasNextPage: boolean;
|
||||||
|
endCursor?: string | null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{
|
export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{
|
||||||
videoId: Scalars["ID"]["input"];
|
videoId: Scalars["ID"]["input"];
|
||||||
intervalDuration: Scalars["Int"]["input"];
|
intervalDuration: Scalars["Int"]["input"];
|
||||||
@@ -6755,12 +6792,11 @@ export type ReactToVideoMutation = {
|
|||||||
reactToVideo: boolean;
|
reactToVideo: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GetShotLabVideosQueryVariables = Exact<{
|
export type GetRecordedStreamsQueryVariables = Exact<{
|
||||||
userId: Scalars["Int"]["input"];
|
|
||||||
limit?: Scalars["Int"]["input"];
|
limit?: Scalars["Int"]["input"];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type GetShotLabVideosQuery = {
|
export type GetRecordedStreamsQuery = {
|
||||||
__typename?: "Query";
|
__typename?: "Query";
|
||||||
getFeedVideos: {
|
getFeedVideos: {
|
||||||
__typename?: "VideoHistoryGQL";
|
__typename?: "VideoHistoryGQL";
|
||||||
@@ -6778,12 +6814,6 @@ export type GetShotLabVideosQuery = {
|
|||||||
username: string;
|
username: string;
|
||||||
profileImageUri?: string | null;
|
profileImageUri?: string | null;
|
||||||
} | null;
|
} | null;
|
||||||
stream?: {
|
|
||||||
__typename?: "UploadStreamGQL";
|
|
||||||
id: string;
|
|
||||||
isCompleted: boolean;
|
|
||||||
lastSegmentUploadedAt?: any | null;
|
|
||||||
} | null;
|
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -6807,13 +6837,29 @@ export type GetRecordedStreamShotsQuery = {
|
|||||||
__typename?: "SerializedShotPathsGQL";
|
__typename?: "SerializedShotPathsGQL";
|
||||||
b64EncodedBuffer?: string | null;
|
b64EncodedBuffer?: string | null;
|
||||||
} | null;
|
} | null;
|
||||||
|
cueObjectFeatures?: {
|
||||||
|
__typename?: "CueObjectFeaturesGQL";
|
||||||
|
cueObjectDistance?: number | null;
|
||||||
|
cueObjectAngle?: number | null;
|
||||||
|
cueBallSpeed?: number | null;
|
||||||
|
shotDirection?: ShotDirectionEnum | null;
|
||||||
|
spinType?: SpinTypeEnum | null;
|
||||||
|
} | null;
|
||||||
pocketingIntentionFeatures?: {
|
pocketingIntentionFeatures?: {
|
||||||
__typename?: "PocketingIntentionFeaturesGQL";
|
__typename?: "PocketingIntentionFeaturesGQL";
|
||||||
make?: boolean | null;
|
make?: boolean | null;
|
||||||
|
targetPocketDistance?: number | null;
|
||||||
|
targetPocketAngle?: number | null;
|
||||||
|
targetPocketAngleDirection?: ShotDirectionEnum | null;
|
||||||
|
marginOfErrorInDegrees?: number | null;
|
||||||
|
intendedPocketType?: PocketEnum | null;
|
||||||
|
difficulty?: number | null;
|
||||||
} | null;
|
} | null;
|
||||||
pocketingIntentionInfo?: {
|
pocketingIntentionInfo?: {
|
||||||
__typename?: "PocketingIntentionInfoGQL";
|
__typename?: "PocketingIntentionInfoGQL";
|
||||||
|
ballId: number;
|
||||||
pocketId: PocketIdentifier;
|
pocketId: PocketIdentifier;
|
||||||
|
pathMetadataIndex: number;
|
||||||
} | null;
|
} | null;
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
@@ -12385,6 +12431,105 @@ export type GetMyDrillRunsQueryResult = Apollo.QueryResult<
|
|||||||
GetMyDrillRunsQuery,
|
GetMyDrillRunsQuery,
|
||||||
GetMyDrillRunsQueryVariables
|
GetMyDrillRunsQueryVariables
|
||||||
>;
|
>;
|
||||||
|
export const GetLiveStreamsDocument = gql`
|
||||||
|
query GetLiveStreams($limit: Int! = 25) {
|
||||||
|
getFeedVideos(
|
||||||
|
limit: $limit
|
||||||
|
filters: { isStreamCompleted: false, requireCursorCompletion: false }
|
||||||
|
includePrivate: MINE
|
||||||
|
feedInput: { allUsers: true }
|
||||||
|
) {
|
||||||
|
videos {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
startTime
|
||||||
|
createdAt
|
||||||
|
screenshotUri
|
||||||
|
elapsedTime
|
||||||
|
owner {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
profileImageUri
|
||||||
|
}
|
||||||
|
stream {
|
||||||
|
id
|
||||||
|
isCompleted
|
||||||
|
lastSegmentUploadedAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
endCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useGetLiveStreamsQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useGetLiveStreamsQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useGetLiveStreamsQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useGetLiveStreamsQuery({
|
||||||
|
* variables: {
|
||||||
|
* limit: // value for 'limit'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useGetLiveStreamsQuery(
|
||||||
|
baseOptions?: Apollo.QueryHookOptions<
|
||||||
|
GetLiveStreamsQuery,
|
||||||
|
GetLiveStreamsQueryVariables
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
|
return Apollo.useQuery<GetLiveStreamsQuery, GetLiveStreamsQueryVariables>(
|
||||||
|
GetLiveStreamsDocument,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export function useGetLiveStreamsLazyQuery(
|
||||||
|
baseOptions?: Apollo.LazyQueryHookOptions<
|
||||||
|
GetLiveStreamsQuery,
|
||||||
|
GetLiveStreamsQueryVariables
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
|
return Apollo.useLazyQuery<GetLiveStreamsQuery, GetLiveStreamsQueryVariables>(
|
||||||
|
GetLiveStreamsDocument,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export function useGetLiveStreamsSuspenseQuery(
|
||||||
|
baseOptions?: Apollo.SuspenseQueryHookOptions<
|
||||||
|
GetLiveStreamsQuery,
|
||||||
|
GetLiveStreamsQueryVariables
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
|
return Apollo.useSuspenseQuery<
|
||||||
|
GetLiveStreamsQuery,
|
||||||
|
GetLiveStreamsQueryVariables
|
||||||
|
>(GetLiveStreamsDocument, options);
|
||||||
|
}
|
||||||
|
export type GetLiveStreamsQueryHookResult = ReturnType<
|
||||||
|
typeof useGetLiveStreamsQuery
|
||||||
|
>;
|
||||||
|
export type GetLiveStreamsLazyQueryHookResult = ReturnType<
|
||||||
|
typeof useGetLiveStreamsLazyQuery
|
||||||
|
>;
|
||||||
|
export type GetLiveStreamsSuspenseQueryHookResult = ReturnType<
|
||||||
|
typeof useGetLiveStreamsSuspenseQuery
|
||||||
|
>;
|
||||||
|
export type GetLiveStreamsQueryResult = Apollo.QueryResult<
|
||||||
|
GetLiveStreamsQuery,
|
||||||
|
GetLiveStreamsQueryVariables
|
||||||
|
>;
|
||||||
export const GetVideoMakePercentageIntervalsDocument = gql`
|
export const GetVideoMakePercentageIntervalsDocument = gql`
|
||||||
query GetVideoMakePercentageIntervals(
|
query GetVideoMakePercentageIntervals(
|
||||||
$videoId: ID!
|
$videoId: ID!
|
||||||
@@ -14683,13 +14828,13 @@ export type ReactToVideoMutationOptions = Apollo.BaseMutationOptions<
|
|||||||
ReactToVideoMutation,
|
ReactToVideoMutation,
|
||||||
ReactToVideoMutationVariables
|
ReactToVideoMutationVariables
|
||||||
>;
|
>;
|
||||||
export const GetShotLabVideosDocument = gql`
|
export const GetRecordedStreamsDocument = gql`
|
||||||
query GetShotLabVideos($userId: Int!, $limit: Int! = 25) {
|
query GetRecordedStreams($limit: Int! = 25) {
|
||||||
getFeedVideos(
|
getFeedVideos(
|
||||||
limit: $limit
|
limit: $limit
|
||||||
includeCallersVideos: false
|
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
|
||||||
includePrivate: MINE
|
includePrivate: MINE
|
||||||
feedInput: { userId: $userId }
|
feedInput: { allUsers: true }
|
||||||
) {
|
) {
|
||||||
videos {
|
videos {
|
||||||
id
|
id
|
||||||
@@ -14703,81 +14848,75 @@ export const GetShotLabVideosDocument = gql`
|
|||||||
username
|
username
|
||||||
profileImageUri
|
profileImageUri
|
||||||
}
|
}
|
||||||
stream {
|
|
||||||
id
|
|
||||||
isCompleted
|
|
||||||
lastSegmentUploadedAt
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __useGetShotLabVideosQuery__
|
* __useGetRecordedStreamsQuery__
|
||||||
*
|
*
|
||||||
* To run a query within a React component, call `useGetShotLabVideosQuery` and pass it any options that fit your needs.
|
* To run a query within a React component, call `useGetRecordedStreamsQuery` and pass it any options that fit your needs.
|
||||||
* When your component renders, `useGetShotLabVideosQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
* When your component renders, `useGetRecordedStreamsQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
* you can use to render your UI.
|
* you can use to render your UI.
|
||||||
*
|
*
|
||||||
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* const { data, loading, error } = useGetShotLabVideosQuery({
|
* const { data, loading, error } = useGetRecordedStreamsQuery({
|
||||||
* variables: {
|
* variables: {
|
||||||
* userId: // value for 'userId'
|
|
||||||
* limit: // value for 'limit'
|
* limit: // value for 'limit'
|
||||||
* },
|
* },
|
||||||
* });
|
* });
|
||||||
*/
|
*/
|
||||||
export function useGetShotLabVideosQuery(
|
export function useGetRecordedStreamsQuery(
|
||||||
baseOptions: Apollo.QueryHookOptions<
|
baseOptions?: Apollo.QueryHookOptions<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>,
|
>,
|
||||||
) {
|
) {
|
||||||
const options = { ...defaultOptions, ...baseOptions };
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
return Apollo.useQuery<GetShotLabVideosQuery, GetShotLabVideosQueryVariables>(
|
return Apollo.useQuery<
|
||||||
GetShotLabVideosDocument,
|
GetRecordedStreamsQuery,
|
||||||
options,
|
GetRecordedStreamsQueryVariables
|
||||||
);
|
>(GetRecordedStreamsDocument, options);
|
||||||
}
|
}
|
||||||
export function useGetShotLabVideosLazyQuery(
|
export function useGetRecordedStreamsLazyQuery(
|
||||||
baseOptions?: Apollo.LazyQueryHookOptions<
|
baseOptions?: Apollo.LazyQueryHookOptions<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>,
|
>,
|
||||||
) {
|
) {
|
||||||
const options = { ...defaultOptions, ...baseOptions };
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
return Apollo.useLazyQuery<
|
return Apollo.useLazyQuery<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>(GetShotLabVideosDocument, options);
|
>(GetRecordedStreamsDocument, options);
|
||||||
}
|
}
|
||||||
export function useGetShotLabVideosSuspenseQuery(
|
export function useGetRecordedStreamsSuspenseQuery(
|
||||||
baseOptions?: Apollo.SuspenseQueryHookOptions<
|
baseOptions?: Apollo.SuspenseQueryHookOptions<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>,
|
>,
|
||||||
) {
|
) {
|
||||||
const options = { ...defaultOptions, ...baseOptions };
|
const options = { ...defaultOptions, ...baseOptions };
|
||||||
return Apollo.useSuspenseQuery<
|
return Apollo.useSuspenseQuery<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>(GetShotLabVideosDocument, options);
|
>(GetRecordedStreamsDocument, options);
|
||||||
}
|
}
|
||||||
export type GetShotLabVideosQueryHookResult = ReturnType<
|
export type GetRecordedStreamsQueryHookResult = ReturnType<
|
||||||
typeof useGetShotLabVideosQuery
|
typeof useGetRecordedStreamsQuery
|
||||||
>;
|
>;
|
||||||
export type GetShotLabVideosLazyQueryHookResult = ReturnType<
|
export type GetRecordedStreamsLazyQueryHookResult = ReturnType<
|
||||||
typeof useGetShotLabVideosLazyQuery
|
typeof useGetRecordedStreamsLazyQuery
|
||||||
>;
|
>;
|
||||||
export type GetShotLabVideosSuspenseQueryHookResult = ReturnType<
|
export type GetRecordedStreamsSuspenseQueryHookResult = ReturnType<
|
||||||
typeof useGetShotLabVideosSuspenseQuery
|
typeof useGetRecordedStreamsSuspenseQuery
|
||||||
>;
|
>;
|
||||||
export type GetShotLabVideosQueryResult = Apollo.QueryResult<
|
export type GetRecordedStreamsQueryResult = Apollo.QueryResult<
|
||||||
GetShotLabVideosQuery,
|
GetRecordedStreamsQuery,
|
||||||
GetShotLabVideosQueryVariables
|
GetRecordedStreamsQueryVariables
|
||||||
>;
|
>;
|
||||||
export const GetRecordedStreamShotsDocument = gql`
|
export const GetRecordedStreamShotsDocument = gql`
|
||||||
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
|
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
|
||||||
@@ -14794,11 +14933,26 @@ export const GetRecordedStreamShotsDocument = gql`
|
|||||||
serializedShotPaths {
|
serializedShotPaths {
|
||||||
b64EncodedBuffer
|
b64EncodedBuffer
|
||||||
}
|
}
|
||||||
|
cueObjectFeatures {
|
||||||
|
cueObjectDistance
|
||||||
|
cueObjectAngle
|
||||||
|
cueBallSpeed
|
||||||
|
shotDirection
|
||||||
|
spinType
|
||||||
|
}
|
||||||
pocketingIntentionFeatures {
|
pocketingIntentionFeatures {
|
||||||
make
|
make
|
||||||
|
targetPocketDistance
|
||||||
|
targetPocketAngle
|
||||||
|
targetPocketAngleDirection
|
||||||
|
marginOfErrorInDegrees
|
||||||
|
intendedPocketType
|
||||||
|
difficulty
|
||||||
}
|
}
|
||||||
pocketingIntentionInfo {
|
pocketingIntentionInfo {
|
||||||
|
ballId
|
||||||
pocketId
|
pocketId
|
||||||
|
pathMetadataIndex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
34
src/operations/live_streams.gql
Normal file
34
src/operations/live_streams.gql
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Lightweight listing of live (in-progress) streams for pickers like the
|
||||||
|
# Shot Lab "follow a live stream" flow. Selects only what a picker card
|
||||||
|
# needs; intentionally avoids the heavy VideoCardFields fragment.
|
||||||
|
query GetLiveStreams($limit: Int! = 25) {
|
||||||
|
getFeedVideos(
|
||||||
|
limit: $limit
|
||||||
|
filters: { isStreamCompleted: false, requireCursorCompletion: false }
|
||||||
|
includePrivate: MINE
|
||||||
|
feedInput: { allUsers: true }
|
||||||
|
) {
|
||||||
|
videos {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
startTime
|
||||||
|
createdAt
|
||||||
|
screenshotUri
|
||||||
|
elapsedTime
|
||||||
|
owner {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
profileImageUri
|
||||||
|
}
|
||||||
|
stream {
|
||||||
|
id
|
||||||
|
isCompleted
|
||||||
|
lastSegmentUploadedAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
endCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
# Lightweight two-step picker data for Shot Lab's video-first source: the
|
# Lightweight two-step picker data for loading a recorded shot into Shot Lab.
|
||||||
# caller's recent videos (completed or still uploading), then that video's
|
query GetRecordedStreams($limit: Int! = 25) {
|
||||||
# shots. The stream fields hint at "actively updating" without gating.
|
|
||||||
query GetShotLabVideos($userId: Int!, $limit: Int! = 25) {
|
|
||||||
getFeedVideos(
|
getFeedVideos(
|
||||||
limit: $limit
|
limit: $limit
|
||||||
includeCallersVideos: false
|
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
|
||||||
includePrivate: MINE
|
includePrivate: MINE
|
||||||
feedInput: { userId: $userId }
|
feedInput: { allUsers: true }
|
||||||
) {
|
) {
|
||||||
videos {
|
videos {
|
||||||
id
|
id
|
||||||
@@ -20,11 +18,6 @@ query GetShotLabVideos($userId: Int!, $limit: Int! = 25) {
|
|||||||
username
|
username
|
||||||
profileImageUri
|
profileImageUri
|
||||||
}
|
}
|
||||||
stream {
|
|
||||||
id
|
|
||||||
isCompleted
|
|
||||||
lastSegmentUploadedAt
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,11 +36,26 @@ query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
|
|||||||
serializedShotPaths {
|
serializedShotPaths {
|
||||||
b64EncodedBuffer
|
b64EncodedBuffer
|
||||||
}
|
}
|
||||||
|
cueObjectFeatures {
|
||||||
|
cueObjectDistance
|
||||||
|
cueObjectAngle
|
||||||
|
cueBallSpeed
|
||||||
|
shotDirection
|
||||||
|
spinType
|
||||||
|
}
|
||||||
pocketingIntentionFeatures {
|
pocketingIntentionFeatures {
|
||||||
make
|
make
|
||||||
|
targetPocketDistance
|
||||||
|
targetPocketAngle
|
||||||
|
targetPocketAngleDirection
|
||||||
|
marginOfErrorInDegrees
|
||||||
|
intendedPocketType
|
||||||
|
difficulty
|
||||||
}
|
}
|
||||||
pocketingIntentionInfo {
|
pocketingIntentionInfo {
|
||||||
|
ballId
|
||||||
pocketId
|
pocketId
|
||||||
|
pathMetadataIndex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user