Compare commits

..

46 Commits

Author SHA1 Message Date
d31d171ac3 getQuotaStatus, expectedDurationSeconds in createUploadStream 2026-02-03 16:30:56 -08:00
c76220b65f Merge pull request 'Lightweight Query Operation - getVideoFeedSessionCount' (#223) from loewy/video-feed-session-count-query into master
Reviewed-on: #223
2026-01-30 22:37:59 +00:00
1218ecdaaa Merge branch 'master' into loewy/video-feed-session-count-query
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-30 22:37:38 +00:00
dfd03a225a Merge pull request 'Include black in flake buildInputs' (#225) from loewy/include-just-black-in-flake-build-inputs into master
Reviewed-on: #225
2026-01-30 22:32:07 +00:00
adbe1c0f2b run black on shot_pb2.pyi
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-30 14:31:23 -08:00
e1cc8b3ee1 include black in buildInput commands
Some checks failed
Tests / Tests (pull_request) Failing after 11s
2026-01-30 14:26:55 -08:00
c3156bac05 leightweight query to get totalshots
Some checks failed
Tests / Tests (pull_request) Failing after 10s
2026-01-30 13:36:37 -08:00
aba0b16a51 Merge pull request 'feat: Add bucketUrl to DeployedConfig' (#222) from feat/dynamic-bucket-url into master
Reviewed-on: #222
Reviewed-by: loewy <loewymalkov@gmail.com>
2026-01-27 00:51:35 +00:00
2a267ce961 chore: Allow protobuf >=4.25.3 for hatchet-sdk v1 compatibility
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 15:21:46 -08:00
dean
82cec7d7cb feat: Add bucketUrl to DeployedConfig
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Add bucketUrl field to schema and query so mobile can get
the bucket URL dynamically from the backend instead of
hardcoding it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 13:06:04 -08:00
bde669a608 fix: Run black on protobuf Python files in CI check
The assert-no-changes.sh script was missing black formatting for
the generated Python protobuf files, causing CI to fail after
commit aa9c561 applied black formatting to those files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 11:42:44 -08:00
aa9c561e9d style: Apply black formatting to protobuf generated files
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 07:42:04 -08:00
3def8c97c8 Merge pull request 'Add android recording format to deployed config' (#221) from loewy/add-recording-format-to-deployed-config into master
Reviewed-on: #221
2026-01-04 00:45:37 +00:00
88de1ef807 add android recording format to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-03 10:17:58 -08:00
2bb4fdd08f Merge pull request 'Add cancellation feedback schema and operations' (#220) from loewy/add-cancellation-feedback-schema-and-ops into master
Reviewed-on: #220
2025-12-26 18:17:11 +00:00
8649673f1b add missing field
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-12-16 17:09:18 -08:00
f5e6459882 add schema and operations for submit cancellation feedback, along with associated enum 2025-12-16 16:51:08 -08:00
ced1b153de Merge pull request 'Remove package-lock.json' (#219) from loewy/remove-package-lock-json into master
Reviewed-on: #219
2025-12-17 00:46:30 +00:00
425a8ec103 remove package-lock.json
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-12-16 16:45:06 -08:00
04f408ab5d Merge pull request 'feat: Add following and followers to GetUser query' (#218) from dean/add-followers-to-get-user into master
Reviewed-on: #218
2025-12-16 23:59:17 +00:00
dean
5fbc134c42 feat: Add following and followers to GetUser query
All checks were successful
Tests / Tests (pull_request) Successful in 21s
Adds following and followers arrays to the GetUser query to support
displaying follower/following counts on other users' profiles.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 15:53:59 -08:00
f67288d387 Merge pull request 'feat: Add GetAverageDifficultyForVideo query' (#216) from dean/add-avg-difficulty-for-video-query into master
Reviewed-on: #216
2025-12-16 04:22:56 +00:00
dean
71425a22a6 feat: Add GetAverageDifficultyForVideo query
All checks were successful
Tests / Tests (pull_request) Successful in 10s
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 20:21:22 -08:00
47339caa74 Merge pull request 'Add averageDifficulty to aggregate operation' (#215) from loewy/add-average-difficulty-field into master
Reviewed-on: #215
2025-12-16 04:06:05 +00:00
3c8be1d647 add averageDifficulty to aggregate operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-12-10 11:43:58 -08:00
09267529cd Merge pull request 'dean/add-challenge-feature' (#212) from dean/add-challenge-feature into master
Reviewed-on: #212
2025-12-10 19:11:18 +00:00
2b48ec48d5 Merge pull request 'feat: Add pocketSize to VideoCardFields fragment' (#214) from dean/feed-pocket-size-v2 into master
Reviewed-on: #214
2025-12-10 18:33:30 +00:00
dean
93bf341c0f feat: Add pocketSize to VideoCardFields fragment
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-12-10 10:31:36 -08:00
dean
9f735b61bb chore: Regenerate schema from backend
All checks were successful
Tests / Tests (pull_request) Successful in 9s
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:49:41 -08:00
dean
fda8e4eb9d feat: Add challenge dismissal GQL operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
- Add DismissChallenge/UndismissChallenge mutations
- Add IsChallengeDismissed query
- Add GetMyDismissedChallenges query
- Update schema with dismissal fields

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:23:27 -08:00
dean
338c45d59b feat: Add challenge invitations fields and fix feed hasFollowing query
- Add invitations query fields with invitee data to GetChallenge
- Add participantCount field to GetChallenge
- Add GetMyChallengeEntries query (was missing)
- Add hasFollowing to GetVideoFeed response (fixes feed ordering)
- Sync schema with backend challenge types

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:50 -08:00
dean
e879c5008f chore: Regenerate GraphQL TypeScript types
Regenerate gql/src/index.tsx to match current schema and fix
codegen hash mismatch in CI.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:50 -08:00
dean
2d67e076f7 Add GraphQL queries and mutations for challenge feature
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:49 -08:00
dean
ec534769f3 chore: regenerate schema and types 2025-11-28 08:22:49 -08:00
dean
f8e8c7b7d4 merge: sync gql submodule, keeping local notification fragment 2025-11-28 08:22:49 -08:00
dean
372fd6e26b schema: add challenge notification types 2025-11-28 08:22:49 -08:00
dean
d9ef5ed79a WIP: Add challenges feature schema and operations
- Add Challenge, ChallengeEntry, ChallengeInvitation, RuleSet types
- Add queries: challenges, challenge, challengeLeaderboard, myChallengeInvitations, myChallengeEntries, ruleSets
- Add mutations: createChallenge, createRuleSet, inviteUsersToChallenge, respondToChallengeInvitation, startChallenge, submitChallengeEntry, recalculateChallengeEntry

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:49 -08:00
f14e117416 Merge pull request 'Add videoId field to playlist in ShotWithAllFeatures fragment' (#210) from loewy/add-video-id-to-playlist-shots-fragment into master
Reviewed-on: #210
2025-11-12 22:16:58 +00:00
3d86c13291 add videoId field to playlist in shot w features fragment
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-12 14:08:49 -08:00
e63f8600aa Merge pull request 'Add pocket size field to GraphQL schema and operations' (#209) from dean/add-pocket-size-clean into master
Reviewed-on: #209
2025-11-11 21:09:28 +00:00
7e822446da Merge branch 'master' into dean/add-pocket-size-clean
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-11-11 20:34:55 +00:00
75ecc5894b Merge pull request 'dean/add-home-feed-option' (#208) from dean/add-home-feed-option into master
Reviewed-on: #208
2025-11-10 22:09:09 +00:00
73c8dd5f57 Merge branch 'master' into dean/add-home-feed-option
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-10 19:55:16 +00:00
dean
e4223a1a17 Add isFollowedByCurrentUser field and hasFollowing to feed query
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Updated GraphQL operations to support efficient follow status checking:
- Added isFollowedByCurrentUser field to UserSocialsFields fragment
- Removed nested followers array from UserSocialsFields (over-fetching)
- Simplified followUser/unfollowUser mutations to return minimal data
- Added hasFollowing field to GetVideoFeed query for feed mode detection
- Updated getUserFollowingFollowers query to include isFollowedByCurrentUser

These changes enable the mobile app to:
- Display correct follow/unfollow button states without client-side lookups
- Differentiate between "Following" and "Popular" feed modes
- Reduce payload size by removing unnecessary nested data

Backend handles efficient resolution via request-scoped caching.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 23:44:39 -08:00
dean
83b7f0d0f6 Add home feed and isFollowedByCurrentUser field
- Add home option to VideoFeedInputGQL for automatic feed selection
- Add hasFollowing field to VideoHistoryGQL response
- Add isFollowedByCurrentUser field to UserGQL to replace followers N+1

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 09:15:39 -08:00
dean
a882f98d91 Add home option to VideoFeedInputGQL
The home feed option enables smart feed selection on the backend:
- If user has following: returns FOLLOWING feed
- If user has no following: returns ALL feed
- Always includes hasFollowing flag so frontend knows which feed it got

This allows frontend to make a single query instead of needing to
check following status separately.
2025-11-07 12:16:01 -08:00
15 changed files with 1526 additions and 6500 deletions

View File

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

View File

@@ -21,7 +21,7 @@
in
with pkgs; {
devShell = mkShell {
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf];
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf black];
};
});
}

5423
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -6,44 +6,45 @@ from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_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()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "shot_pb2", _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001'
_globals['_BOX']._serialized_start=31
_globals['_BOX']._serialized_end=94
_globals['_POINT']._serialized_start=96
_globals['_POINT']._serialized_end=125
_globals['_BALLDETECTION']._serialized_start=127
_globals['_BALLDETECTION']._serialized_end=254
_globals['_RLEBALLDETECTION']._serialized_start=256
_globals['_RLEBALLDETECTION']._serialized_end=340
_globals['_RLEDETECTIONHISTORY']._serialized_start=342
_globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals['_DETECTIONHISTORY']._serialized_start=420
_globals['_DETECTIONHISTORY']._serialized_end=490
_globals['_COLLISIONINFO']._serialized_start=493
_globals['_COLLISIONINFO']._serialized_end=745
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745
_globals['_PATH']._serialized_start=748
_globals['_PATH']._serialized_end=1080
_globals['_IDENTIFIERHISTORY']._serialized_start=1082
_globals['_IDENTIFIERHISTORY']._serialized_end=1164
_globals['_KEYBALLIDENTIFIERS']._serialized_start=1167
_globals['_KEYBALLIDENTIFIERS']._serialized_end=1411
_globals['_SHOT']._serialized_start=1414
_globals['_SHOT']._serialized_end=1582
DESCRIPTOR._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_options = b"8\001"
_globals["_BOX"]._serialized_start = 31
_globals["_BOX"]._serialized_end = 94
_globals["_POINT"]._serialized_start = 96
_globals["_POINT"]._serialized_end = 125
_globals["_BALLDETECTION"]._serialized_start = 127
_globals["_BALLDETECTION"]._serialized_end = 254
_globals["_RLEBALLDETECTION"]._serialized_start = 256
_globals["_RLEBALLDETECTION"]._serialized_end = 340
_globals["_RLEDETECTIONHISTORY"]._serialized_start = 342
_globals["_RLEDETECTIONHISTORY"]._serialized_end = 418
_globals["_DETECTIONHISTORY"]._serialized_start = 420
_globals["_DETECTIONHISTORY"]._serialized_end = 490
_globals["_COLLISIONINFO"]._serialized_start = 493
_globals["_COLLISIONINFO"]._serialized_end = 745
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_start = 667
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745
_globals["_PATH"]._serialized_start = 748
_globals["_PATH"]._serialized_end = 1080
_globals["_IDENTIFIERHISTORY"]._serialized_start = 1082
_globals["_IDENTIFIERHISTORY"]._serialized_end = 1164
_globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1167
_globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1411
_globals["_SHOT"]._serialized_start = 1414
_globals["_SHOT"]._serialized_end = 1582
# @@protoc_insertion_point(module_scope)

View File

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

View File

@@ -140,6 +140,21 @@ export type BucketSetInputGql = {
feature: Scalars["String"]["input"];
};
export type CancellationFeedbackMetadataInput = {
appVersion?: InputMaybe<Scalars["String"]["input"]>;
gitRevision?: InputMaybe<Scalars["String"]["input"]>;
platform?: InputMaybe<Scalars["String"]["input"]>;
};
export enum CancellationReasonEnum {
DataNotAccurate = "DATA_NOT_ACCURATE",
DontPlayEnough = "DONT_PLAY_ENOUGH",
MissingFeatures = "MISSING_FEATURES",
Other = "OTHER",
TechnicalIssues = "TECHNICAL_ISSUES",
TooExpensive = "TOO_EXPENSIVE",
}
export type Challenge = {
__typename?: "Challenge";
createdAt: Scalars["DateTime"]["output"];
@@ -258,6 +273,8 @@ export type DeployedConfigGql = {
__typename?: "DeployedConfigGQL";
allowNewUsers: Scalars["Boolean"]["output"];
bannerMessages: Array<BannerGql>;
bucketUrl: Scalars["String"]["output"];
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
devMode: Scalars["Boolean"]["output"];
environment: Scalars["String"]["output"];
firebase: Scalars["Boolean"]["output"];
@@ -2361,6 +2378,7 @@ export type Mutation = {
setLoggerLevel: Scalars["Boolean"]["output"];
setSegmentDuration: Scalars["Boolean"]["output"];
startChallenge: ChallengeEntry;
submitCancellationFeedback: Scalars["Boolean"]["output"];
submitChallengeEntry: ChallengeEntry;
undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql;
@@ -2414,6 +2432,7 @@ export type MutationCreateSubscriptionArgs = {
};
export type MutationCreateUploadStreamArgs = {
expectedDurationSeconds?: InputMaybe<Scalars["Float"]["input"]>;
videoMetadata: VideoMetadataInput;
};
@@ -2537,6 +2556,12 @@ export type MutationStartChallengeArgs = {
challengeId: Scalars["ID"]["input"];
};
export type MutationSubmitCancellationFeedbackArgs = {
feedback?: InputMaybe<Scalars["String"]["input"]>;
metadata?: InputMaybe<CancellationFeedbackMetadataInput>;
reasons?: InputMaybe<Array<CancellationReasonEnum>>;
};
export type MutationSubmitChallengeEntryArgs = {
entryId: Scalars["ID"]["input"];
videoId: Scalars["ID"]["input"];
@@ -2692,6 +2717,7 @@ export type Query = {
getMedals: RequestedMedalsGql;
getOrderedShots: GetShotsResult;
getPlayTime: UserPlayTimeGql;
getQuotaStatus: QuotaStatusGql;
getRuns: GetRunsResult;
getShotAnnotationTypes: Array<ShotAnnotationTypeGql>;
getShots: Array<ShotGql>;
@@ -2881,6 +2907,18 @@ export type QueryWaitForArgs = {
duration: Scalars["Float"]["input"];
};
export type QuotaStatusGql = {
__typename?: "QuotaStatusGQL";
canUpload: Scalars["Boolean"]["output"];
durationLimitSeconds?: Maybe<Scalars["Int"]["output"]>;
durationRemainingSeconds?: Maybe<Scalars["Float"]["output"]>;
durationUsedSeconds: Scalars["Float"]["output"];
maxVideoDurationSeconds?: Maybe<Scalars["Int"]["output"]>;
periodEnd: Scalars["DateTime"]["output"];
periodStart: Scalars["DateTime"]["output"];
tierName: Scalars["String"]["output"];
};
export enum ReactionEnum {
Bullseye = "BULLSEYE",
Heart = "HEART",
@@ -3535,6 +3573,7 @@ export type GetAggregatedShotMetricsQuery = {
__typename?: "TargetMetricsGQL";
count: number;
makePercentage?: number | null;
averageDifficulty?: number | null;
};
}>;
};
@@ -3952,6 +3991,8 @@ export type GetDeployedConfigQuery = {
firebase: boolean;
minimumAllowedAppVersion: string;
subscriptionGatingEnabled: boolean;
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
bucketUrl: string;
bannerMessages: Array<{
__typename?: "BannerGQL";
color: string;
@@ -4017,6 +4058,7 @@ export type GetFeedQuery = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4118,6 +4160,7 @@ export type VideoCardFieldsFragment = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4184,6 +4227,21 @@ export type VideoCardFieldsFragment = {
}>;
};
export type GetVideoFeedSessionCountQueryVariables = Exact<{
limit?: Scalars["Int"]["input"];
filters?: InputMaybe<VideoFilterInput>;
includePrivate?: InputMaybe<IncludePrivateEnum>;
feedInput?: InputMaybe<VideoFeedInputGql>;
}>;
export type GetVideoFeedSessionCountQuery = {
__typename?: "Query";
getFeedVideos: {
__typename?: "VideoHistoryGQL";
videos: Array<{ __typename?: "VideoGQL"; id: number; totalShots: number }>;
};
};
export type GetVideoFeedQueryVariables = Exact<{
limit?: Scalars["Int"]["input"];
after?: InputMaybe<Scalars["String"]["input"]>;
@@ -4215,6 +4273,7 @@ export type GetVideoFeedQuery = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4703,6 +4762,17 @@ 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<{
videoId: Scalars["Int"]["input"];
reaction?: InputMaybe<ReactionEnum>;
@@ -4965,6 +5035,7 @@ export type GetShotsWithMetadataFilterResultQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5047,6 +5118,7 @@ export type GetShotsWithMetadataQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5118,6 +5190,7 @@ export type GetShotsByIdsQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5182,6 +5255,7 @@ export type ShotWithAllFeaturesFragment = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5263,6 +5337,7 @@ export type EditShotMutation = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5378,6 +5453,8 @@ export type GetUserQuery = {
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
following?: Array<{ __typename?: "UserGQL"; id: number }> | null;
followers?: Array<{ __typename?: "UserGQL"; id: number }> | null;
} | null;
};
@@ -5449,21 +5526,7 @@ export type FollowUserMutationVariables = Exact<{
export type FollowUserMutation = {
__typename?: "Mutation";
followUser: {
__typename?: "UserGQL";
username: string;
id: number;
following?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
};
followUser: { __typename?: "UserGQL"; id: number; username: string };
};
export type UnfollowUserMutationVariables = Exact<{
@@ -5472,21 +5535,7 @@ export type UnfollowUserMutationVariables = Exact<{
export type UnfollowUserMutation = {
__typename?: "Mutation";
unfollowUser: {
__typename?: "UserGQL";
username: string;
id: number;
following?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
};
unfollowUser: { __typename?: "UserGQL"; id: number; username: string };
};
export type GetUserFollowingFollowersQueryVariables = Exact<{
@@ -5503,12 +5552,14 @@ export type GetUserFollowingFollowersQuery = {
id: number;
username: string;
profileImageUri?: string | null;
isFollowedByCurrentUser?: boolean | null;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
profileImageUri?: string | null;
isFollowedByCurrentUser?: boolean | null;
}> | null;
} | null;
};
@@ -5703,6 +5754,7 @@ export type GetVideoDetailsQuery = {
endTime?: any | null;
makePercentage: number;
medianRun?: number | null;
averageDifficulty?: number | null;
startTime?: any | null;
totalShots: number;
totalShotsMade: number;
@@ -5968,6 +6020,19 @@ export type GetMedianRunForVideoQuery = {
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 = {
__typename?: "UploadStreamGQL";
id: string;
@@ -6403,6 +6468,7 @@ export const VideoCardFieldsFragmentDoc = gql`
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name
@@ -6551,6 +6617,7 @@ export const ShotWithAllFeaturesFragmentDoc = gql`
streamSegmentType
}
playlist {
videoId
segmentDurations
}
}
@@ -6709,6 +6776,7 @@ export const GetAggregatedShotMetricsDocument = gql`
targetMetrics {
count
makePercentage
averageDifficulty
}
}
}
@@ -8181,6 +8249,8 @@ export const GetDeployedConfigDocument = gql`
message
priority
}
defaultAndroidRecordingFormat
bucketUrl
}
}
`;
@@ -8481,6 +8551,95 @@ export type GetFeedQueryResult = Apollo.QueryResult<
GetFeedQuery,
GetFeedQueryVariables
>;
export const GetVideoFeedSessionCountDocument = gql`
query GetVideoFeedSessionCount(
$limit: Int! = 100
$filters: VideoFilterInput = null
$includePrivate: IncludePrivateEnum = MINE
$feedInput: VideoFeedInputGQL = null
) {
getFeedVideos(
limit: $limit
filters: $filters
includePrivate: $includePrivate
feedInput: $feedInput
) {
videos {
id
totalShots
}
}
}
`;
/**
* __useGetVideoFeedSessionCountQuery__
*
* To run a query within a React component, call `useGetVideoFeedSessionCountQuery` and pass it any options that fit your needs.
* When your component renders, `useGetVideoFeedSessionCountQuery` 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 } = useGetVideoFeedSessionCountQuery({
* variables: {
* limit: // value for 'limit'
* filters: // value for 'filters'
* includePrivate: // value for 'includePrivate'
* feedInput: // value for 'feedInput'
* },
* });
*/
export function useGetVideoFeedSessionCountQuery(
baseOptions?: Apollo.QueryHookOptions<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>(GetVideoFeedSessionCountDocument, options);
}
export function useGetVideoFeedSessionCountLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>(GetVideoFeedSessionCountDocument, options);
}
export function useGetVideoFeedSessionCountSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>(GetVideoFeedSessionCountDocument, options);
}
export type GetVideoFeedSessionCountQueryHookResult = ReturnType<
typeof useGetVideoFeedSessionCountQuery
>;
export type GetVideoFeedSessionCountLazyQueryHookResult = ReturnType<
typeof useGetVideoFeedSessionCountLazyQuery
>;
export type GetVideoFeedSessionCountSuspenseQueryHookResult = ReturnType<
typeof useGetVideoFeedSessionCountSuspenseQuery
>;
export type GetVideoFeedSessionCountQueryResult = Apollo.QueryResult<
GetVideoFeedSessionCountQuery,
GetVideoFeedSessionCountQueryVariables
>;
export const GetVideoFeedDocument = gql`
query GetVideoFeed(
$limit: Int! = 5
@@ -9642,6 +9801,65 @@ export type CancelSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CancelSubscriptionMutation,
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`
mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
reactToVideo(videoId: $videoId, reaction: $reaction)
@@ -10894,6 +11112,12 @@ export const GetUserDocument = gql`
query GetUser($userId: Int!) {
getUser(userId: $userId) {
...UserFragment
following {
id
}
followers {
id
}
}
}
${UserFragmentFragmentDoc}
@@ -11280,16 +11504,8 @@ export type GetUserTagsQueryResult = Apollo.QueryResult<
export const FollowUserDocument = gql`
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
username
}
}
`;
@@ -11339,16 +11555,8 @@ export type FollowUserMutationOptions = Apollo.BaseMutationOptions<
export const UnfollowUserDocument = gql`
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
username
}
}
`;
@@ -11403,11 +11611,13 @@ export const GetUserFollowingFollowersDocument = gql`
id
username
profileImageUri
isFollowedByCurrentUser
}
followers {
id
username
profileImageUri
isFollowedByCurrentUser
}
}
}
@@ -11987,6 +12197,7 @@ export const GetVideoDetailsDocument = gql`
endTime
makePercentage
medianRun
averageDifficulty
startTime
totalShots
totalShotsMade
@@ -12640,6 +12851,80 @@ export type GetMedianRunForVideoQueryResult = Apollo.QueryResult<
GetMedianRunForVideoQuery,
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`
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {

View File

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

View File

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

View File

@@ -50,6 +50,7 @@ fragment VideoCardFields on VideoGQL {
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name
@@ -89,6 +90,26 @@ fragment VideoCardFields on VideoGQL {
}
}
# Lightweight version of GetVideoFeed for counting sessions only
query GetVideoFeedSessionCount(
$limit: Int! = 100
$filters: VideoFilterInput = null
$includePrivate: IncludePrivateEnum = MINE
$feedInput: VideoFeedInputGQL = null
) {
getFeedVideos(
limit: $limit
filters: $filters
includePrivate: $includePrivate
feedInput: $feedInput
) {
videos {
id
totalShots
}
}
}
query GetVideoFeed(
$limit: Int! = 5
$after: String = null

View File

@@ -63,3 +63,14 @@ mutation CancelSubscription {
stripeSubscriptionId
}
}
mutation SubmitCancellationFeedback(
$reasons: [CancellationReasonEnum!]
$feedback: String
$metadata: CancellationFeedbackMetadataInput
) {
submitCancellationFeedback(
reasons: $reasons
feedback: $feedback
metadata: $metadata
)
}

View File

@@ -192,6 +192,7 @@ fragment ShotWithAllFeatures on ShotGQL {
streamSegmentType
}
playlist {
videoId
segmentDurations
}
}

View File

@@ -34,6 +34,12 @@ query getLoggedInUser {
query GetUser($userId: Int!) {
getUser(userId: $userId) {
...UserFragment
following {
id
}
followers {
id
}
}
}
@@ -88,31 +94,15 @@ query GetUserTags {
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
username
}
}
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
username
}
}
@@ -123,11 +113,13 @@ query getUserFollowingFollowers {
id
username
profileImageUri
isFollowedByCurrentUser
}
followers {
id
username
profileImageUri
isFollowedByCurrentUser
}
}
}

View File

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

File diff suppressed because it is too large Load Diff