Compare commits
20 Commits
dean/shot-
...
loewy/soci
| Author | SHA1 | Date | |
|---|---|---|---|
| 4ffd9f972d | |||
| 33707523f0 | |||
| 308c60c93b | |||
| 19ba43ad6d | |||
| 03b565dc7d | |||
|
|
901f4222a4 | ||
| 0f6e7b28d4 | |||
| 9b6b08c1ec | |||
| 0f01c71a43 | |||
| 238ade1384 | |||
| fe9b9ac9cc | |||
| 0cf074b35b | |||
| e3d7a5aaac | |||
| 65151d4b6b | |||
| 15fe6e5c3d | |||
| 926b2aab7a | |||
| bbe50cacb7 | |||
| 1953248639 | |||
| 032fa6b898 | |||
|
|
81565b7676 |
565
src/index.tsx
565
src/index.tsx
File diff suppressed because it is too large
Load Diff
25
src/operations/auth.gql
Normal file
25
src/operations/auth.gql
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
query getAuthBootstrap {
|
||||||
|
getAuthBootstrap {
|
||||||
|
status
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mutation completeAuthRegistration(
|
||||||
|
$username: String!
|
||||||
|
$agreesToMarketing: Boolean!
|
||||||
|
) {
|
||||||
|
completeAuthRegistration(
|
||||||
|
username: $username
|
||||||
|
agreesToMarketing: $agreesToMarketing
|
||||||
|
) {
|
||||||
|
errorCode
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,5 +19,10 @@ query getDeployedConfig {
|
|||||||
}
|
}
|
||||||
defaultAndroidRecordingFormat
|
defaultAndroidRecordingFormat
|
||||||
bucketUrl
|
bucketUrl
|
||||||
|
socialAuthProviderAvailability {
|
||||||
|
provider
|
||||||
|
platform
|
||||||
|
enabled
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,22 @@ query GetSessionCoach($videoId: Int!) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query GetSessionCoachGenerationStatus($videoId: Int!, $generationId: ID!) {
|
||||||
|
getSessionCoachGenerationStatus(
|
||||||
|
videoId: $videoId
|
||||||
|
generationId: $generationId
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
state
|
||||||
|
createdAt
|
||||||
|
updatedAt
|
||||||
|
startedAt
|
||||||
|
lastEnqueuedAt
|
||||||
|
enqueueCount
|
||||||
|
completedAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mutation RequestSessionCoachGeneration($videoId: Int!) {
|
mutation RequestSessionCoachGeneration($videoId: Int!) {
|
||||||
requestSessionCoachGeneration(videoId: $videoId) {
|
requestSessionCoachGeneration(videoId: $videoId) {
|
||||||
state
|
state
|
||||||
@@ -45,6 +61,21 @@ mutation RequestSessionCoachGeneration($videoId: Int!) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutation SubmitSessionCoachFeedback(
|
||||||
|
$videoId: Int!
|
||||||
|
$generationId: ID!
|
||||||
|
$response: SessionCoachFeedbackResponseEnum!
|
||||||
|
) {
|
||||||
|
submitSessionCoachFeedback(
|
||||||
|
videoId: $videoId
|
||||||
|
generationId: $generationId
|
||||||
|
response: $response
|
||||||
|
) {
|
||||||
|
response
|
||||||
|
updatedAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
|
fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
|
||||||
id
|
id
|
||||||
rank
|
rank
|
||||||
@@ -117,4 +148,8 @@ fragment SessionCoachGenerationFields on SessionCoachGenerationGQL {
|
|||||||
abstentionReason
|
abstentionReason
|
||||||
synthesisRationale
|
synthesisRationale
|
||||||
}
|
}
|
||||||
|
feedback {
|
||||||
|
response
|
||||||
|
updatedAt
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,10 @@ fragment DetectionPocketPointFields on PocketPointsGQL {
|
|||||||
# positions. Boxes, pocket boxes, and source points share the crop's
|
# positions. Boxes, pocket boxes, and source points share the crop's
|
||||||
# coordinate space; the crop locates that space in the full frame.
|
# coordinate space; the crop locates that space in the full frame.
|
||||||
#
|
#
|
||||||
# Only the photo query selects this. The live and shot queries read a
|
# Only the photo query selects this. The shot query returns its source
|
||||||
# frame out of a video the app never holds, so there is no image to
|
# frame (frameImage) but positions there come from the stored homography,
|
||||||
# overlay, and getLiveTableState is polled every five seconds.
|
# so there are no fresh boxes to draw; the live query returns no image at
|
||||||
|
# all and is polled every five seconds.
|
||||||
fragment TableStateDetectionFields on TableStateGQL {
|
fragment TableStateDetectionFields on TableStateGQL {
|
||||||
identifierToBox {
|
identifierToBox {
|
||||||
...DetectionBoxFields
|
...DetectionBoxFields
|
||||||
@@ -97,6 +98,9 @@ query GetShotTableState($shotId: Int!) {
|
|||||||
shotId
|
shotId
|
||||||
videoId
|
videoId
|
||||||
frameIndex
|
frameIndex
|
||||||
|
# The b64 JPEG frame the layout was detected in, so the client can show
|
||||||
|
# the shot's actual starting frame instead of the video's thumbnail.
|
||||||
|
frameImage
|
||||||
tableState {
|
tableState {
|
||||||
...TableStateLayoutFields
|
...TableStateLayoutFields
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ query getUsageStats($days: Int! = 30) {
|
|||||||
activationCohort
|
activationCohort
|
||||||
activationActivated
|
activationActivated
|
||||||
payingUsers
|
payingUsers
|
||||||
|
pastDueUsers
|
||||||
|
newPaidToday
|
||||||
newPaid7d
|
newPaid7d
|
||||||
newPaid30d
|
newPaid30d
|
||||||
retentionPrevActive
|
retentionPrevActive
|
||||||
@@ -18,6 +20,7 @@ query getUsageStats($days: Int! = 30) {
|
|||||||
activated7d
|
activated7d
|
||||||
paid7d
|
paid7d
|
||||||
activatedNotPaid7d
|
activatedNotPaid7d
|
||||||
|
paidTotal
|
||||||
}
|
}
|
||||||
totalUsers
|
totalUsers
|
||||||
totalVideos
|
totalVideos
|
||||||
|
|||||||
106
src/schema.gql
106
src/schema.gql
@@ -42,6 +42,25 @@ type AppleIapSubscriptionOptionsGQL {
|
|||||||
productIds: [String!]!
|
productIds: [String!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AuthBootstrapGQL {
|
||||||
|
status: AuthBootstrapStatusEnum!
|
||||||
|
user: UserGQL
|
||||||
|
}
|
||||||
|
|
||||||
|
enum AuthBootstrapStatusEnum {
|
||||||
|
REGISTERED
|
||||||
|
NEEDS_PROFILE
|
||||||
|
REGISTRATION_DISABLED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum AuthRegistrationErrorEnum {
|
||||||
|
USERNAME_UNAVAILABLE
|
||||||
|
REGISTRATION_DISABLED
|
||||||
|
VERIFIED_EMAIL_REQUIRED
|
||||||
|
INVALID_USERNAME
|
||||||
|
UNSUPPORTED_PROVIDER
|
||||||
|
}
|
||||||
|
|
||||||
type BallTrajectoryGQL {
|
type BallTrajectoryGQL {
|
||||||
ballId: Int!
|
ballId: Int!
|
||||||
points: [TrajectoryPointGQL!]!
|
points: [TrajectoryPointGQL!]!
|
||||||
@@ -214,6 +233,7 @@ type CohortStatsGQL {
|
|||||||
activated7d: Int!
|
activated7d: Int!
|
||||||
paid7d: Int!
|
paid7d: Int!
|
||||||
activatedNotPaid7d: Int!
|
activatedNotPaid7d: Int!
|
||||||
|
paidTotal: Int!
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommentGQL {
|
type CommentGQL {
|
||||||
@@ -224,6 +244,11 @@ type CommentGQL {
|
|||||||
replyToCommentId: Int
|
replyToCommentId: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CompleteAuthRegistrationGQL {
|
||||||
|
user: UserGQL
|
||||||
|
errorCode: AuthRegistrationErrorEnum
|
||||||
|
}
|
||||||
|
|
||||||
type CountLeaderboardGQL {
|
type CountLeaderboardGQL {
|
||||||
entries: [UserShotCountEntry!]!
|
entries: [UserShotCountEntry!]!
|
||||||
}
|
}
|
||||||
@@ -249,11 +274,6 @@ input CreatePoolHallCameraInput {
|
|||||||
claimTermsText: String = null
|
claimTermsText: String = null
|
||||||
}
|
}
|
||||||
|
|
||||||
input CreateShotShareLinkInput {
|
|
||||||
shotIds: [Int!]!
|
|
||||||
paddingSeconds: Float = null
|
|
||||||
}
|
|
||||||
|
|
||||||
input CreatePoolHallInput {
|
input CreatePoolHallInput {
|
||||||
name: String!
|
name: String!
|
||||||
address: String = null
|
address: String = null
|
||||||
@@ -264,6 +284,11 @@ input CreatePoolHallInput {
|
|||||||
timezone: String = null
|
timezone: String = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input CreateShotShareLinkInput {
|
||||||
|
shotIds: [Int!]!
|
||||||
|
paddingSeconds: Float = null
|
||||||
|
}
|
||||||
|
|
||||||
type CreateSubscriptionResultGQL {
|
type CreateSubscriptionResultGQL {
|
||||||
checkoutUrl: String!
|
checkoutUrl: String!
|
||||||
sessionId: String!
|
sessionId: String!
|
||||||
@@ -336,6 +361,7 @@ type DeployedConfigGQL {
|
|||||||
storageLimitEnforcementEnabled: Boolean!
|
storageLimitEnforcementEnabled: Boolean!
|
||||||
capabilityEnforcementEnabled: Boolean!
|
capabilityEnforcementEnabled: Boolean!
|
||||||
bannerMessages: [BannerGQL!]!
|
bannerMessages: [BannerGQL!]!
|
||||||
|
socialAuthProviderAvailability: [SocialAuthProviderAvailabilityGQL!]!
|
||||||
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
|
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
|
||||||
bucketUrl: String!
|
bucketUrl: String!
|
||||||
}
|
}
|
||||||
@@ -407,6 +433,7 @@ input FilterInput @oneOf {
|
|||||||
userId: [Int!]
|
userId: [Int!]
|
||||||
runId: [Int!]
|
runId: [Int!]
|
||||||
username: [String!]
|
username: [String!]
|
||||||
|
playerIndex: [Int!]
|
||||||
fargoRating: FloatRangeFilter
|
fargoRating: FloatRangeFilter
|
||||||
make: [Boolean!]
|
make: [Boolean!]
|
||||||
tags: [VideoTagInput!]
|
tags: [VideoTagInput!]
|
||||||
@@ -464,6 +491,8 @@ type FunnelStatsGQL {
|
|||||||
activationCohort: Int!
|
activationCohort: Int!
|
||||||
activationActivated: Int!
|
activationActivated: Int!
|
||||||
payingUsers: Int!
|
payingUsers: Int!
|
||||||
|
pastDueUsers: Int!
|
||||||
|
newPaidToday: Int!
|
||||||
newPaid7d: Int!
|
newPaid7d: Int!
|
||||||
newPaid30d: Int!
|
newPaid30d: Int!
|
||||||
retentionPrevActive: Int!
|
retentionPrevActive: Int!
|
||||||
@@ -728,7 +757,16 @@ type Mutation {
|
|||||||
shotId: Int!
|
shotId: Int!
|
||||||
fieldsToEdit: EditableShotFieldInputGQL!
|
fieldsToEdit: EditableShotFieldInputGQL!
|
||||||
): EditShotReturn!
|
): EditShotReturn!
|
||||||
|
submitSessionCoachFeedback(
|
||||||
|
videoId: Int!
|
||||||
|
generationId: ID!
|
||||||
|
response: SessionCoachFeedbackResponseEnum!
|
||||||
|
): SessionCoachFeedbackGQL!
|
||||||
requestSessionCoachGeneration(videoId: Int!): SessionCoachGQL!
|
requestSessionCoachGeneration(videoId: Int!): SessionCoachGQL!
|
||||||
|
completeAuthRegistration(
|
||||||
|
username: String!
|
||||||
|
agreesToMarketing: Boolean!
|
||||||
|
): CompleteAuthRegistrationGQL!
|
||||||
getProfileImageUploadLink(
|
getProfileImageUploadLink(
|
||||||
fileExt: String = ".png"
|
fileExt: String = ".png"
|
||||||
): GetProfileUploadLinkReturn!
|
): GetProfileUploadLinkReturn!
|
||||||
@@ -1068,6 +1106,10 @@ type Query {
|
|||||||
limit: Int! = 500
|
limit: Int! = 500
|
||||||
countRespectsLimit: Boolean! = false
|
countRespectsLimit: Boolean! = false
|
||||||
): GetRunsResult!
|
): GetRunsResult!
|
||||||
|
getSessionCoachGenerationStatus(
|
||||||
|
videoId: Int!
|
||||||
|
generationId: ID!
|
||||||
|
): SessionCoachGenerationStatusGQL
|
||||||
getSessionCoach(videoId: Int!): SessionCoachGQL!
|
getSessionCoach(videoId: Int!): SessionCoachGQL!
|
||||||
videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]!
|
videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]!
|
||||||
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
|
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
|
||||||
@@ -1106,6 +1148,7 @@ type Query {
|
|||||||
): [ShotGQL!]!
|
): [ShotGQL!]!
|
||||||
getShotsByIds(ids: [Int!]!): [ShotGQL!]!
|
getShotsByIds(ids: [Int!]!): [ShotGQL!]!
|
||||||
getUsageStats(days: Int! = 30): UsageStatsGQL!
|
getUsageStats(days: Int! = 30): UsageStatsGQL!
|
||||||
|
getAuthBootstrap: AuthBootstrapGQL!
|
||||||
getUser(userId: Int!): UserGQL
|
getUser(userId: Int!): UserGQL
|
||||||
doesUsernameExist(candidateUsername: String!): Boolean!
|
doesUsernameExist(candidateUsername: String!): Boolean!
|
||||||
getLoggedInUser: UserGQL
|
getLoggedInUser: UserGQL
|
||||||
@@ -1387,6 +1430,18 @@ type SessionCoachEvidenceGQL {
|
|||||||
baselineMakePercentage: Float
|
baselineMakePercentage: Float
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SessionCoachFeedbackGQL {
|
||||||
|
response: SessionCoachFeedbackResponseEnum!
|
||||||
|
updatedAt: DateTime!
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SessionCoachFeedbackResponseEnum {
|
||||||
|
HELPFUL
|
||||||
|
NOT_RELEVANT
|
||||||
|
NOT_INSIGHTFUL
|
||||||
|
NOT_ENOUGH_EVIDENCE
|
||||||
|
}
|
||||||
|
|
||||||
type SessionCoachGQL {
|
type SessionCoachGQL {
|
||||||
videoId: Int!
|
videoId: Int!
|
||||||
processingId: Int
|
processingId: Int
|
||||||
@@ -1438,6 +1493,7 @@ type SessionCoachGenerationGQL {
|
|||||||
completedAt: DateTime
|
completedAt: DateTime
|
||||||
decision: SessionCoachDecisionGQL
|
decision: SessionCoachDecisionGQL
|
||||||
diagnostics: SessionCoachGenerationDiagnosticsGQL
|
diagnostics: SessionCoachGenerationDiagnosticsGQL
|
||||||
|
feedback: SessionCoachFeedbackGQL
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SessionCoachGenerationStateEnum {
|
enum SessionCoachGenerationStateEnum {
|
||||||
@@ -1447,6 +1503,17 @@ enum SessionCoachGenerationStateEnum {
|
|||||||
FAILED
|
FAILED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SessionCoachGenerationStatusGQL {
|
||||||
|
id: ID!
|
||||||
|
state: SessionCoachGenerationStateEnum!
|
||||||
|
createdAt: DateTime!
|
||||||
|
updatedAt: DateTime!
|
||||||
|
startedAt: DateTime
|
||||||
|
lastEnqueuedAt: DateTime
|
||||||
|
enqueueCount: Int!
|
||||||
|
completedAt: DateTime
|
||||||
|
}
|
||||||
|
|
||||||
enum SessionCoachIneligibilityReasonEnum {
|
enum SessionCoachIneligibilityReasonEnum {
|
||||||
MULTIPLAYER
|
MULTIPLAYER
|
||||||
}
|
}
|
||||||
@@ -1459,6 +1526,11 @@ enum SessionCoachStateEnum {
|
|||||||
FAILED
|
FAILED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ShareLinkGQL {
|
||||||
|
slug: String!
|
||||||
|
url: String!
|
||||||
|
}
|
||||||
|
|
||||||
type ShotAnnotationGQL {
|
type ShotAnnotationGQL {
|
||||||
shotId: Int!
|
shotId: Int!
|
||||||
type: ShotAnnotationTypeGQL!
|
type: ShotAnnotationTypeGQL!
|
||||||
@@ -1527,6 +1599,7 @@ type ShotTableStateGQL {
|
|||||||
videoId: Int!
|
videoId: Int!
|
||||||
frameIndex: Int!
|
frameIndex: Int!
|
||||||
tableState: TableStateGQL!
|
tableState: TableStateGQL!
|
||||||
|
frameImage: String
|
||||||
}
|
}
|
||||||
|
|
||||||
input ShotsOrderingComponent @oneOf {
|
input ShotsOrderingComponent @oneOf {
|
||||||
@@ -1572,6 +1645,24 @@ enum SimulationEventType {
|
|||||||
BALL_STOP
|
BALL_STOP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum SocialAuthPlatformEnum {
|
||||||
|
WEB
|
||||||
|
IOS
|
||||||
|
ANDROID
|
||||||
|
}
|
||||||
|
|
||||||
|
type SocialAuthProviderAvailabilityGQL {
|
||||||
|
provider: SocialAuthProviderEnum!
|
||||||
|
platform: SocialAuthPlatformEnum!
|
||||||
|
enabled: Boolean!
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SocialAuthProviderEnum {
|
||||||
|
GOOGLE
|
||||||
|
APPLE
|
||||||
|
FACEBOOK
|
||||||
|
}
|
||||||
|
|
||||||
type SpinTypeBreakdownGQL {
|
type SpinTypeBreakdownGQL {
|
||||||
draw: Int!
|
draw: Int!
|
||||||
center: Int!
|
center: Int!
|
||||||
@@ -1920,11 +2011,6 @@ type UserSubscriptionStatusGQL {
|
|||||||
stripeSubscriptionId: String
|
stripeSubscriptionId: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type ShareLinkGQL {
|
|
||||||
slug: String!
|
|
||||||
url: String!
|
|
||||||
}
|
|
||||||
|
|
||||||
type VideoExportJobGQL {
|
type VideoExportJobGQL {
|
||||||
id: Int!
|
id: Int!
|
||||||
videoId: Int!
|
videoId: Int!
|
||||||
|
|||||||
Reference in New Issue
Block a user