diff --git a/common/api.ts b/common/api.ts new file mode 100644 index 00000000..02dba409 --- /dev/null +++ b/common/api.ts @@ -0,0 +1,22 @@ +import { ENV_CONFIG } from 'common/envs/constants' + +export class APIError extends Error { + code: number + details?: unknown + constructor(code: number, message: string, details?: unknown) { + super(message) + this.code = code + this.name = 'APIError' + this.details = details + } +} + +export function getFunctionUrl(name: string) { + if (process.env.NEXT_PUBLIC_FIREBASE_EMULATE) { + const { projectId, region } = ENV_CONFIG.firebaseConfig + return `http://localhost:5001/${projectId}/${region}/${name}` + } else { + const { cloudRunId, cloudRunRegion } = ENV_CONFIG + return `https://${name}-${cloudRunId}-${cloudRunRegion}.a.run.app` + } +} diff --git a/web/components/answers/answer-bet-panel.tsx b/web/components/answers/answer-bet-panel.tsx index 705433b1..6499ce36 100644 --- a/web/components/answers/answer-bet-panel.tsx +++ b/web/components/answers/answer-bet-panel.tsx @@ -6,7 +6,7 @@ import { Answer } from 'common/answer' import { FreeResponseContract } from 'common/contract' import { BuyAmountInput } from '../amount-input' import { Col } from '../layout/col' -import { APIError, placeBet } from 'web/lib/firebase/api-call' +import { APIError, placeBet } from 'web/lib/firebase/api' import { Row } from '../layout/row' import { Spacer } from '../layout/spacer' import { diff --git a/web/components/answers/answer-resolve-panel.tsx b/web/components/answers/answer-resolve-panel.tsx index 6b8e2885..5b59f050 100644 --- a/web/components/answers/answer-resolve-panel.tsx +++ b/web/components/answers/answer-resolve-panel.tsx @@ -4,7 +4,7 @@ import { useState } from 'react' import { Contract, FreeResponse } from 'common/contract' import { Col } from '../layout/col' -import { APIError, resolveMarket } from 'web/lib/firebase/api-call' +import { APIError, resolveMarket } from 'web/lib/firebase/api' import { Row } from '../layout/row' import { ChooseCancelSelector } from '../yes-no-selector' import { ResolveConfirmationButton } from '../confirmation-button' diff --git a/web/components/answers/create-answer-panel.tsx b/web/components/answers/create-answer-panel.tsx index 41745b09..ce266778 100644 --- a/web/components/answers/create-answer-panel.tsx +++ b/web/components/answers/create-answer-panel.tsx @@ -6,7 +6,7 @@ import { findBestMatch } from 'string-similarity' import { FreeResponseContract } from 'common/contract' import { BuyAmountInput } from '../amount-input' import { Col } from '../layout/col' -import { APIError, createAnswer } from 'web/lib/firebase/api-call' +import { APIError, createAnswer } from 'web/lib/firebase/api' import { Row } from '../layout/row' import { formatMoney, diff --git a/web/components/bet-panel.tsx b/web/components/bet-panel.tsx index 271eeecc..558697ef 100644 --- a/web/components/bet-panel.tsx +++ b/web/components/bet-panel.tsx @@ -19,8 +19,8 @@ import { getBinaryCpmmBetInfo } from 'common/new-bet' import { Title } from './title' import { User } from 'web/lib/firebase/users' import { Bet, LimitBet } from 'common/bet' -import { APIError, placeBet } from 'web/lib/firebase/api-call' -import { sellShares } from 'web/lib/firebase/api-call' +import { APIError, placeBet } from 'web/lib/firebase/api' +import { sellShares } from 'web/lib/firebase/api' import { AmountInput, BuyAmountInput } from './amount-input' import { InfoTooltip } from './info-tooltip' import { BinaryOutcomeLabel } from './outcome-label' diff --git a/web/components/bets-list.tsx b/web/components/bets-list.tsx index 72ac23db..40eaf04b 100644 --- a/web/components/bets-list.tsx +++ b/web/components/bets-list.tsx @@ -23,7 +23,7 @@ import { } from 'web/lib/firebase/contracts' import { Row } from './layout/row' import { UserLink } from './user-page' -import { sellBet } from 'web/lib/firebase/api-call' +import { sellBet } from 'web/lib/firebase/api' import { ConfirmationButton } from './confirmation-button' import { OutcomeLabel, YesLabel, NoLabel } from './outcome-label' import { filterDefined } from 'common/util/array' diff --git a/web/components/contract/quick-bet.tsx b/web/components/contract/quick-bet.tsx index 0ce1c3f5..09a5d4bc 100644 --- a/web/components/contract/quick-bet.tsx +++ b/web/components/contract/quick-bet.tsx @@ -22,14 +22,14 @@ import { import { useState } from 'react' import toast from 'react-hot-toast' import { useUserContractBets } from 'web/hooks/use-user-bets' -import { placeBet } from 'web/lib/firebase/api-call' +import { placeBet } from 'web/lib/firebase/api' import { getBinaryProb, getBinaryProbPercent } from 'web/lib/firebase/contracts' import TriangleDownFillIcon from 'web/lib/icons/triangle-down-fill-icon' import TriangleFillIcon from 'web/lib/icons/triangle-fill-icon' import { Col } from '../layout/col' import { OUTCOME_TO_COLOR } from '../outcome-label' import { useSaveBinaryShares } from '../use-save-binary-shares' -import { sellShares } from 'web/lib/firebase/api-call' +import { sellShares } from 'web/lib/firebase/api' import { calculateCpmmSale, getCpmmProbability } from 'common/calculate-cpmm' import { track } from 'web/lib/service/analytics' import { formatNumericProbability } from 'common/pseudo-numeric' diff --git a/web/components/groups/create-group-button.tsx b/web/components/groups/create-group-button.tsx index b6b11292..0685d8e4 100644 --- a/web/components/groups/create-group-button.tsx +++ b/web/components/groups/create-group-button.tsx @@ -9,7 +9,7 @@ import { Title } from '../title' import { FilterSelectUsers } from 'web/components/filter-select-users' import { User } from 'common/user' import { MAX_GROUP_NAME_LENGTH } from 'common/group' -import { createGroup } from 'web/lib/firebase/api-call' +import { createGroup } from 'web/lib/firebase/api' export function CreateGroupButton(props: { user: User diff --git a/web/components/limit-bets.tsx b/web/components/limit-bets.tsx index 5a6a67c0..82ae627d 100644 --- a/web/components/limit-bets.tsx +++ b/web/components/limit-bets.tsx @@ -5,7 +5,7 @@ import { getFormattedMappedValue } from 'common/pseudo-numeric' import { formatMoney, formatPercent } from 'common/util/format' import { sortBy } from 'lodash' import { useState } from 'react' -import { cancelBet } from 'web/lib/firebase/api-call' +import { cancelBet } from 'web/lib/firebase/api' import { Col } from './layout/col' import { LoadingIndicator } from './loading-indicator' import { BinaryOutcomeLabel, PseudoNumericOutcomeLabel } from './outcome-label' diff --git a/web/components/liquidity-panel.tsx b/web/components/liquidity-panel.tsx index d1e066be..7ecadeb7 100644 --- a/web/components/liquidity-panel.tsx +++ b/web/components/liquidity-panel.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react' import { CPMMContract } from 'common/contract' import { formatMoney } from 'common/util/format' import { useUser } from 'web/hooks/use-user' -import { addLiquidity, withdrawLiquidity } from 'web/lib/firebase/api-call' +import { addLiquidity, withdrawLiquidity } from 'web/lib/firebase/api' import { AmountInput } from './amount-input' import { Row } from './layout/row' import { useUserLiquidity } from 'web/hooks/use-liquidity' diff --git a/web/components/notifications-icon.tsx b/web/components/notifications-icon.tsx index 2938fd17..478b4ad4 100644 --- a/web/components/notifications-icon.tsx +++ b/web/components/notifications-icon.tsx @@ -6,7 +6,7 @@ import { usePrivateUser, useUser } from 'web/hooks/use-user' import { useRouter } from 'next/router' import { useUnseenPreferredNotificationGroups } from 'web/hooks/use-notifications' import { NOTIFICATIONS_PER_PAGE } from 'web/pages/notifications' -import { requestBonuses } from 'web/lib/firebase/api-call' +import { requestBonuses } from 'web/lib/firebase/api' import { PrivateUser } from 'common/user' export default function NotificationsIcon(props: { className?: string }) { diff --git a/web/components/numeric-bet-panel.tsx b/web/components/numeric-bet-panel.tsx index 9246bc89..e3b4bc29 100644 --- a/web/components/numeric-bet-panel.tsx +++ b/web/components/numeric-bet-panel.tsx @@ -10,9 +10,9 @@ import { import { NumericContract } from 'common/contract' import { formatPercent, formatMoney } from 'common/util/format' -import { useUser } from '../hooks/use-user' -import { APIError, placeBet } from '../lib/firebase/api-call' -import { User } from '../lib/firebase/users' +import { useUser } from 'web/hooks/use-user' +import { APIError, placeBet } from 'web/lib/firebase/api' +import { User } from 'web/lib/firebase/users' import { BuyAmountInput } from './amount-input' import { BucketInput } from './bucket-input' import { Col } from './layout/col' diff --git a/web/components/numeric-resolution-panel.tsx b/web/components/numeric-resolution-panel.tsx index 98a2aabc..371dd94b 100644 --- a/web/components/numeric-resolution-panel.tsx +++ b/web/components/numeric-resolution-panel.tsx @@ -7,7 +7,7 @@ import { NumberCancelSelector } from './yes-no-selector' import { Spacer } from './layout/spacer' import { ResolveConfirmationButton } from './confirmation-button' import { NumericContract, PseudoNumericContract } from 'common/contract' -import { APIError, resolveMarket } from 'web/lib/firebase/api-call' +import { APIError, resolveMarket } from 'web/lib/firebase/api' import { BucketInput } from './bucket-input' import { getPseudoProbability } from 'common/pseudo-numeric' diff --git a/web/components/resolution-panel.tsx b/web/components/resolution-panel.tsx index a46d9478..10dee789 100644 --- a/web/components/resolution-panel.tsx +++ b/web/components/resolution-panel.tsx @@ -6,7 +6,7 @@ import { User } from 'web/lib/firebase/users' import { YesNoCancelSelector } from './yes-no-selector' import { Spacer } from './layout/spacer' import { ResolveConfirmationButton } from './confirmation-button' -import { APIError, resolveMarket } from 'web/lib/firebase/api-call' +import { APIError, resolveMarket } from 'web/lib/firebase/api' import { ProbabilitySelector } from './probability-selector' import { DPM_CREATOR_FEE } from 'common/fees' import { getProbability } from 'common/calculate' diff --git a/web/components/tipper.tsx b/web/components/tipper.tsx index e4b6580f..68ca5308 100644 --- a/web/components/tipper.tsx +++ b/web/components/tipper.tsx @@ -11,7 +11,7 @@ import { debounce, sum } from 'lodash' import { useEffect, useRef, useState } from 'react' import { CommentTips } from 'web/hooks/use-tip-txns' import { useUser } from 'web/hooks/use-user' -import { transact } from 'web/lib/firebase/api-call' +import { transact } from 'web/lib/firebase/api' import { track } from 'web/lib/service/analytics' import { Row } from './layout/row' import { Tooltip } from './tooltip' diff --git a/web/lib/api/proxy.ts b/web/lib/api/proxy.ts index 294868ac..98ea161d 100644 --- a/web/lib/api/proxy.ts +++ b/web/lib/api/proxy.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from 'next' import { promisify } from 'util' import { pipeline } from 'stream' -import { getFunctionUrl } from 'web/lib/firebase/api-call' +import { getFunctionUrl } from 'common/api' import fetch, { Headers, Response } from 'node-fetch' function getProxiedRequestHeaders(req: NextApiRequest, whitelist: string[]) { diff --git a/web/lib/firebase/api-call.ts b/web/lib/firebase/api.ts similarity index 71% rename from web/lib/firebase/api-call.ts rename to web/lib/firebase/api.ts index fc1e78bd..a6bd4359 100644 --- a/web/lib/firebase/api-call.ts +++ b/web/lib/firebase/api.ts @@ -1,16 +1,6 @@ import { auth } from './users' -import { ENV_CONFIG } from 'common/envs/constants' - -export class APIError extends Error { - code: number - details?: string - constructor(code: number, message: string, details?: string) { - super(message) - this.code = code - this.name = 'APIError' - this.details = details - } -} +import { APIError, getFunctionUrl } from 'common/api' +export { APIError } from 'common/api' export async function call(url: string, method: string, params: any) { const user = auth.currentUser @@ -35,21 +25,6 @@ export async function call(url: string, method: string, params: any) { }) } -// Our users access the API through the Vercel proxy routes at /api/v0/blah, -// but right now at least until we get performance under control let's have the -// app just hit the cloud functions directly -- there's no difference and it's -// one less hop - -export function getFunctionUrl(name: string) { - if (process.env.NEXT_PUBLIC_FIREBASE_EMULATE) { - const { projectId, region } = ENV_CONFIG.firebaseConfig - return `http://localhost:5001/${projectId}/${region}/${name}` - } else { - const { cloudRunId, cloudRunRegion } = ENV_CONFIG - return `https://${name}-${cloudRunId}-${cloudRunRegion}.a.run.app` - } -} - export function createAnswer(params: any) { return call(getFunctionUrl('createanswer'), 'POST', params) } diff --git a/web/lib/firebase/users.ts b/web/lib/firebase/users.ts index d2e1ee04..29cc9266 100644 --- a/web/lib/firebase/users.ts +++ b/web/lib/firebase/users.ts @@ -23,7 +23,7 @@ import { import { zip } from 'lodash' import { app, db } from './init' import { PortfolioMetrics, PrivateUser, User } from 'common/user' -import { createUser } from './api-call' +import { createUser } from './api' import { coll, getValue, diff --git a/web/lib/service/stripe.ts b/web/lib/service/stripe.ts index bedd68aa..64d79487 100644 --- a/web/lib/service/stripe.ts +++ b/web/lib/service/stripe.ts @@ -1,4 +1,4 @@ -import { getFunctionUrl } from 'web/lib/firebase/api-call' +import { getFunctionUrl } from 'common/api' export const checkoutURL = ( userId: string, diff --git a/web/pages/charity/[charitySlug].tsx b/web/pages/charity/[charitySlug].tsx index c3e0912a..2cefa13b 100644 --- a/web/pages/charity/[charitySlug].tsx +++ b/web/pages/charity/[charitySlug].tsx @@ -10,7 +10,7 @@ import { Spacer } from 'web/components/layout/spacer' import { User } from 'common/user' import { useUser } from 'web/hooks/use-user' import { Linkify } from 'web/components/linkify' -import { transact } from 'web/lib/firebase/api-call' +import { transact } from 'web/lib/firebase/api' import { charities, Charity } from 'common/charity' import { useRouter } from 'next/router' import Custom404 from '../404' diff --git a/web/pages/create.tsx b/web/pages/create.tsx index f26d5687..f9b0dd00 100644 --- a/web/pages/create.tsx +++ b/web/pages/create.tsx @@ -6,7 +6,7 @@ import Textarea from 'react-expanding-textarea' import { Spacer } from 'web/components/layout/spacer' import { useUser } from 'web/hooks/use-user' import { Contract, contractPath } from 'web/lib/firebase/contracts' -import { createMarket } from 'web/lib/firebase/api-call' +import { createMarket } from 'web/lib/firebase/api' import { FIXED_ANTE } from 'common/antes' import { InfoTooltip } from 'web/components/info-tooltip' import { Page } from 'web/components/page' diff --git a/web/pages/link/[slug].tsx b/web/pages/link/[slug].tsx index b36a9057..01597a15 100644 --- a/web/pages/link/[slug].tsx +++ b/web/pages/link/[slug].tsx @@ -2,7 +2,7 @@ import { useRouter } from 'next/router' import { useState } from 'react' import { SEO } from 'web/components/SEO' import { Title } from 'web/components/title' -import { claimManalink } from 'web/lib/firebase/api-call' +import { claimManalink } from 'web/lib/firebase/api' import { useManalink } from 'web/lib/firebase/manalinks' import { ManalinkCard } from 'web/components/manalink-card' import { useUser } from 'web/hooks/use-user' diff --git a/web/pages/make-predictions.tsx b/web/pages/make-predictions.tsx index ce694278..b22fe371 100644 --- a/web/pages/make-predictions.tsx +++ b/web/pages/make-predictions.tsx @@ -16,7 +16,7 @@ import { Linkify } from 'web/components/linkify' import { Page } from 'web/components/page' import { Title } from 'web/components/title' import { useUser } from 'web/hooks/use-user' -import { createMarket } from 'web/lib/firebase/api-call' +import { createMarket } from 'web/lib/firebase/api' import { contractPath } from 'web/lib/firebase/contracts' type Prediction = { diff --git a/web/pages/profile.tsx b/web/pages/profile.tsx index 62177825..b80698ae 100644 --- a/web/pages/profile.tsx +++ b/web/pages/profile.tsx @@ -9,7 +9,7 @@ import { Title } from 'web/components/title' import { usePrivateUser, useUser } from 'web/hooks/use-user' import { formatMoney } from 'common/util/format' import { cleanDisplayName, cleanUsername } from 'common/util/clean-username' -import { changeUserInfo } from 'web/lib/firebase/api-call' +import { changeUserInfo } from 'web/lib/firebase/api' import { uploadImage } from 'web/lib/firebase/storage' import { Col } from 'web/components/layout/col' import { Row } from 'web/components/layout/row'