Compare commits

..

2 Commits

Author SHA1 Message Date
dean
63e1a7090a feat: Add auth handoff mutation operations
Adds GraphQL operations for:
- CreateAuthHandoffToken: Get handoff token for mobile-to-web auth
- ExchangeAuthHandoffToken: Exchange token for Firebase custom token

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-27 10:45:01 -08:00
dean
85c4ec6d40 feat: Add auth handoff mutations for mobile-to-web authentication
Adds GraphQL types and schema for:
- createAuthHandoffToken: Creates short-lived token for auth handoff
- exchangeAuthHandoffToken: Exchanges handoff token for Firebase custom token

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-27 10:44:38 -08:00
13 changed files with 5514 additions and 353 deletions

View File

@@ -9,7 +9,6 @@ for proto in $(find ./rbproto -iname '*.proto'); do
protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto
yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts
done done
black rbproto/python
prettier ./rbproto --write prettier ./rbproto --write
git ls-files | xargs md5sum > after.txt git ls-files | xargs md5sum > after.txt

5423
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ packages = [{include = "rbproto"}]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.10,<=3.13" python = ">=3.10,<=3.13"
protobuf = ">=4.25.3" protobuf = "^4.25.3"
[build-system] [build-system]

View File

@@ -6,45 +6,44 @@ from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default() _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3'
) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01\"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id\"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3')
_globals = globals() _globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "shot_pb2", _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._options = None _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_options = b"8\001" _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001'
_globals["_BOX"]._serialized_start = 31 _globals['_BOX']._serialized_start=31
_globals["_BOX"]._serialized_end = 94 _globals['_BOX']._serialized_end=94
_globals["_POINT"]._serialized_start = 96 _globals['_POINT']._serialized_start=96
_globals["_POINT"]._serialized_end = 125 _globals['_POINT']._serialized_end=125
_globals["_BALLDETECTION"]._serialized_start = 127 _globals['_BALLDETECTION']._serialized_start=127
_globals["_BALLDETECTION"]._serialized_end = 254 _globals['_BALLDETECTION']._serialized_end=254
_globals["_RLEBALLDETECTION"]._serialized_start = 256 _globals['_RLEBALLDETECTION']._serialized_start=256
_globals["_RLEBALLDETECTION"]._serialized_end = 340 _globals['_RLEBALLDETECTION']._serialized_end=340
_globals["_RLEDETECTIONHISTORY"]._serialized_start = 342 _globals['_RLEDETECTIONHISTORY']._serialized_start=342
_globals["_RLEDETECTIONHISTORY"]._serialized_end = 418 _globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals["_DETECTIONHISTORY"]._serialized_start = 420 _globals['_DETECTIONHISTORY']._serialized_start=420
_globals["_DETECTIONHISTORY"]._serialized_end = 490 _globals['_DETECTIONHISTORY']._serialized_end=490
_globals["_COLLISIONINFO"]._serialized_start = 493 _globals['_COLLISIONINFO']._serialized_start=493
_globals["_COLLISIONINFO"]._serialized_end = 745 _globals['_COLLISIONINFO']._serialized_end=745
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_start = 667 _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745 _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745
_globals["_PATH"]._serialized_start = 748 _globals['_PATH']._serialized_start=748
_globals["_PATH"]._serialized_end = 1080 _globals['_PATH']._serialized_end=1080
_globals["_IDENTIFIERHISTORY"]._serialized_start = 1082 _globals['_IDENTIFIERHISTORY']._serialized_start=1082
_globals["_IDENTIFIERHISTORY"]._serialized_end = 1164 _globals['_IDENTIFIERHISTORY']._serialized_end=1164
_globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1167 _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167
_globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1411 _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411
_globals["_SHOT"]._serialized_start = 1414 _globals['_SHOT']._serialized_start=1414
_globals["_SHOT"]._serialized_end = 1582 _globals['_SHOT']._serialized_end=1582
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -1,13 +1,7 @@
from google.protobuf.internal import containers as _containers from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message from google.protobuf import message as _message
from typing import ( from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
ClassVar as _ClassVar,
Iterable as _Iterable,
Mapping as _Mapping,
Optional as _Optional,
Union as _Union,
)
DESCRIPTOR: _descriptor.FileDescriptor DESCRIPTOR: _descriptor.FileDescriptor
@@ -21,13 +15,7 @@ class Box(_message.Message):
top: float top: float
width: float width: float
height: float height: float
def __init__( def __init__(self, left: _Optional[float] = ..., top: _Optional[float] = ..., width: _Optional[float] = ..., height: _Optional[float] = ...) -> None: ...
self,
left: _Optional[float] = ...,
top: _Optional[float] = ...,
width: _Optional[float] = ...,
height: _Optional[float] = ...,
) -> None: ...
class Point(_message.Message): class Point(_message.Message):
__slots__ = ["x", "y"] __slots__ = ["x", "y"]
@@ -35,9 +23,7 @@ class Point(_message.Message):
Y_FIELD_NUMBER: _ClassVar[int] Y_FIELD_NUMBER: _ClassVar[int]
x: float x: float
y: float y: float
def __init__( def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ...
self, x: _Optional[float] = ..., y: _Optional[float] = ...
) -> None: ...
class BallDetection(_message.Message): class BallDetection(_message.Message):
__slots__ = ["plane_position", "annotation", "interpolated"] __slots__ = ["plane_position", "annotation", "interpolated"]
@@ -47,12 +33,7 @@ class BallDetection(_message.Message):
plane_position: Point plane_position: Point
annotation: Box annotation: Box
interpolated: bool interpolated: bool
def __init__( def __init__(self, plane_position: _Optional[_Union[Point, _Mapping]] = ..., annotation: _Optional[_Union[Box, _Mapping]] = ..., interpolated: bool = ...) -> None: ...
self,
plane_position: _Optional[_Union[Point, _Mapping]] = ...,
annotation: _Optional[_Union[Box, _Mapping]] = ...,
interpolated: bool = ...,
) -> None: ...
class RLEBallDetection(_message.Message): class RLEBallDetection(_message.Message):
__slots__ = ["detection", "count"] __slots__ = ["detection", "count"]
@@ -60,49 +41,29 @@ class RLEBallDetection(_message.Message):
COUNT_FIELD_NUMBER: _ClassVar[int] COUNT_FIELD_NUMBER: _ClassVar[int]
detection: BallDetection detection: BallDetection
count: int count: int
def __init__( def __init__(self, detection: _Optional[_Union[BallDetection, _Mapping]] = ..., count: _Optional[int] = ...) -> None: ...
self,
detection: _Optional[_Union[BallDetection, _Mapping]] = ...,
count: _Optional[int] = ...,
) -> None: ...
class RLEDetectionHistory(_message.Message): class RLEDetectionHistory(_message.Message):
__slots__ = ["detections"] __slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int] DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection] detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection]
def __init__( def __init__(self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...) -> None: ...
self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...
) -> None: ...
class DetectionHistory(_message.Message): class DetectionHistory(_message.Message):
__slots__ = ["detections"] __slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int] DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[BallDetection] detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
def __init__( def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...
) -> None: ...
class CollisionInfo(_message.Message): class CollisionInfo(_message.Message):
__slots__ = [ __slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"]
"source",
"ball_identifiers",
"wall_identifier",
"frame_index",
"static",
]
class BallIdentifiersEntry(_message.Message): class BallIdentifiersEntry(_message.Message):
__slots__ = ["key", "value"] __slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int] KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int] VALUE_FIELD_NUMBER: _ClassVar[int]
key: int key: int
value: Point value: Point
def __init__( def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ...
self,
key: _Optional[int] = ...,
value: _Optional[_Union[Point, _Mapping]] = ...,
) -> None: ...
SOURCE_FIELD_NUMBER: _ClassVar[int] SOURCE_FIELD_NUMBER: _ClassVar[int]
BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int] BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int]
WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
@@ -113,26 +74,10 @@ class CollisionInfo(_message.Message):
wall_identifier: int wall_identifier: int
frame_index: int frame_index: int
static: bool static: bool
def __init__( def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ...
self,
source: _Optional[int] = ...,
ball_identifiers: _Optional[_Mapping[int, Point]] = ...,
wall_identifier: _Optional[int] = ...,
frame_index: _Optional[int] = ...,
static: bool = ...,
) -> None: ...
class Path(_message.Message): class Path(_message.Message):
__slots__ = [ __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"]
"start_frame",
"end_frame",
"detections",
"rle_detections",
"not_present",
"is_static",
"start_info",
"end_info",
]
START_FRAME_FIELD_NUMBER: _ClassVar[int] START_FRAME_FIELD_NUMBER: _ClassVar[int]
END_FRAME_FIELD_NUMBER: _ClassVar[int] END_FRAME_FIELD_NUMBER: _ClassVar[int]
DETECTIONS_FIELD_NUMBER: _ClassVar[int] DETECTIONS_FIELD_NUMBER: _ClassVar[int]
@@ -149,17 +94,7 @@ class Path(_message.Message):
is_static: bool is_static: bool
start_info: CollisionInfo start_info: CollisionInfo
end_info: CollisionInfo end_info: CollisionInfo
def __init__( def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ...
self,
start_frame: _Optional[int] = ...,
end_frame: _Optional[int] = ...,
detections: _Optional[_Union[DetectionHistory, _Mapping]] = ...,
rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ...,
not_present: bool = ...,
is_static: bool = ...,
start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...,
end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...,
) -> None: ...
class IdentifierHistory(_message.Message): class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths"] __slots__ = ["ball_identifier", "paths"]
@@ -167,22 +102,10 @@ class IdentifierHistory(_message.Message):
PATHS_FIELD_NUMBER: _ClassVar[int] PATHS_FIELD_NUMBER: _ClassVar[int]
ball_identifier: int ball_identifier: int
paths: _containers.RepeatedCompositeFieldContainer[Path] paths: _containers.RepeatedCompositeFieldContainer[Path]
def __init__( def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
self,
ball_identifier: _Optional[int] = ...,
paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...,
) -> None: ...
class KeyBallIdentifiers(_message.Message): class KeyBallIdentifiers(_message.Message):
__slots__ = [ __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"]
"cue_ball",
"object_ball",
"target_ball",
"contact_sequence",
"cue_ball_id",
"object_ball_id",
"target_ball_id",
]
CUE_BALL_FIELD_NUMBER: _ClassVar[int] CUE_BALL_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_FIELD_NUMBER: _ClassVar[int] OBJECT_BALL_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_FIELD_NUMBER: _ClassVar[int] TARGET_BALL_FIELD_NUMBER: _ClassVar[int]
@@ -197,16 +120,7 @@ class KeyBallIdentifiers(_message.Message):
cue_ball_id: int cue_ball_id: int
object_ball_id: int object_ball_id: int
target_ball_id: int target_ball_id: int
def __init__( def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ..., cue_ball_id: _Optional[int] = ..., object_ball_id: _Optional[int] = ..., target_ball_id: _Optional[int] = ...) -> None: ...
self,
cue_ball: _Optional[int] = ...,
object_ball: _Optional[int] = ...,
target_ball: _Optional[int] = ...,
contact_sequence: _Optional[_Iterable[int]] = ...,
cue_ball_id: _Optional[int] = ...,
object_ball_id: _Optional[int] = ...,
target_ball_id: _Optional[int] = ...,
) -> None: ...
class Shot(_message.Message): class Shot(_message.Message):
__slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"] __slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"]
@@ -218,12 +132,4 @@ class Shot(_message.Message):
key_balls: KeyBallIdentifiers key_balls: KeyBallIdentifiers
start_index: int start_index: int
end_index: int end_index: int
def __init__( def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ...
self,
identifier_histories: _Optional[
_Iterable[_Union[IdentifierHistory, _Mapping]]
] = ...,
key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ...,
start_index: _Optional[int] = ...,
end_index: _Optional[int] = ...,
) -> None: ...

View File

@@ -79,6 +79,12 @@ export enum AlignedIntervalEnum {
Year = "YEAR", Year = "YEAR",
} }
export type AuthHandoffTokenGql = {
__typename?: "AuthHandoffTokenGQL";
expiresInSeconds: Scalars["Int"]["output"];
token: Scalars["String"]["output"];
};
export type BankFeaturesGql = { export type BankFeaturesGql = {
__typename?: "BankFeaturesGQL"; __typename?: "BankFeaturesGQL";
bankAngle: Scalars["Float"]["output"]; bankAngle: Scalars["Float"]["output"];
@@ -273,8 +279,6 @@ export type DeployedConfigGql = {
__typename?: "DeployedConfigGQL"; __typename?: "DeployedConfigGQL";
allowNewUsers: Scalars["Boolean"]["output"]; allowNewUsers: Scalars["Boolean"]["output"];
bannerMessages: Array<BannerGql>; bannerMessages: Array<BannerGql>;
bucketUrl: Scalars["String"]["output"];
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
devMode: Scalars["Boolean"]["output"]; devMode: Scalars["Boolean"]["output"];
environment: Scalars["String"]["output"]; environment: Scalars["String"]["output"];
firebase: Scalars["Boolean"]["output"]; firebase: Scalars["Boolean"]["output"];
@@ -320,6 +324,12 @@ export type EnumAggregation = {
feature: Scalars["String"]["input"]; feature: Scalars["String"]["input"];
}; };
export type ExchangeAuthHandoffResultGql = {
__typename?: "ExchangeAuthHandoffResultGQL";
customToken: Scalars["String"]["output"];
userId: Scalars["Int"]["output"];
};
export type FilterInput = export type FilterInput =
| { | {
andFilters: Array<FilterInput>; andFilters: Array<FilterInput>;
@@ -2344,6 +2354,7 @@ export type Mutation = {
blockUser: Scalars["Boolean"]["output"]; blockUser: Scalars["Boolean"]["output"];
cancelSubscription: UserSubscriptionStatusGql; cancelSubscription: UserSubscriptionStatusGql;
commentOnVideo: Scalars["Boolean"]["output"]; commentOnVideo: Scalars["Boolean"]["output"];
createAuthHandoffToken: AuthHandoffTokenGql;
createBucketSet: BucketSetGql; createBucketSet: BucketSetGql;
createChallenge: Challenge; createChallenge: Challenge;
createRuleSet: RuleSet; createRuleSet: RuleSet;
@@ -2361,6 +2372,7 @@ export type Mutation = {
editUploadStream: Scalars["Boolean"]["output"]; editUploadStream: Scalars["Boolean"]["output"];
editUser: UserGql; editUser: UserGql;
ensureStripeCustomerExists: UserGql; ensureStripeCustomerExists: UserGql;
exchangeAuthHandoffToken: ExchangeAuthHandoffResultGql;
findPrerecordTableLayout?: Maybe<HomographyInfoGql>; findPrerecordTableLayout?: Maybe<HomographyInfoGql>;
followUser: UserGql; followUser: UserGql;
getHlsInitUploadLink: GetUploadLinkReturn; getHlsInitUploadLink: GetUploadLinkReturn;
@@ -2481,6 +2493,10 @@ export type MutationEditUserArgs = {
input: EditUserInputGql; input: EditUserInputGql;
}; };
export type MutationExchangeAuthHandoffTokenArgs = {
token: Scalars["String"]["input"];
};
export type MutationFindPrerecordTableLayoutArgs = { export type MutationFindPrerecordTableLayoutArgs = {
b64Image: Scalars["String"]["input"]; b64Image: Scalars["String"]["input"];
videoId: Scalars["Int"]["input"]; videoId: Scalars["Int"]["input"];
@@ -3559,7 +3575,6 @@ export type GetAggregatedShotMetricsQuery = {
__typename?: "TargetMetricsGQL"; __typename?: "TargetMetricsGQL";
count: number; count: number;
makePercentage?: number | null; makePercentage?: number | null;
averageDifficulty?: number | null;
}; };
}>; }>;
}; };
@@ -3977,8 +3992,6 @@ export type GetDeployedConfigQuery = {
firebase: boolean; firebase: boolean;
minimumAllowedAppVersion: string; minimumAllowedAppVersion: string;
subscriptionGatingEnabled: boolean; subscriptionGatingEnabled: boolean;
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
bucketUrl: string;
bannerMessages: Array<{ bannerMessages: Array<{
__typename?: "BannerGQL"; __typename?: "BannerGQL";
color: string; color: string;
@@ -4044,7 +4057,6 @@ export type GetFeedQuery = {
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
pocketSize?: number | null;
owner?: { owner?: {
__typename?: "UserGQL"; __typename?: "UserGQL";
id: number; id: number;
@@ -4146,7 +4158,6 @@ export type VideoCardFieldsFragment = {
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
pocketSize?: number | null;
owner?: { owner?: {
__typename?: "UserGQL"; __typename?: "UserGQL";
id: number; id: number;
@@ -4244,7 +4255,6 @@ export type GetVideoFeedQuery = {
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
pocketSize?: number | null;
owner?: { owner?: {
__typename?: "UserGQL"; __typename?: "UserGQL";
id: number; id: number;
@@ -4733,17 +4743,6 @@ export type CancelSubscriptionMutation = {
}; };
}; };
export type SubmitCancellationFeedbackMutationVariables = Exact<{
reasons?: InputMaybe<Array<CancellationReasonEnum> | CancellationReasonEnum>;
feedback?: InputMaybe<Scalars["String"]["input"]>;
metadata?: InputMaybe<CancellationFeedbackMetadataInput>;
}>;
export type SubmitCancellationFeedbackMutation = {
__typename?: "Mutation";
submitCancellationFeedback: boolean;
};
export type ReactToVideoMutationVariables = Exact<{ export type ReactToVideoMutationVariables = Exact<{
videoId: Scalars["Int"]["input"]; videoId: Scalars["Int"]["input"];
reaction?: InputMaybe<ReactionEnum>; reaction?: InputMaybe<ReactionEnum>;
@@ -5424,8 +5423,6 @@ export type GetUserQuery = {
updatedAt?: any | null; updatedAt?: any | null;
videosPrivateByDefault?: boolean | null; videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null; agreesToMarketing?: boolean | null;
following?: Array<{ __typename?: "UserGQL"; id: number }> | null;
followers?: Array<{ __typename?: "UserGQL"; id: number }> | null;
} | null; } | null;
}; };
@@ -5725,7 +5722,6 @@ export type GetVideoDetailsQuery = {
endTime?: any | null; endTime?: any | null;
makePercentage: number; makePercentage: number;
medianRun?: number | null; medianRun?: number | null;
averageDifficulty?: number | null;
startTime?: any | null; startTime?: any | null;
totalShots: number; totalShots: number;
totalShotsMade: number; totalShotsMade: number;
@@ -5991,19 +5987,6 @@ export type GetMedianRunForVideoQuery = {
getVideo: { __typename?: "VideoGQL"; id: number; medianRun?: number | null }; getVideo: { __typename?: "VideoGQL"; id: number; medianRun?: number | null };
}; };
export type GetAverageDifficultyForVideoQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
export type GetAverageDifficultyForVideoQuery = {
__typename?: "Query";
getVideo: {
__typename?: "VideoGQL";
id: number;
averageDifficulty?: number | null;
};
};
export type StreamWithEndFramesFragment = { export type StreamWithEndFramesFragment = {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string; id: string;
@@ -6439,7 +6422,6 @@ export const VideoCardFieldsFragmentDoc = gql`
streamSegmentType streamSegmentType
} }
tableSize tableSize
pocketSize
tags { tags {
tagClasses { tagClasses {
name name
@@ -6747,7 +6729,6 @@ export const GetAggregatedShotMetricsDocument = gql`
targetMetrics { targetMetrics {
count count
makePercentage makePercentage
averageDifficulty
} }
} }
} }
@@ -8220,8 +8201,6 @@ export const GetDeployedConfigDocument = gql`
message message
priority priority
} }
defaultAndroidRecordingFormat
bucketUrl
} }
} }
`; `;
@@ -9683,65 +9662,6 @@ export type CancelSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CancelSubscriptionMutation, CancelSubscriptionMutation,
CancelSubscriptionMutationVariables CancelSubscriptionMutationVariables
>; >;
export const SubmitCancellationFeedbackDocument = gql`
mutation SubmitCancellationFeedback(
$reasons: [CancellationReasonEnum!]
$feedback: String
$metadata: CancellationFeedbackMetadataInput
) {
submitCancellationFeedback(
reasons: $reasons
feedback: $feedback
metadata: $metadata
)
}
`;
export type SubmitCancellationFeedbackMutationFn = Apollo.MutationFunction<
SubmitCancellationFeedbackMutation,
SubmitCancellationFeedbackMutationVariables
>;
/**
* __useSubmitCancellationFeedbackMutation__
*
* To run a mutation, you first call `useSubmitCancellationFeedbackMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useSubmitCancellationFeedbackMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [submitCancellationFeedbackMutation, { data, loading, error }] = useSubmitCancellationFeedbackMutation({
* variables: {
* reasons: // value for 'reasons'
* feedback: // value for 'feedback'
* metadata: // value for 'metadata'
* },
* });
*/
export function useSubmitCancellationFeedbackMutation(
baseOptions?: Apollo.MutationHookOptions<
SubmitCancellationFeedbackMutation,
SubmitCancellationFeedbackMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
SubmitCancellationFeedbackMutation,
SubmitCancellationFeedbackMutationVariables
>(SubmitCancellationFeedbackDocument, options);
}
export type SubmitCancellationFeedbackMutationHookResult = ReturnType<
typeof useSubmitCancellationFeedbackMutation
>;
export type SubmitCancellationFeedbackMutationResult =
Apollo.MutationResult<SubmitCancellationFeedbackMutation>;
export type SubmitCancellationFeedbackMutationOptions =
Apollo.BaseMutationOptions<
SubmitCancellationFeedbackMutation,
SubmitCancellationFeedbackMutationVariables
>;
export const ReactToVideoDocument = gql` export const ReactToVideoDocument = gql`
mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) { mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
reactToVideo(videoId: $videoId, reaction: $reaction) reactToVideo(videoId: $videoId, reaction: $reaction)
@@ -10994,12 +10914,6 @@ export const GetUserDocument = gql`
query GetUser($userId: Int!) { query GetUser($userId: Int!) {
getUser(userId: $userId) { getUser(userId: $userId) {
...UserFragment ...UserFragment
following {
id
}
followers {
id
}
} }
} }
${UserFragmentFragmentDoc} ${UserFragmentFragmentDoc}
@@ -12079,7 +11993,6 @@ export const GetVideoDetailsDocument = gql`
endTime endTime
makePercentage makePercentage
medianRun medianRun
averageDifficulty
startTime startTime
totalShots totalShots
totalShotsMade totalShotsMade
@@ -12733,80 +12646,6 @@ export type GetMedianRunForVideoQueryResult = Apollo.QueryResult<
GetMedianRunForVideoQuery, GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables GetMedianRunForVideoQueryVariables
>; >;
export const GetAverageDifficultyForVideoDocument = gql`
query GetAverageDifficultyForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageDifficulty
}
}
`;
/**
* __useGetAverageDifficultyForVideoQuery__
*
* To run a query within a React component, call `useGetAverageDifficultyForVideoQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAverageDifficultyForVideoQuery` 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 } = useGetAverageDifficultyForVideoQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetAverageDifficultyForVideoQuery(
baseOptions: Apollo.QueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export function useGetAverageDifficultyForVideoLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export function useGetAverageDifficultyForVideoSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export type GetAverageDifficultyForVideoQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoQuery
>;
export type GetAverageDifficultyForVideoLazyQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoLazyQuery
>;
export type GetAverageDifficultyForVideoSuspenseQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoSuspenseQuery
>;
export type GetAverageDifficultyForVideoQueryResult = Apollo.QueryResult<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>;
export const GetVideoForClipTimesDocument = gql` export const GetVideoForClipTimesDocument = gql`
query GetVideoForClipTimes($videoId: Int!) { query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) { getVideo(videoId: $videoId) {

View File

@@ -7,7 +7,6 @@ query GetAggregatedShotMetrics($aggregateInput: AggregateInputGQL!) {
targetMetrics { targetMetrics {
count count
makePercentage makePercentage
averageDifficulty
} }
} }
} }

View File

@@ -14,7 +14,5 @@ query getDeployedConfig {
message message
priority priority
} }
defaultAndroidRecordingFormat
bucketUrl
} }
} }

View File

@@ -50,7 +50,6 @@ fragment VideoCardFields on VideoGQL {
streamSegmentType streamSegmentType
} }
tableSize tableSize
pocketSize
tags { tags {
tagClasses { tagClasses {
name name

View File

@@ -63,14 +63,17 @@ mutation CancelSubscription {
stripeSubscriptionId stripeSubscriptionId
} }
} }
mutation SubmitCancellationFeedback(
$reasons: [CancellationReasonEnum!] mutation CreateAuthHandoffToken {
$feedback: String createAuthHandoffToken {
$metadata: CancellationFeedbackMetadataInput token
) { expiresInSeconds
submitCancellationFeedback( }
reasons: $reasons }
feedback: $feedback
metadata: $metadata mutation ExchangeAuthHandoffToken($token: String!) {
) exchangeAuthHandoffToken(token: $token) {
customToken
userId
}
} }

View File

@@ -34,12 +34,6 @@ query getLoggedInUser {
query GetUser($userId: Int!) { query GetUser($userId: Int!) {
getUser(userId: $userId) { getUser(userId: $userId) {
...UserFragment ...UserFragment
following {
id
}
followers {
id
}
} }
} }

View File

@@ -61,7 +61,6 @@ query GetVideoDetails($videoId: Int!) {
endTime endTime
makePercentage makePercentage
medianRun medianRun
averageDifficulty
startTime startTime
totalShots totalShots
totalShotsMade totalShotsMade
@@ -212,13 +211,6 @@ query GetMedianRunForVideo($videoId: Int!) {
} }
} }
query GetAverageDifficultyForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageDifficulty
}
}
fragment StreamWithEndFrames on UploadStreamGQL { fragment StreamWithEndFrames on UploadStreamGQL {
id id
streamSegmentType streamSegmentType

View File

@@ -668,8 +668,6 @@ type DeployedConfigGQL {
minimumAllowedAppVersion: String! minimumAllowedAppVersion: String!
subscriptionGatingEnabled: Boolean! subscriptionGatingEnabled: Boolean!
bannerMessages: [BannerGQL!]! bannerMessages: [BannerGQL!]!
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
bucketUrl: String!
} }
type BannerGQL { type BannerGQL {
@@ -1079,6 +1077,8 @@ type Mutation {
feedback: String = null feedback: String = null
metadata: CancellationFeedbackMetadataInput = null metadata: CancellationFeedbackMetadataInput = null
): Boolean! ): Boolean!
createAuthHandoffToken: AuthHandoffTokenGQL!
exchangeAuthHandoffToken(token: String!): ExchangeAuthHandoffResultGQL!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream( createUploadStream(
videoMetadata: VideoMetadataInput! videoMetadata: VideoMetadataInput!
@@ -1218,6 +1218,16 @@ input CancellationFeedbackMetadataInput {
platform: String = null platform: String = null
} }
type AuthHandoffTokenGQL {
token: String!
expiresInSeconds: Int!
}
type ExchangeAuthHandoffResultGQL {
customToken: String!
userId: Int!
}
type CreateUploadStreamReturn { type CreateUploadStreamReturn {
videoId: Int! videoId: Int!
} }