@layerfi/components 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +339 -145
- package/dist/esm/index.js.map +4 -4
- package/dist/index.css +106 -0
- package/dist/index.css.map +7 -0
- package/dist/index.d.ts +41 -7
- package/dist/index.esm.css +106 -0
- package/dist/index.esm.css.map +7 -0
- package/dist/index.esm.js +252 -0
- package/dist/index.esm.js.map +7 -0
- package/dist/index.js +354 -160
- package/dist/index.js.map +4 -4
- package/dist/styles/index.css +64 -1
- package/dist/styles/index.css.map +3 -3
- package/package.json +1 -1
- package/index.d.ts +0 -1309
package/dist/esm/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/components/BalanceSheet/BalanceSheet.tsx", "../../src/api/util.ts", "../../src/api/layer/authenticate.ts", "../../src/api/layer/balance_sheet.json", "../../src/api/layer/balance_sheet.ts", "../../src/models/APIError.ts", "../../src/api/layer/authenticated_http.ts", "../../src/api/layer/bankTransactions.ts", "../../src/api/layer/categories.ts", "../../src/api/layer/chart_of_accounts.ts", "../../src/api/layer/profit_and_loss.ts", "../../src/api/layer.ts", "../../src/hooks/useLayerContext/useLayerContext.tsx", "../../src/contexts/LayerContext/LayerContext.tsx", "../../src/hooks/useBalanceSheet/useBalanceSheet.tsx", "../../src/icons/DownloadCloud.tsx", "../../src/components/BalanceSheetDatePicker/BalanceSheetDatePicker.tsx", "../../src/icons/Calendar.tsx", "../../src/components/BalanceSheetRow/BalanceSheetRow.tsx", "../../src/icons/ChevronDown.tsx", "../../src/models/Money.ts", "../../src/components/SkeletonBalanceSheetRow/SkeletonBalanceSheetRow.tsx", "../../src/components/BankTransactions/BankTransactions.tsx", "../../src/hooks/useBankTransactions/useBankTransactions.tsx", "../../src/hooks/useElementSize/useElementSize.ts", "../../src/components/BankTransactionListItem/BankTransactionListItem.tsx", "../../src/components/Button/Button.tsx", "../../src/components/Button/SubmitButton.tsx", "../../src/icons/AlertCircle.tsx", "../../src/icons/Check.tsx", "../../src/icons/CheckCircle.tsx", "../../src/icons/Loader.tsx", "../../src/components/Tooltip/Tooltip.tsx", "../../src/components/Tooltip/useTooltip.ts", "../../src/components/CategoryMenu/CategoryMenu.tsx", "../../src/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow.tsx", "../../src/icons/FolderPlus.tsx", "../../src/icons/Link.tsx", "../../src/icons/RefreshCcw.tsx", "../../src/icons/
|
|
4
|
-
"sourcesContent": ["import React, { useState } from 'react'\nimport { useBalanceSheet } from '../../hooks/useBalanceSheet'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { BalanceSheetDatePicker } from '../BalanceSheetDatePicker'\nimport { BalanceSheetRow } from '../BalanceSheetRow'\nimport { SkeletonBalanceSheetRow } from '../SkeletonBalanceSheetRow'\nimport { format, parseISO } from 'date-fns'\n\nexport const BalanceSheet = () => {\n const [effectiveDate, setEffectiveDate] = useState(new Date())\n const { data, isLoading } = useBalanceSheet(effectiveDate)\n const assets = {\n name: 'Assets',\n display_name: 'Assets',\n line_items: data?.assets || [],\n value: undefined,\n }\n const lne = {\n name: 'LiabilitiesAndEquity',\n display_name: 'Liabilities & Equity',\n line_items: data?.liabilities_and_equity || [],\n value: undefined,\n }\n const dateString = format(effectiveDate, 'LLLL d, yyyy')\n return (\n <div className='Layer__component Layer__balance-sheet'>\n <div className='Layer__balance-sheet__header'>\n <h2 className='Layer__balance-sheet__title'>\n Balance Sheet\n <span className='Layer__balance-sheet__date'>{dateString}</span>\n </h2>\n <BalanceSheetDatePicker\n value={effectiveDate}\n onChange={event => setEffectiveDate(parseISO(event.target.value))}\n />\n <button className='Layer__balance-sheet__download-button'>\n <DownloadCloud />\n Download\n </button>\n </div>\n {!data || isLoading ? (\n <div className='Layer__balance-sheet__table'>\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n <SkeletonBalanceSheetRow />\n </SkeletonBalanceSheetRow>\n </SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n </SkeletonBalanceSheetRow>\n </div>\n ) : (\n <div className='Layer__balance-sheet__table'>\n <BalanceSheetRow\n key={assets.name}\n lineItem={assets}\n summarize={false}\n />\n <BalanceSheetRow key={lne.name} lineItem={lne} summarize={false} />\n </div>\n )}\n </div>\n )\n}\n", "export const formStringFromObject = (\n object: Record<string, string | number | boolean>,\n): string =>\n Object.entries(object)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&')\n", "import { OAuthResponse } from '../../types'\nimport { formStringFromObject } from '../util'\n\ntype AuthenticationArguments = {\n appId: string\n appSecret: string\n authenticationUrl?: string\n scope: string\n}\nexport const authenticate =\n ({\n appId,\n appSecret,\n authenticationUrl = 'https://auth.layerfi.com/oauth2/token',\n scope,\n }: AuthenticationArguments) =>\n (): Promise<OAuthResponse> =>\n fetch(authenticationUrl, {\n method: 'POST',\n headers: {\n Authorization: 'Basic ' + btoa(appId + ':' + appSecret),\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formStringFromObject({\n grant_type: 'client_credentials',\n scope,\n client_id: appId,\n }),\n }).then(res => res.json() as Promise<OAuthResponse>)\n", "{\n \"business_id\": \"05eb0771-ae7d-4cd1-ae7f-cc8765351afc\",\n \"type\": \"Balance_Sheet\",\n \"start_date\": \"2023-01-01T00:00:00Z\",\n \"end_date\": \"2023-01-31T00:00:00Z\",\n \"assets\": [\n {\n \"name\": \"CURRENT_ASSETS\",\n \"display_name\": \"Current Assets\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"BANK_ACCOUNTS\",\n \"display_name\": \"Bank Accounts\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"display_name\": \"Checking Account 123\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"display_name\": \"Savings Account 456\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"name\": \"ACCOUNTS_RECEIVABLE\",\n \"display_name\": \"Bank Accounts\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"account_id\": \"cc7861f7-d8b3-4ab9-b853-6b85838199ef\",\n \"display_name\": \"Accounts Receivable - Customer A\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"account_id\": \"23606d6a-4e78-406b-9283-76bfb750639f\",\n \"display_name\": \"Accounts Receivable - Customer B\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"name\": \"OTHER_ASSETS\",\n \"display_name\": \"Other Assets\",\n \"value\": \"150\",\n \"line_items\": [\n {\n \"account_id\": \"40816f76-1409-4727-b733-c4c126f0a725\",\n \"display_name\": \"Inventory Item A\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n }\n ]\n }\n ],\n \"liabilities_and_equity\": [\n {\n \"name\": \"LIABILITIES\",\n \"display_name\": \"Liabilities\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"CURRENT_LIABILITIES\",\n \"display_name\": \"Current Liabilities\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"account_id\": \"40816f76-1409-4727-b733-c4c126f0a725\",\n \"display_name\": \"ACCOUNTS_PAYABLE\",\n \"value\": \"50000\",\n \"line_items\": [\n {\n \"account_id\": \"261d0ef4-6d35-4081-8c82-685114fd497d\",\n \"display_name\": \"Supplier A\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"account_id\": \"5123c5eb-28ce-4cce-90bd-389e4befb645\",\n \"display_name\": \"Credit Cards\",\n \"value\": \"50000\",\n \"line_items\": [\n {\n \"account_id\": \"beb41e99-0539-4d97-8faf-c8464eac60dc\",\n \"display_name\": \"Visa 5678\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"account_id\": \"7261b324-aa1a-4c03-9ac8-0a40980d5886\",\n \"display_name\": \"Other current Liabilities\",\n \"value\": \"2309\",\n \"line_items\": []\n }\n ]\n }\n ]\n },\n {\n \"name\": \"EQUITY\",\n \"display_name\": \"Equity\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"OPENING_BALANCE_EQUITY\",\n \"display_name\": \"Opening Balance Equity\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"name\": \"RETAINED_EARNINGS\",\n \"display_name\": \"Retained Earnings\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"name\": \"NET_INCOME\",\n \"display_name\": \"Net Income\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n }\n ],\n \"fully_categorized\": true\n}\n", "// import { BalanceSheet } from '../../types'\n// import { get } from './authenticated_http'\nimport { BalanceSheet } from '../../types'\nimport Data from './balance_sheet.json'\n\n// export const getBalanceSheet = get<{\n// data?: BalanceSheet\n// error?: unknown\n// }>(\n// ({ businessId }) =>\n// `https://sandbox.layerfi.com/v1/businesses/${businessId}/balances`,\n// )\n\nexport interface GetBalanceSheetParams {\n businessId: string\n date: string\n}\n\nexport const getBalanceSheet =\n (_token: string, _params: { params: GetBalanceSheetParams }) => () =>\n Data as unknown as BalanceSheet\n", "export interface APIErrorMessage {\n type?: string\n description?: string\n}\n\nexport class APIError extends Error {\n code?: number\n info?: string\n messages?: APIErrorMessage[]\n\n constructor(message: string, code?: number, messages?: APIErrorMessage[]) {\n super(message)\n this.name = 'APIError'\n this.code = code\n this.messages = messages\n\n Object.setPrototypeOf(this, APIError.prototype)\n }\n\n getMessage() {\n return this.message\n }\n\n getAllMessages() {\n return this.messages?.map(x => x.description)\n }\n}\n", "import { APIError } from '../../models/APIError'\n\nexport type HTTPVerb = 'get' | 'put' | 'post' | 'patch' | 'options' | 'delete'\n\nexport const get =\n <\n Return extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, string | undefined> = Record<\n string,\n string | undefined\n >,\n >(\n url: (params: Params) => string,\n ) =>\n (\n baseUrl: string,\n accessToken: string | undefined,\n options?: { params?: Params },\n ) =>\n (): Promise<Return> =>\n fetch(`${baseUrl}${url(options?.params || ({} as Params))}`, {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n .then(res => handleResponse<Return>(res))\n .catch(error => handleException(error))\n\nexport const request =\n (verb: HTTPVerb) =>\n <\n Return extends Record<string, unknown> = Record<string, unknown>,\n Body extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, string | undefined> = Record<\n string,\n string | undefined\n >,\n >(\n url: (params: Params) => string,\n ) =>\n (\n baseUrl: string,\n accessToken: string | undefined,\n options?: {\n params?: Params\n body?: Body\n },\n ): Promise<Return> =>\n fetch(`${baseUrl}${url(options?.params || ({} as Params))}`, {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n method: verb.toUpperCase(),\n body: JSON.stringify(options?.body),\n })\n .then(res => handleResponse<Return>(res))\n .catch(error => handleException(error))\n\nexport const post = request('post')\nexport const put = request('put')\n\nconst handleResponse = async <Return>(res: Response) => {\n if (!res.ok) {\n const errors = await tryToReadErrorsFromResponse(res)\n const apiError = new APIError(\n 'An error occurred while fetching the data from API.',\n res.status,\n errors,\n )\n throw apiError\n }\n\n const parsedResponse = await res.json()\n if (parsedResponse && 'errors' in parsedResponse) {\n const apiError = new APIError(\n 'Errors in the API response.',\n res.status,\n parsedResponse.errors ?? [],\n )\n throw apiError\n }\n\n return parsedResponse as Return\n}\n\nconst handleException = async (error: Error) => {\n if (error.name === 'APIError') {\n throw error\n }\n\n const apiError = new APIError(\n 'An error occurred while parsing the data from API.',\n undefined,\n [],\n )\n throw apiError\n}\n\nconst tryToReadErrorsFromResponse = async (res?: Response) => {\n try {\n const data = await res?.json()\n return data?.errors ?? []\n } catch (_err) {\n return []\n }\n}\n", "import { CategoryUpdate, BankTransaction, Metadata } from '../../types'\nimport { get, put } from './authenticated_http'\n\nexport type GetBankTransactionsReturn = {\n data?: BankTransaction[]\n meta?: Metadata\n error?: unknown\n}\nexport interface GetBankTransactionsParams\n extends Record<string, string | undefined> {\n businessId: string\n sortOrder?: 'ASC' | 'DESC'\n sortBy?: string\n}\nexport const getBankTransactions = get<\n GetBankTransactionsReturn,\n GetBankTransactionsParams\n>(\n ({\n businessId,\n sortBy = 'date',\n sortOrder = 'DESC',\n }: GetBankTransactionsParams) =>\n `/v1/businesses/${businessId}/bank-transactions?sort_by=${sortBy}&sort_order=${sortOrder}`,\n)\n\nexport const categorizeBankTransaction = put<\n { data: BankTransaction; errors: unknown },\n CategoryUpdate\n>(\n ({ businessId, bankTransactionId }) =>\n `/v1/businesses/${businessId}/bank-transactions/${bankTransactionId}/categorize`,\n)\n", "import { Category } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getCategories = get<{\n data: {\n type: 'Category_List'\n categories: Category[]\n }\n}>(({ businessId }) => `/v1/businesses/${businessId}/categories`)\n", "import { AccountAlternate, ChartOfAccounts, NewAccount } from '../../types'\nimport { get, post } from './authenticated_http'\n\nexport const getChartOfAccounts = get<{ data: ChartOfAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const createAccount = post<{ data: AccountAlternate }, NewAccount>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n", "import { ProfitAndLoss } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getProfitAndLoss = get<{\n data?: ProfitAndLoss\n error?: unknown\n}>(\n ({ businessId, startDate, endDate }) =>\n `/v1/businesses/${businessId}/reports/profit-and-loss?start_date=${\n startDate ? encodeURIComponent(startDate) : ''\n }&end_date=${endDate ? encodeURIComponent(endDate) : ''}`,\n)\n", "import { authenticate } from './layer/authenticate'\nimport { getBalanceSheet } from './layer/balance_sheet'\nimport {\n getBankTransactions,\n categorizeBankTransaction,\n} from './layer/bankTransactions'\nimport { getCategories } from './layer/categories'\nimport { getChartOfAccounts, createAccount } from './layer/chart_of_accounts'\nimport { getProfitAndLoss } from './layer/profit_and_loss'\n\nexport const Layer = {\n authenticate,\n categorizeBankTransaction,\n createAccount,\n getBalanceSheet,\n getBankTransactions,\n getCategories,\n getChartOfAccounts,\n getProfitAndLoss,\n}\n", "import { useContext } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\n\nexport const useLayerContext = () => useContext(LayerContext)\n", "import { createContext } from 'react'\nimport { LayerContextValues } from '../../types'\nimport { LayerThemeConfig } from '../../types/layer_context'\n\nexport const LayerContext = createContext<\n LayerContextValues & { setTheme: (theme: LayerThemeConfig) => void }\n>({\n auth: {\n access_token: '',\n expires_at: new Date(2000, 1, 1),\n expires_in: -1,\n token_type: '',\n },\n businessId: '',\n categories: [],\n apiUrl: '',\n theme: undefined,\n setTheme: () => undefined,\n})\n", "import { Layer } from '../../api/layer'\nimport { BalanceSheet } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport { format, startOfDay } from 'date-fns'\nimport useSWR from 'swr'\n\ntype UseBalanceSheet = (date?: Date) => {\n data: BalanceSheet | undefined\n isLoading: boolean\n error: unknown\n}\n\nexport const useBalanceSheet: UseBalanceSheet = (date: Date = new Date()) => {\n const { auth, businessId } = useLayerContext()\n const dateString = format(startOfDay(date), 'yyyy-mm-dd')\n\n const { data, isLoading, error } = useSWR(\n businessId &&\n dateString &&\n auth?.access_token &&\n `balance-sheet-${businessId}-${dateString}`,\n Layer.getBalanceSheet(auth?.access_token, {\n params: { businessId, date: dateString },\n }),\n )\n\n return { data, isLoading, error }\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst DownloadCloud = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={24}\n height={24}\n fill='none'\n {...props}\n >\n <path\n stroke='#000'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='M4 16.242A4.5 4.5 0 0 1 6.08 8.02a6.002 6.002 0 0 1 11.84 0A4.5 4.5 0 0 1 20 16.242M8 17l4 4m0 0 4-4m-4 4v-9'\n />\n </svg>\n)\nexport default DownloadCloud\n", "import React, { useRef } from 'react'\nimport CalendarIcon from '../../icons/Calendar'\nimport { format } from 'date-fns'\n\ntype Props = {\n value: Date\n onChange: React.ChangeEventHandler<HTMLInputElement>\n}\n\nexport const BalanceSheetDatePicker = ({ value, onChange }: Props) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const showPicker = () => inputRef.current && inputRef.current.showPicker()\n return (\n <span className='Layer__balance-sheet-date-picker'>\n <button onClick={showPicker}>\n <CalendarIcon />\n {format(value, 'LLLL dd, yyyy')}\n <input\n type='date'\n ref={inputRef}\n value={format(value, 'yyyy-MM-dd')}\n onChange={onChange}\n />\n </button>\n </span>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst Calendar = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={20}\n height={22}\n fill='none'\n {...props}\n >\n <path\n stroke='#000'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='M19 9H1m13-8v4M6 1v4m-.2 16h8.4c1.68 0 2.52 0 3.162-.327a3 3 0 0 0 1.311-1.311C19 18.72 19 17.88 19 16.2V7.8c0-1.68 0-2.52-.327-3.162a3 3 0 0 0-1.311-1.311C16.72 3 15.88 3 14.2 3H5.8c-1.68 0-2.52 0-3.162.327a3 3 0 0 0-1.311 1.311C1 5.28 1 6.12 1 7.8v8.4c0 1.68 0 2.52.327 3.162a3 3 0 0 0 1.311 1.311C3.28 21 4.12 21 5.8 21Z'\n />\n </svg>\n)\nexport default Calendar\n", "import React, { useState } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars } from '../../models/Money'\nimport { LineItem } from '../../types'\n\ntype Props = {\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n variant?: string\n summarize?: boolean\n}\n\nexport const BalanceSheetRow = ({\n lineItem,\n depth = 0,\n maxDepth = 2,\n variant,\n summarize = true,\n}: Props) => {\n if (!lineItem) {\n return null\n }\n const { value, display_name, line_items } = lineItem\n const [expanded, setExpanded] = useState(true)\n const amount = value || 0\n const isPositive = amount >= 0\n const amountString = centsToDollars(Math.abs(amount))\n const labelClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__label',\n ]\n const valueClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__value',\n ]\n !!value &&\n valueClasses.push(\n isPositive\n ? 'Layer__balance-sheet-row__value--amount-positive'\n : 'Layer__balance-sheet-row__value--amount-negative',\n )\n labelClasses.push(`Layer__balance-sheet-row__label--depth-${depth}`)\n valueClasses.push(`Layer__balance-sheet-row__value--depth-${depth}`)\n\n variant &&\n labelClasses.push(`Layer__balance-sheet-row__label--variant-${variant}`)\n variant &&\n valueClasses.push(`Layer__balance-sheet-row__value--variant-${variant}`)\n\n const toggleExpanded = () => setExpanded(!expanded)\n const canGoDeeper = depth < maxDepth\n const hasChildren = (line_items?.length ?? 0) > 0\n const displayChildren = hasChildren && canGoDeeper\n labelClasses.push(\n `Layer__balance-sheet-row__label--display-children-${displayChildren}`,\n )\n valueClasses.push(\n `Layer__balance-sheet-row__value--display-children-${displayChildren}`,\n )\n\n displayChildren &&\n expanded &&\n labelClasses.push('Layer__balance-sheet-row__label--expanded')\n\n displayChildren &&\n expanded &&\n valueClasses.push('Layer__balance-sheet-row__value--expanded')\n\n return (\n <>\n <div className={labelClasses.join(' ')} onClick={toggleExpanded}>\n <ChevronDown size={16} />\n {display_name}\n </div>\n <div className={valueClasses.join(' ')}>{!!value && amountString}</div>\n {canGoDeeper && hasChildren && (\n <div\n className={`Layer__balance-sheet-row__children ${\n expanded && 'Layer__balance-sheet-row__children--expanded'\n }`}\n >\n <div className='Layer__balance-sheet-row__children--content'>\n {(line_items || []).map((line_item, idx) => (\n <BalanceSheetRow\n key={`${line_item.display_name}_${idx}`}\n lineItem={line_item}\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n ))}\n {summarize && (\n <BalanceSheetRow\n key={display_name}\n lineItem={{ value, display_name: `Total of ${display_name}` }}\n variant='summation'\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronDown = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M4.5 6.75L9 11.25L13.5 6.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default ChevronDown\n", "const formatter = new Intl.NumberFormat('en-US', {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n})\n\nexport const centsToDollars = (cents: number = NaN): string =>\n isNaN(cents) ? '-.--' : formatter.format(cents / 100)\n\nexport const dollarsToCents = (dollars: string = ''): number =>\n Math.round(parseFloat(dollars) * 100)\n\nexport default {\n centsToDollars,\n dollarsToCents,\n}\n", "import React, { PropsWithChildren } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\n\ntype Props = PropsWithChildren\n\nexport const SkeletonBalanceSheetRow = ({ children }: Props) => {\n const labelClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__label',\n 'Layer__balance-sheet-row__label--skeleton',\n ]\n const valueClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__value',\n 'Layer__balance-sheet-row__value--skeleton',\n ]\n return (\n <>\n <div className={labelClasses.join(' ')}>\n {children && <ChevronDown size={16} />}\n <div\n style={{ width: '20rem' }}\n className='Layer__balance-sheet-row__skeleton-text'\n >\n {' '}\n </div>\n </div>\n <div className={valueClasses.join(' ')}>\n <div\n style={{ width: '4rem' }}\n className='Layer__balance-sheet-row__skeleton-text'\n >\n {' '}\n </div>\n </div>\n {children && (\n <div className='Layer__balance-sheet-row__children Layer__balance-sheet-row__children--expanded Layer__balance-sheet-row__children--skeleton'>\n {children}\n </div>\n )}\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { BankTransactionListItem } from '../BankTransactionListItem'\nimport { BankTransactionRow } from '../BankTransactionRow'\nimport { Container, Header } from '../Container'\nimport { Loader } from '../Loader'\nimport { Toggle } from '../Toggle'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'bank-transactions'\n\nconst dateFormat = 'LLL d, yyyy'\n\nenum DisplayState {\n review = 'review',\n categorized = 'categorized',\n}\n\nconst CategorizedCategories = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n]\nconst ReviewCategories = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n]\n\nconst filterVisibility =\n (display: DisplayState) => (bankTransaction: BankTransaction) => {\n const categorized = CategorizedCategories.includes(\n bankTransaction.categorization_status,\n )\n const inReview =\n ReviewCategories.includes(bankTransaction.categorization_status) ||\n bankTransaction.recently_categorized\n\n return (\n (display === DisplayState.review && inReview) ||\n (display === DisplayState.categorized && categorized)\n )\n }\n\nexport const BankTransactions = () => {\n const [display, setDisplay] = useState<DisplayState>(DisplayState.review)\n const { data, isLoading } = useBankTransactions()\n const bankTransactions = data.filter(filterVisibility(display))\n const onCategorizationDisplayChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) =>\n setDisplay(\n event.target.value === DisplayState.categorized\n ? DisplayState.categorized\n : DisplayState.review,\n )\n const [openRows, setOpenRows] = useState<Record<string, boolean>>({})\n const toggleOpen = (id: string) =>\n setOpenRows({ ...openRows, [id]: !openRows[id] })\n const [shiftStickyHeader, setShiftStickyHeader] = useState(0)\n\n const headerRef = useElementSize((_el, _en, size) => {\n if (size?.height && size?.height >= 90) {\n const newShift = -Math.floor(size.height / 2) + 6\n if (newShift !== shiftStickyHeader) {\n setShiftStickyHeader(newShift)\n }\n } else if (size?.height > 0 && shiftStickyHeader !== 0) {\n setShiftStickyHeader(0)\n }\n })\n\n const editable = display === DisplayState.review\n return (\n <Container name={COMPONENT_NAME}>\n <Header\n ref={headerRef}\n className='Layer__bank-transactions__header'\n style={{ top: shiftStickyHeader }}\n >\n <Heading className='Layer__bank-transactions__title'>\n Transactions\n </Heading>\n <Toggle\n name='bank-transaction-display'\n options={[\n { label: 'To Review', value: DisplayState.review },\n { label: 'Categorized', value: DisplayState.categorized },\n ]}\n selected={display}\n onChange={onCategorizationDisplayChange}\n />\n </Header>\n <table\n width='100%'\n className='Layer__table Layer__bank-transactions__table'\n >\n <thead>\n <tr>\n <th className='Layer__table-header Layer__bank-transactions__date-col'>\n Date\n </th>\n <th className='Layer__table-header Layer__bank-transactions__tx-col'>\n Transaction\n </th>\n <th className='Layer__table-header Layer__bank-transactions__account-col'>\n Account\n </th>\n <th className='Layer__table-header Layer__table-cell--amount Layer__table-cell__amount-col'>\n Amount\n </th>\n {editable ? (\n <th className='Layer__table-header Layer__table-header--primary Layer__table-cell__category-col'>\n Categorize\n </th>\n ) : (\n <th className='Layer__table-header Layer__table-cell__category-col'>\n Category\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {!isLoading &&\n bankTransactions.map((bankTransaction: BankTransaction) => (\n <BankTransactionRow\n key={bankTransaction.id}\n dateFormat={dateFormat}\n bankTransaction={bankTransaction}\n isOpen={openRows[bankTransaction.id]}\n toggleOpen={toggleOpen}\n editable={editable}\n />\n ))}\n </tbody>\n </table>\n {isLoading || !bankTransactions || bankTransactions?.length === 0 ? (\n <Loader />\n ) : null}\n {!isLoading && (\n <ul className='Layer__bank-transactions__list'>\n {bankTransactions.map((bankTransaction: BankTransaction) => (\n <BankTransactionListItem\n key={bankTransaction.id}\n dateFormat={dateFormat}\n bankTransaction={bankTransaction}\n isOpen={openRows[bankTransaction.id]}\n toggleOpen={toggleOpen}\n editable={editable}\n />\n ))}\n </ul>\n )}\n </Container>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { BankTransaction, CategoryUpdate, Metadata } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseBankTransactions = () => {\n data: BankTransaction[]\n metadata: Metadata\n isLoading: boolean\n error: unknown\n categorize: (\n id: BankTransaction['id'],\n newCategory: CategoryUpdate,\n ) => Promise<void>\n updateOneLocal: (bankTransaction: BankTransaction) => void\n}\n\nexport const useBankTransactions: UseBankTransactions = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const {\n data: responseData,\n isLoading,\n error: responseError,\n mutate,\n } = useSWR(\n businessId && auth?.access_token && `bank-transactions-${businessId}`,\n Layer.getBankTransactions(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const {\n data = [],\n meta: metadata = {},\n error = undefined,\n } = responseData || {}\n\n const categorize = (\n id: BankTransaction['id'],\n newCategory: CategoryUpdate,\n ) => {\n const foundBT = data.find(x => x.business_id === businessId && x.id === id)\n if (foundBT) {\n updateOneLocal({ ...foundBT, processing: true, error: undefined })\n }\n\n return Layer.categorizeBankTransaction(apiUrl, auth.access_token, {\n params: { businessId, bankTransactionId: id },\n body: newCategory,\n })\n .then(({ data: newBT, errors }) => {\n if (newBT) {\n newBT.recently_categorized = true\n updateOneLocal(newBT)\n }\n if (errors) {\n console.error(errors)\n throw errors\n }\n })\n .catch(err => {\n const newBT = data.find(\n x => x.business_id === businessId && x.id === id,\n )\n\n if (newBT) {\n updateOneLocal({\n ...newBT,\n error: err.message,\n processing: false,\n })\n }\n })\n }\n\n const updateOneLocal = (newBankTransaction: BankTransaction) => {\n const updatedData = data.map(bt =>\n bt.id === newBankTransaction.id ? newBankTransaction : bt,\n )\n mutate({ data: updatedData }, { revalidate: false })\n }\n\n return {\n data,\n metadata,\n isLoading,\n error: responseError || error,\n categorize,\n updateOneLocal,\n }\n}\n", "import { useLayoutEffect, useRef } from 'react'\n\nexport const useElementSize = <T extends HTMLElement>(\n callback: (\n target: T,\n entry: ResizeObserverEntry,\n size: { width: number; height: number },\n ) => void,\n) => {\n const ref = useRef<T>(null)\n\n useLayoutEffect(() => {\n const element = ref?.current\n\n if (!element) {\n return\n }\n\n const observer = new ResizeObserver(entries => {\n callback(element, entries[0], {\n width: element.offsetWidth,\n height: element.offsetHeight,\n })\n })\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [callback, ref])\n\n return ref\n}\n", "import React, { useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Direction } from '../../types'\nimport { SubmitButton } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Pill } from '../Pill'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n bankTransaction: BankTransaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n editable: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionListItem = ({\n dateFormat,\n bankTransaction,\n isOpen,\n toggleOpen,\n editable,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? bankTransaction.categorization_flow.suggestions[0]\n : undefined,\n )\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (isOpen && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n toggleOpen(bankTransaction.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n selectedCategory?.stable_name || selectedCategory?.category || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-list-item'\n const openClassName = isOpen ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n isOpen ? openClassName : '',\n )\n\n return (\n <li className={rowClassName}>\n <span className={`${className}__heading`}>\n <span className={`${className}__heading-date`}>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n <span className={`${className}__heading-separator`} />\n <span className={`${className}__heading-account-name`}>\n {bankTransaction.account_name ?? ''}\n </span>\n </span>\n <span className={`${className}__body`}>\n <span className={`${className}__body__name`}>\n {bankTransaction.counterparty_name}\n </span>\n <span\n className={`${className}__amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n >\n {isCredit(bankTransaction) ? '+$' : ' $'}\n {formatMoney(bankTransaction.amount)}\n </span>\n <div\n onClick={() => toggleOpen(bankTransaction.id)}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDown\n className={`Layer__chevron ${\n isOpen ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n <span className={`${className}__expanded-row`}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n close={() => toggleOpen(bankTransaction.id)}\n isOpen={isOpen}\n asListItem={true}\n />\n </span>\n <span className={`${className}__base-row`}>\n {editable ? (\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={setSelectedCategory}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable ? (\n <Pill>{bankTransaction?.category?.display_name}</Pill>\n ) : null}\n {editable && (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n iconOnly={true}\n />\n )}\n </span>\n </li>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode } from 'react'\nimport classNames from 'classnames'\n\nexport enum ButtonVariant {\n primary = 'primary',\n secondary = 'secondary',\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n iconOnly?: ReactNode\n}\n\nexport const Button = ({\n className,\n children,\n variant = ButtonVariant.primary,\n leftIcon,\n rightIcon,\n iconOnly,\n ...props\n}: ButtonProps) => {\n let justify = 'center'\n if (leftIcon && rightIcon) {\n justify = 'space-between'\n } else if (rightIcon) {\n justify = 'space-between'\n } else if (leftIcon) {\n justify = 'start'\n }\n\n const baseClassName = classNames(\n 'Layer__btn',\n `Layer__btn--${variant}`,\n iconOnly ? 'Layer__btn--icon-only' : '',\n className,\n )\n\n return (\n <button {...props} className={baseClassName}>\n <span className={`Layer__btn-content Layer__justify--${justify}`}>\n {leftIcon && (\n <span className='Layer__btn-icon Layer__btn-icon--left'>\n {leftIcon}\n </span>\n )}\n {!iconOnly && <span className='Layer__btn-text'>{children}</span>}\n {rightIcon && (\n <span className='Layer__btn-icon Layer__btn-icon--right'>\n {rightIcon}\n </span>\n )}\n </span>\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes } from 'react'\nimport AlertCircle from '../../icons/AlertCircle'\nimport Check from '../../icons/Check'\nimport CheckCircle from '../../icons/CheckCircle'\nimport Loader from '../../icons/Loader'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport { Button, ButtonVariant } from './Button'\nimport classNames from 'classnames'\n\nexport interface SubmitButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n processing?: boolean\n disabled?: boolean\n error?: boolean | string\n active?: boolean\n iconOnly?: boolean\n}\n\nconst buildRightIcon = ({\n processing,\n error,\n}: {\n processing?: boolean\n error?: boolean | string\n}) => {\n if (processing) {\n return <Loader size={14} className='Layer__anim--rotating' />\n }\n\n if (error) {\n return (\n <Tooltip offset={12}>\n <TooltipTrigger>\n <AlertCircle size={14} />\n </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{error}</TooltipContent>\n </Tooltip>\n )\n }\n\n return (\n <span>\n <Check className='Layer__btn-icon--on-active' size={14} />\n <CheckCircle\n className='Layer__btn-icon--on-inactive'\n size={14}\n style={{ paddingTop: 4 }}\n />\n </span>\n )\n}\n\nexport const SubmitButton = ({\n active,\n className,\n processing,\n disabled,\n error,\n children,\n ...props\n}: SubmitButtonProps) => {\n const baseClassName = classNames(\n active ? 'Layer__btn--active' : '',\n className,\n )\n\n return (\n <Button\n {...props}\n className={baseClassName}\n variant={ButtonVariant.primary}\n disabled={processing || disabled}\n rightIcon={buildRightIcon({ processing, error })}\n >\n {children}\n </Button>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst AlertCircle = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 6V9'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 12H9.0075'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default AlertCircle\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Check = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M15 4.5L6.75 12.75L3 9'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Check\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst CheckCircle = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M16.5 8.30999V8.99999C16.4991 10.6173 15.9754 12.191 15.007 13.4864C14.0386 14.7817 12.6775 15.7293 11.1265 16.1879C9.57557 16.6465 7.91794 16.5914 6.40085 16.0309C4.88375 15.4704 3.58848 14.4346 2.70821 13.0778C1.82794 11.721 1.40984 10.116 1.51625 8.50223C1.62266 6.88841 2.2479 5.35223 3.2987 4.12279C4.34951 2.89335 5.76958 2.03653 7.34713 1.6801C8.92469 1.32367 10.5752 1.48674 12.0525 2.14499'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M16.5 3L9 10.5075L6.75 8.2575'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default CheckCircle\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Loader = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M9 1.5V4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 13.5V16.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M3.6975 3.6975L5.82 5.82'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.18 12.18L14.3025 14.3025'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M1.5 9H4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M13.5 9H16.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M3.6975 14.3025L5.82 12.18'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.18 5.82L14.3025 3.6975'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Loader\n", "import React, {\n ReactNode,\n forwardRef,\n HTMLProps,\n isValidElement,\n cloneElement,\n} from 'react'\nimport { TooltipContext, useTooltip, useTooltipContext } from './useTooltip'\nimport { useMergeRefs, FloatingPortal } from '@floating-ui/react'\nimport type { Placement } from '@floating-ui/react'\n\nexport interface TooltipOptions {\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n disabled?: boolean\n onOpenChange?: (open: boolean) => void\n offset?: number\n shift?: { padding?: number }\n}\n\nexport const Tooltip = ({\n children,\n ...options\n}: { children: ReactNode } & TooltipOptions) => {\n const tooltip = useTooltip(options)\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n}\n\nexport const TooltipTrigger = forwardRef<\n HTMLElement,\n HTMLProps<HTMLElement> & { asChild?: boolean }\n>(function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = (children as any).ref\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...children.props,\n 'data-state': context.open ? 'open' : 'closed',\n }),\n )\n }\n\n return (\n <span\n ref={ref}\n data-state={context.open ? 'open' : 'closed'}\n className={`Layer__tooltip-trigger Layer__tooltip-trigger--${\n context.open ? 'open' : 'closed'\n }`}\n {...context.getReferenceProps(props)}\n >\n {children}\n </span>\n )\n})\n\nexport const TooltipContent = forwardRef<\n HTMLDivElement,\n HTMLProps<HTMLDivElement>\n>(function TooltipContent({ style, className, ...props }, propRef) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open || context.disabled) return null\n\n return (\n <FloatingPortal>\n <div\n ref={ref}\n className={className}\n style={{\n ...context.styles,\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n />\n </FloatingPortal>\n )\n})\n", "import React, { useState } from 'react'\nimport { TooltipOptions } from './Tooltip'\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useTransitionStyles,\n} from '@floating-ui/react'\n\nexport type ContextType = ReturnType<typeof useTooltip> | null\n\nexport const TooltipContext = React.createContext<ContextType>(null)\n\nexport const useTooltipContext = () => {\n const context = React.useContext(TooltipContext)\n\n if (context == null) {\n throw new Error('Tooltip components must be wrapped in <Tooltip />')\n }\n\n return context\n}\n\nexport const useTooltip = ({\n initialOpen = false,\n placement = 'top',\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n disabled,\n offset: offsetProp = 5,\n shift: shiftProp = { padding: 5 },\n}: TooltipOptions = {}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open: disabled ? false : open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(offsetProp),\n flip({\n crossAxis: placement.includes('-'),\n fallbackAxisSideDirection: 'start',\n padding: shiftProp?.padding ?? 5,\n }),\n shift(shiftProp),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n move: false,\n enabled: controlledOpen == null,\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: 'tooltip' })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n const { isMounted, styles } = useTransitionStyles(context, {\n initial: {\n opacity: 0,\n },\n duration: 200,\n })\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n isMounted,\n styles,\n disabled,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data, styles, disabled],\n )\n}\n", "import React from 'react'\nimport Select, {\n DropdownIndicatorProps,\n GroupBase,\n components,\n} from 'react-select'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { BankTransaction, CategorizationType, Category } from '../../types'\n\ntype Props = {\n name?: string\n bankTransaction: BankTransaction\n value: Category | undefined\n onChange: (newValue: Category) => void\n disabled?: boolean\n className?: string\n}\n\nconst DropdownIndicator:\n | React.ComponentType<\n DropdownIndicatorProps<Category, false, GroupBase<Category>>\n >\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n )\n}\n\nexport const CategoryMenu = ({\n bankTransaction,\n name,\n value,\n onChange,\n disabled,\n className,\n}: Props) => {\n const { categories } = useLayerContext()\n\n const suggestedOptions =\n bankTransaction?.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? [\n {\n label: 'Suggested',\n options: bankTransaction.categorization_flow.suggestions,\n },\n ]\n : []\n\n const categoryOptions = (categories || [])\n .map(category => {\n if (category?.subCategories && category?.subCategories?.length > 0) {\n return {\n label: category.display_name,\n options: category.subCategories,\n }\n }\n return {\n label: category.display_name,\n options: [category],\n }\n })\n .filter(x => x)\n\n const options = [...suggestedOptions, ...categoryOptions]\n\n // The menu does not show in all cases unless the\n // menuPortalTarget and styles lines exist\n // See: https://stackoverflow.com/questions/55830799/how-to-change-zindex-in-react-select-drowpdown\n return (\n <Select<Category>\n name={name}\n className={`Layer__category-menu Layer__select ${className ?? ''}`}\n classNamePrefix='Layer__select'\n options={options}\n isSearchable={true}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n getOptionLabel={category => category.display_name}\n getOptionValue={category => category.stable_name || category.category}\n menuPortalTarget={document.body}\n styles={{ menuPortal: base => ({ ...base, zIndex: 9999 }) }}\n components={{ DropdownIndicator }}\n isDisabled={disabled}\n />\n )\n}\n", "import React, { forwardRef, useImperativeHandle, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport FolderPlus from '../../icons/FolderPlus'\nimport Link from '../../icons/Link'\nimport RefreshCcw from '../../icons/RefreshCcw'\nimport ScissorsFullOpen from '../../icons/ScissorsFullOpen'\nimport {\n centsToDollars as formatMoney,\n dollarsToCents as parseMoney,\n} from '../../models/Money'\nimport {\n BankTransaction,\n SplitCategoryUpdate,\n SingleCategoryUpdate,\n Category,\n CategorizationType,\n} from '../../types'\nimport { Button, SubmitButton, ButtonVariant } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { InputGroup, Input, FileInput } from '../Input'\nimport { Textarea } from '../Textarea'\nimport { Toggle } from '../Toggle'\nimport { ToggleSize } from '../Toggle/Toggle'\n\ntype Props = {\n bankTransaction: BankTransaction\n close?: () => void\n isOpen?: boolean\n asListItem?: boolean\n showSubmitButton?: boolean\n}\n\ntype Split = {\n amount: number\n inputValue: string\n category: Category | undefined\n}\n\ntype RowState = {\n splits: Split[]\n description: string\n file: unknown\n}\n\nenum Purpose {\n categorize = 'categorize',\n match = 'match',\n}\n\nexport type SaveHandle = {\n save: () => void\n}\n\nexport const ExpandedBankTransactionRow = forwardRef<SaveHandle, Props>(\n (\n {\n bankTransaction,\n isOpen = false,\n asListItem = false,\n showSubmitButton = false,\n },\n ref,\n ) => {\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [purpose, setPurpose] = useState<Purpose>(Purpose.categorize)\n\n const defaultCategory =\n bankTransaction.category ||\n (bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS &&\n bankTransaction.categorization_flow?.suggestions?.[0])\n const [rowState, updateRowState] = useState<RowState>({\n splits: [\n {\n amount: bankTransaction.amount,\n inputValue: formatMoney(bankTransaction.amount),\n category: defaultCategory,\n },\n ],\n description: '',\n file: undefined,\n })\n\n const addSplit = () =>\n updateRowState({\n ...rowState,\n splits: [\n ...rowState.splits,\n { amount: 0, inputValue: '0.00', category: defaultCategory },\n ],\n })\n\n const removeSplit = () =>\n updateRowState({\n ...rowState,\n splits: rowState.splits.slice(0, -1),\n })\n\n const updateAmounts =\n (rowNumber: number) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const newAmount = parseMoney(event.target.value) || 0\n const newDisplaying = event.target.value\n const splitTotal = rowState.splits\n .slice(0, -1)\n .reduce((sum, split, index) => {\n const amount = index === rowNumber ? newAmount : split.amount\n return sum + amount\n }, 0)\n const remaining = bankTransaction.amount - splitTotal\n rowState.splits[rowNumber].amount = newAmount\n rowState.splits[rowNumber].inputValue = newDisplaying\n rowState.splits[rowState.splits.length - 1].amount = remaining\n rowState.splits[rowState.splits.length - 1].inputValue =\n formatMoney(remaining)\n updateRowState({ ...rowState })\n }\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n const [_, index] = event.target.name.split('-')\n rowState.splits[parseInt(index)].inputValue = '0.00'\n updateRowState({ ...rowState })\n }\n }\n\n const onChangePurpose = (event: React.ChangeEvent<HTMLInputElement>) =>\n setPurpose(\n event.target.value === Purpose.match\n ? Purpose.match\n : Purpose.categorize,\n )\n\n const changeCategory = (index: number, newValue: Category) => {\n rowState.splits[index].category = newValue\n updateRowState({ ...rowState })\n }\n\n const save = () =>\n categorizeBankTransaction(\n bankTransaction.id,\n rowState.splits.length === 1\n ? ({\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n rowState?.splits[0].category?.stable_name ||\n rowState?.splits[0].category?.category,\n },\n } as SingleCategoryUpdate)\n : ({\n type: 'Split',\n entries: rowState.splits.map(split => ({\n category:\n split.category?.stable_name || split.category?.category,\n amount: split.amount,\n })),\n } as SplitCategoryUpdate),\n ).catch(e => console.error(e))\n\n // Call this save action after clicking save in parent component:\n useImperativeHandle(ref, () => ({\n save,\n }))\n\n const className = 'Layer__expanded-bank-transaction-row'\n return (\n <span\n className={`${className} ${className}--${\n isOpen ? 'expanded' : 'collapsed'\n }`}\n >\n <span className={`${className}__wrapper`}>\n <div className={`${className}__content-toggle`}>\n <Toggle\n name={`purpose-${bankTransaction.id}${asListItem ? '-li' : ''}`}\n size={ToggleSize.small}\n options={[\n {\n value: 'categorize',\n label: 'Categorize',\n leftIcon: <FolderPlus size={15} />,\n },\n {\n value: 'match',\n label: 'Match',\n disabled: true,\n leftIcon: <RefreshCcw size={15} />,\n },\n ]}\n selected={purpose}\n onChange={onChangePurpose}\n />\n </div>\n <div\n className={`${className}__content`}\n id={`expanded-${bankTransaction.id}`}\n >\n <div className={`${className}__splits`}>\n <div className={`${className}__splits-inputs`}>\n {rowState.splits.map((split, index) => (\n <div\n className={`${className}__table-cell--split-entry`}\n key={`split-${index}`}\n >\n {rowState.splits.length > 1 && (\n <Input\n type='text'\n name={`split-${index}${asListItem ? '-li' : ''}`}\n disabled={index + 1 === rowState.splits.length}\n onChange={updateAmounts(index)}\n value={split.inputValue}\n onBlur={onBlur}\n className={`${className}__split-amount${\n split.amount < 0 ? '--negative' : ''\n }`}\n />\n )}\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${index}${asListItem ? '-li' : ''}`}\n value={split.category}\n onChange={value => changeCategory(index, value)}\n className='Layer__category-menu--full'\n />\n </div>\n ))}\n </div>\n <div className={`${className}__splits-buttons`}>\n {rowState.splits.length === 1 ? (\n <Button\n onClick={addSplit}\n leftIcon={<ScissorsFullOpen size={14} />}\n variant={ButtonVariant.secondary}\n >\n Split\n </Button>\n ) : (\n <Button\n onClick={removeSplit}\n leftIcon={<Link size={14} />}\n variant={ButtonVariant.secondary}\n >\n Merge\n </Button>\n )}\n </div>\n </div>\n\n <InputGroup\n className={`${className}__description`}\n name='description'\n label='Description'\n >\n <Textarea name='description' placeholder='Enter description' />\n </InputGroup>\n\n <div className={`${className}__file-upload`}>\n <FileInput text='Upload receipt' />\n </div>\n\n {asListItem || showSubmitButton ? (\n <div className={`${className}__submit-btn`}>\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n active={true}\n >\n Approve\n </SubmitButton>\n </div>\n ) : null}\n </div>\n </span>\n </span>\n )\n },\n)\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst FolderPlus = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M16.5 14.25C16.5 14.6478 16.342 15.0294 16.0607 15.3107C15.7794 15.592 15.3978 15.75 15 15.75H3C2.60218 15.75 2.22064 15.592 1.93934 15.3107C1.65804 15.0294 1.5 14.6478 1.5 14.25V3.75C1.5 3.35218 1.65804 2.97064 1.93934 2.68934C2.22064 2.40804 2.60218 2.25 3 2.25H6.75L8.25 4.5H15C15.3978 4.5 15.7794 4.65804 16.0607 4.93934C16.342 5.22064 16.5 5.60218 16.5 6V14.25Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M6.75 10.5H11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default FolderPlus\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Link = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M7.5 9.75C7.82209 10.1806 8.23302 10.5369 8.70491 10.7947C9.17681 11.0525 9.69863 11.2058 10.235 11.2442C10.7713 11.2827 11.3097 11.2053 11.8135 11.0173C12.3173 10.8294 12.7748 10.5353 13.155 10.155L15.405 7.905C16.0881 7.19774 16.4661 6.25048 16.4575 5.26724C16.449 4.284 16.0546 3.34346 15.3593 2.64818C14.664 1.9529 13.7235 1.55851 12.7403 1.54997C11.757 1.54143 10.8098 1.9194 10.1025 2.6025L8.8125 3.885'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 8.25C10.1779 7.8194 9.76698 7.46311 9.29508 7.2053C8.82319 6.94748 8.30137 6.79416 7.76501 6.75575C7.22865 6.71734 6.69031 6.79473 6.18649 6.98266C5.68267 7.1706 5.22516 7.4647 4.845 7.845L2.595 10.095C1.9119 10.8023 1.53393 11.7495 1.54247 12.7328C1.55101 13.716 1.9454 14.6565 2.64068 15.3518C3.33596 16.0471 4.2765 16.4415 5.25974 16.45C6.24298 16.4586 7.19024 16.0806 7.8975 15.3975L9.18 14.115'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Link\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst RefreshCcw = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M0.75 3V7.5H5.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M17.25 15V10.5H12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15.3675 6.75C14.9871 5.67508 14.3407 4.71405 13.4884 3.95656C12.6361 3.19907 11.6059 2.66982 10.4938 2.41819C9.38167 2.16656 8.22393 2.20075 7.12861 2.51758C6.03328 2.8344 5.03606 3.42353 4.23 4.23L0.75 7.5M17.25 10.5L13.77 13.77C12.9639 14.5765 11.9667 15.1656 10.8714 15.4824C9.77607 15.7992 8.61833 15.8334 7.50621 15.5818C6.3941 15.3302 5.36385 14.8009 4.5116 14.0434C3.65935 13.2859 3.01288 12.3249 2.6325 11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default RefreshCcw\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ScissorsFullOpen = ({ size = 12, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 12 12'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <g id='scissors'>\n <path\n id='Vector'\n d='M3 4.5C3.82843 4.5 4.5 3.82843 4.5 3C4.5 2.17157 3.82843 1.5 3 1.5C2.17157 1.5 1.5 2.17157 1.5 3C1.5 3.82843 2.17157 4.5 3 4.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n id='Vector_2'\n d='M3 10.5C3.82843 10.5 4.5 9.82843 4.5 9C4.5 8.17157 3.82843 7.5 3 7.5C2.17157 7.5 1.5 8.17157 1.5 9C1.5 9.82843 2.17157 10.5 3 10.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n id='Vector_3'\n d='M10 2L4.06 7.94'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n id='Vector_4'\n d='M7.235 7.23999L10 9.99999'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n id='Vector_5'\n d='M4.06 4.06006L6 6.00006'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </g>\n </svg>\n)\n\nexport default ScissorsFullOpen\n", "import React, { HTMLProps } from 'react'\nimport classNames from 'classnames'\n\nexport const Input = ({ className, ...props }: HTMLProps<HTMLInputElement>) => {\n const baseClassName = classNames('Layer__input', className)\n return <input {...props} className={baseClassName} />\n}\n", "import React, { ReactNode } from 'react'\nimport { Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nexport interface InputGroupProps {\n label?: string\n name?: string\n className?: string\n children?: ReactNode\n}\n\nexport const InputGroup = ({\n label,\n name,\n className,\n children,\n}: InputGroupProps) => {\n const baseClassName = classNames('Layer__input-group', className)\n return (\n <div className={baseClassName}>\n {label && (\n <Text\n as='label'\n size={TextSize.sm}\n className='Layer__input-label'\n htmlFor={name}\n >\n {label}\n </Text>\n )}\n {children}\n </div>\n )\n}\n", "import React, { ReactNode, useRef, useState, useEffect } from 'react'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport enum TextSize {\n md = 'md',\n sm = 'sm',\n}\n\nexport enum TextWeight {\n normal = 'normal',\n bold = 'bold',\n}\n\nexport enum TextUseTooltip {\n whenTruncated = 'whenTruncated',\n always = 'always',\n}\n\nexport interface TextTooltipOptions {\n contentClassName?: string\n offset?: number\n shift?: { padding?: number }\n}\n\nexport interface TextProps {\n as?: React.ElementType\n className?: string\n children: ReactNode\n size?: TextSize\n weight?: TextWeight\n htmlFor?: string\n withTooltip?: TextUseTooltip\n tooltipOptions?: TextTooltipOptions\n}\n\nexport const Text = ({\n as: Component = 'p',\n className,\n children,\n size = TextSize.md,\n weight = TextWeight.normal,\n withTooltip,\n ...props\n}: TextProps) => {\n const baseClassName = classNames(\n `Layer__text Layer__text--${size} Layer__text--${weight}`,\n className,\n )\n\n if (withTooltip) {\n return (\n <TextWithTooltip\n as={Component}\n className={baseClassName}\n size={size}\n weight={weight}\n withTooltip={withTooltip}\n {...props}\n >\n {children}\n </TextWithTooltip>\n )\n }\n\n return (\n <Component {...props} className={baseClassName}>\n {children}\n </Component>\n )\n}\n\nexport const TextWithTooltip = ({\n as: Component = 'p',\n className,\n children,\n size = TextSize.md,\n weight = TextWeight.normal,\n withTooltip = TextUseTooltip.whenTruncated,\n tooltipOptions,\n ...props\n}: TextProps) => {\n const textElementRef = useRef<HTMLElement>()\n const compareSize = () => {\n if (textElementRef.current) {\n const compare =\n textElementRef.current.children[0].scrollWidth >\n textElementRef.current.children[0].clientWidth\n setHover(compare)\n }\n }\n\n useEffect(() => {\n compareSize()\n window.addEventListener('resize', compareSize)\n }, [])\n\n useEffect(\n () => () => {\n window.removeEventListener('resize', compareSize)\n },\n [],\n )\n\n const [hoverStatus, setHover] = useState(false)\n\n const contentClassName = classNames(\n 'Layer__tooltip',\n tooltipOptions?.contentClassName,\n )\n\n return (\n <Tooltip\n disabled={!hoverStatus}\n offset={tooltipOptions?.offset}\n shift={tooltipOptions?.shift}\n >\n <TooltipTrigger>\n <Component className={className} ref={textElementRef} {...props}>\n {children}\n </Component>\n </TooltipTrigger>\n <TooltipContent className={contentClassName}>{children}</TooltipContent>\n </Tooltip>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport classNames from 'classnames'\n\nexport enum HeadingSize {\n primary = 'primary',\n secondary = 'secondary',\n}\n\nexport interface HeadingProps {\n as?: React.ElementType\n className?: string\n children: ReactNode\n size?: HeadingSize\n}\n\nexport const Heading = ({\n as: Component = 'h2',\n className,\n children,\n size = HeadingSize.primary,\n}: HeadingProps) => {\n const baseClassName = classNames(\n `Layer__heading Layer__heading--${size}`,\n className,\n )\n\n return <Component className={baseClassName}>{children}</Component>\n}\n", "import React, { useRef, ChangeEvent } from 'react'\nimport UploadCloud from '../../icons/UploadCloud'\nimport { Button } from '../Button'\nimport { ButtonVariant } from '../Button/Button'\n\nexport interface FileInputProps {\n text?: string\n onUpload?: (file: File) => void\n}\n\nexport const FileInput = ({ text = 'Upload', onUpload }: FileInputProps) => {\n const hiddenFileInput = useRef<HTMLInputElement>(null)\n\n const onClick = () => {\n if (hiddenFileInput.current) {\n hiddenFileInput.current.click()\n }\n }\n\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files.length > 0 && onUpload) {\n const fileUploaded = event.target.files[0]\n onUpload(fileUploaded)\n }\n }\n\n return (\n <>\n <Button\n onClick={onClick}\n variant={ButtonVariant.secondary}\n leftIcon={<UploadCloud />}\n >\n {text}\n </Button>\n <input\n type='file'\n onChange={onChange}\n ref={hiddenFileInput}\n style={{ display: 'none' }}\n />\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst UploadCloud = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M12 12L9 9L6 12'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 9V15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15.2925 13.7925C16.024 13.3937 16.6019 12.7626 16.9349 11.999C17.2679 11.2353 17.3372 10.3824 17.1317 9.57501C16.9262 8.7676 16.4576 8.05162 15.8 7.54007C15.1424 7.02852 14.3332 6.75054 13.5 6.74999H12.555C12.328 5.87192 11.9049 5.05674 11.3175 4.36573C10.7301 3.67473 9.99364 3.12588 9.16358 2.76044C8.33352 2.39501 7.43141 2.22251 6.52509 2.2559C5.61876 2.28929 4.7318 2.52771 3.93088 2.95324C3.12997 3.37876 2.43593 3.98032 1.90097 4.71267C1.366 5.44503 1.00402 6.28914 0.842236 7.18153C0.680453 8.07393 0.72308 8.99139 0.966911 9.86493C1.21074 10.7385 1.64943 11.5454 2.25 12.225'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12 12L9 9L6 12'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default UploadCloud\n", "import React, { HTMLProps } from 'react'\nimport classNames from 'classnames'\n\nexport const Textarea = ({\n className,\n ...props\n}: HTMLProps<HTMLTextAreaElement>) => {\n const baseClassName = classNames('Layer__textarea', className)\n return <textarea {...props} className={baseClassName} />\n}\n", "import React, {\n ChangeEvent,\n ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport classNames from 'classnames'\n\nexport interface Option {\n label: string\n value: string\n disabled?: boolean\n leftIcon?: ReactNode\n}\n\nexport enum ToggleSize {\n medium = 'medium',\n small = 'small',\n}\n\nexport interface ToggleProps {\n name: string\n size?: ToggleSize\n options: Option[]\n selected?: Option['value']\n onChange: (event: ChangeEvent<HTMLInputElement>) => void\n}\n\ninterface ToggleOptionProps {\n checked: boolean\n label: string\n name: string\n size: ToggleSize\n onChange: (event: ChangeEvent<HTMLInputElement>) => void\n value: string\n disabled?: boolean\n leftIcon?: ReactNode\n index: number\n}\n\nexport const Toggle = ({\n name,\n options,\n selected,\n onChange,\n size = ToggleSize.medium,\n}: ToggleProps) => {\n const [currentWidth, setCurrentWidth] = useState(0)\n const [thumbPos, setThumbPos] = useState({ left: 0, width: 0 })\n const [initialized, setInitialized] = useState(false)\n\n const toggleRef = useElementSize<HTMLDivElement>((a, b, c) => {\n if (c.width && c?.width !== currentWidth) {\n setCurrentWidth(c.width)\n }\n })\n\n const selectedValue = selected || options[0].value\n const baseClassName = classNames(\n 'Layer__toggle',\n `Layer__toggle--${size}`,\n initialized ? 'Layer__toggle--initialized' : '',\n )\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n updateThumbPosition(Number(e.target.getAttribute('data-idx') ?? 0))\n onChange(e)\n }\n\n const updateThumbPosition = (active: number) => {\n if (!toggleRef?.current) {\n return\n }\n\n const optionsNodes = [...toggleRef.current.children].filter(c =>\n c.className.includes('Layer__toggle-option'),\n )\n\n let shift = 0\n let width = thumbPos.width\n\n optionsNodes.forEach((c, i) => {\n if (i < active) {\n shift = shift + (c as HTMLElement).offsetWidth\n } else if (i === active) {\n width = (c as HTMLElement).offsetWidth\n }\n })\n\n shift = shift + (size === ToggleSize.medium ? 2 : 1)\n\n setThumbPos({ left: shift, width })\n }\n\n useEffect(() => {\n const selectedIndex = getSelectedIndex()\n updateThumbPosition(selectedIndex)\n\n setTimeout(() => {\n setInitialized(true)\n }, 400)\n }, [])\n\n useEffect(() => {\n const selectedIndex = getSelectedIndex()\n updateThumbPosition(selectedIndex)\n }, [currentWidth])\n\n const getSelectedIndex = () => {\n let selectedIndex = options.findIndex(\n option => option.value === selectedValue,\n )\n if (selectedIndex === -1) {\n return 0\n }\n\n return selectedIndex\n }\n\n return (\n <div className={baseClassName} ref={toggleRef}>\n {options.map((option, index) => (\n <ToggleOption\n {...option}\n size={size}\n key={option.value}\n name={name}\n checked={selectedValue === option.value}\n onChange={handleChange}\n disabled={option.disabled ?? false}\n index={index}\n />\n ))}\n <span className='Layer__toggle__thumb' style={{ ...thumbPos }} />\n </div>\n )\n}\n\nconst ToggleOption = ({\n checked,\n label,\n name,\n onChange,\n value,\n size,\n leftIcon,\n disabled,\n index,\n}: ToggleOptionProps) => {\n return (\n <label className={`Layer__toggle-option`} data-checked={checked}>\n <input\n type='radio'\n checked={checked}\n name={name}\n onChange={onChange}\n value={value}\n disabled={disabled ?? false}\n data-idx={index}\n />\n\n <span className='Layer__toggle-option-content'>\n {leftIcon && (\n <span className='Layer__toggle-option__icon'>{leftIcon}</span>\n )}\n <span>{label}</span>\n </span>\n </label>\n )\n}\n", "import React, { PropsWithChildren } from 'react'\n\nexport const Pill = ({ children }: PropsWithChildren) => (\n <span className='Layer__pill'>{children}</span>\n)\n", "import React, { useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Direction } from '../../types'\nimport { SubmitButton } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Text } from '../Typography'\nimport { TextUseTooltip } from '../Typography/Text'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n bankTransaction: BankTransaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n editable: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionRow = ({\n dateFormat,\n bankTransaction,\n isOpen,\n toggleOpen,\n editable,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? bankTransaction.categorization_flow.suggestions[0]\n : undefined,\n )\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (isOpen && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n toggleOpen(bankTransaction.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n selectedCategory?.stable_name || selectedCategory?.category || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-row'\n const openClassName = isOpen ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n isOpen ? openClassName : '',\n )\n\n return (\n <>\n <tr\n className={rowClassName}\n onTransitionEnd={({ propertyName }) => {\n if (propertyName === 'top') {\n setRemoved(true)\n }\n }}\n >\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n </td>\n <td className='Layer__table-cell Layer__bank-transactions__tx-col'>\n <span className='Layer__table-cell-content'>\n <Text\n as='span'\n className='Layer__bank-transactions__tx-text'\n withTooltip={TextUseTooltip.whenTruncated}\n tooltipOptions={{\n contentClassName: 'Layer__bank-transactions__tx-tooltip',\n }}\n >\n {bankTransaction.counterparty_name}\n </Text>\n </span>\n </td>\n <td className='Layer__table-cell Layer__bank-transactions__account-col'>\n <span className='Layer__table-cell-content'>\n <Text\n as='span'\n className='Layer__bank-transactions__account-text'\n withTooltip={TextUseTooltip.whenTruncated}\n >\n {bankTransaction.account_name ?? ''}\n </Text>\n </span>\n </td>\n <td\n className={`Layer__table-cell Layer__table-cell__amount-col Layer__table-cell--amount ${className}__table-cell--amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n >\n <span className='Layer__table-cell-content'>\n {isCredit(bankTransaction) ? '+$' : ' $'}\n {formatMoney(bankTransaction.amount)}\n </span>\n </td>\n <td\n className={classNames(\n 'Layer__table-cell',\n 'Layer__table-cell__category-col',\n `${className}__actions-cell`,\n `${className}__actions-cell--${isOpen ? 'open' : 'close'}`,\n )}\n >\n <span\n className={`${className}__actions-container Layer__table-cell-content`}\n >\n {editable && !isOpen ? (\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={setSelectedCategory}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable ? (\n <Text as='span' className={`${className}__category-text`}>\n {bankTransaction?.category?.display_name}\n </Text>\n ) : null}\n {editable && (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n active={isOpen}\n >\n Approve\n </SubmitButton>\n )}\n <div\n onClick={() => toggleOpen(bankTransaction.id)}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDown\n className={`Layer__chevron ${\n isOpen ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n </td>\n </tr>\n <tr>\n <td colSpan={5}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n close={() => toggleOpen(bankTransaction.id)}\n isOpen={isOpen}\n showSubmitButton={!editable}\n />\n </td>\n </tr>\n </>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { parseStylesFromThemeConfig } from '../../utils/colors'\n\nexport interface ContainerProps {\n name: string\n className?: string\n children: ReactNode\n}\n\nexport const Container = ({ name, className, children }: ContainerProps) => {\n const baseClassName = `Layer__${name} ${className ?? ''}`\n\n const { theme } = useLayerContext()\n\n const styles = parseStylesFromThemeConfig(theme)\n\n return (\n <div\n className={`Layer__component Layer__component-container ${baseClassName}`}\n style={{ ...styles }}\n >\n {children}\n </div>\n )\n}\n", "import {\n LayerThemeConfig,\n ColorConfig,\n ColorRGBConfig,\n} from '../types/layer_context'\n\n/**\n * Convert `theme` config set in Provider into component styles.\n *\n * @param {LayerThemeConfig} theme - the theme set with provider\n */\nexport const parseStylesFromThemeConfig = (theme?: LayerThemeConfig) => {\n let styles = {}\n if (!theme) {\n return styles\n }\n\n if (theme.colors) {\n const darkColor = parseColorFromTheme('dark', theme.colors.dark)\n const lightColor = parseColorFromTheme('light', theme.colors.light)\n styles = { ...styles, ...darkColor, ...lightColor }\n }\n\n return styles\n}\n\n/**\n * Parse the color from theme config into a CSS variables.\n * @param {string} colorName\n * @param {ColorConfig} color\n */\nconst parseColorFromTheme = (colorName: string, color?: ColorConfig) => {\n if (!color) {\n return {}\n }\n\n try {\n if ('h' in color && 's' in color && 'l' in color) {\n console.log('its hsl', color)\n return {\n [`--color-${colorName}-h`]: color.h,\n [`--color-${colorName}-s`]: color.s,\n [`--color-${colorName}-l`]: color.l,\n }\n }\n\n if ('r' in color && 'g' in color && 'b' in color) {\n const { h, s, l } = rgbToHsl(color)\n console.log('its rgb', h, s, l)\n return {\n [`--color-${colorName}-h`]: h,\n [`--color-${colorName}-s`]: `${s}%`,\n [`--color-${colorName}-l`]: `${l}%`,\n }\n }\n\n if ('hex' in color) {\n console.log('its hex')\n const rgb = hexToRgb(color.hex)\n if (!rgb) {\n return {}\n }\n const { h, s, l } = rgbToHsl({\n r: rgb.r.toString(),\n g: rgb.g.toString(),\n b: rgb.b.toString(),\n })\n console.log('its hex', h, s, l)\n return {\n [`--color-${colorName}-h`]: h,\n [`--color-${colorName}-s`]: `${s}%`,\n [`--color-${colorName}-l`]: `${l}%`,\n }\n }\n\n return {}\n } catch (_err) {\n return {}\n }\n}\n\n/**\n * Convert RGB to HSL\n */\nconst rgbToHsl = (color: ColorRGBConfig) => {\n let r = Number(color.r)\n let g = Number(color.g)\n let b = Number(color.b)\n r /= 255\n g /= 255\n b /= 255\n const l = Math.max(r, g, b)\n const s = l - Math.min(r, g, b)\n const h = s\n ? l === r\n ? (g - b) / s\n : l === g\n ? 2 + (b - r) / s\n : 4 + (r - g) / s\n : 0\n return {\n h: 60 * h < 0 ? 60 * h + 360 : 60 * h,\n s: 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0),\n l: (100 * (2 * l - s)) / 2,\n }\n}\n\n/**\n * Convert HEX to RGB\n */\nconst hexToRgb = (hex: string) => {\n const values = hex\n .replace(\n /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,\n (m, r, g, b) => '#' + r + r + g + g + b + b,\n )\n .substring(1)\n .match(/.{2}/g)\n ?.map(x => parseInt(x, 16))\n\n if (!values) {\n return\n }\n\n return {\n r: values[0],\n g: values[1],\n b: values[2],\n }\n}\n", "import React, { CSSProperties, ReactNode, forwardRef } from 'react'\nimport classNames from 'classnames'\n\nexport interface HeaderProps {\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(\n ({ className, children, style }, ref) => {\n const baseClassName = classNames('Layer__component-header', className)\n\n return (\n <header ref={ref} className={baseClassName} style={style}>\n {children}\n </header>\n )\n },\n)\n", "import React, { ReactNode } from 'react'\nimport LoaderIcon from '../../icons/Loader'\n\nexport interface LoaderProps {\n children?: ReactNode\n}\n\nexport const Loader = ({ children }: LoaderProps) => {\n return (\n <span className='Layer__loader'>\n <LoaderIcon size={14} className='Layer__anim--rotating' />\n {children ?? 'Loading...'}\n </span>\n )\n}\n", "import React from 'react'\nimport useSWR from 'swr'\n\ntype Props = {\n user?: string | undefined\n}\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json())\n\nexport const Hello = ({ user }: Props) => {\n const { data, isLoading } = useSWR(\n `https://api.github.com/users/${user || 'jyurek'}`,\n fetcher,\n )\n const name = (isLoading ? '...' : data?.name) || 'User'\n return (\n <>\n <div className='hello'>Hello, {name}!</div>\n </>\n )\n}\n", "import React, { PropsWithChildren, createContext } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLossChart } from '../ProfitAndLossChart'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { ProfitAndLossSummaries } from '../ProfitAndLossSummaries'\nimport { ProfitAndLossTable } from '../ProfitAndLossTable'\nimport { endOfMonth, startOfMonth } from 'date-fns'\n\ntype PNLContextType = ReturnType<typeof useProfitAndLoss>\nconst PNLContext = createContext<PNLContextType>({\n data: undefined,\n isLoading: true,\n error: undefined,\n dateRange: {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n changeDateRange: () => {},\n})\n\nconst ProfitAndLoss = ({ children }: PropsWithChildren) => {\n const contextData = useProfitAndLoss()\n return (\n <PNLContext.Provider value={contextData}>\n <div className='Layer__component Layer__profit-and-loss'>\n <h2 className='Layer__profit-and-loss__title'>Profit & Loss</h2>\n {children}\n </div>\n </PNLContext.Provider>\n )\n}\n\nProfitAndLoss.Chart = ProfitAndLossChart\nProfitAndLoss.Context = PNLContext\nProfitAndLoss.DatePicker = ProfitAndLossDatePicker\nProfitAndLoss.Summaries = ProfitAndLossSummaries\nProfitAndLoss.Table = ProfitAndLossTable\nexport { ProfitAndLoss }\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { ProfitAndLoss, DateRange } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport { startOfMonth, endOfMonth, formatISO } from 'date-fns'\nimport useSWR from 'swr'\n\ntype Props = DateRange\n\ntype UseProfitAndLoss = (props?: Props) => {\n data: ProfitAndLoss | undefined\n isLoading: boolean\n error: unknown\n dateRange: DateRange\n changeDateRange: (dateRange: Partial<DateRange>) => void\n}\n\nexport const useProfitAndLoss: UseProfitAndLoss = (\n { startDate: initialStartDate, endDate: initialEndDate }: Props = {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n) => {\n const { auth, businessId, apiUrl } = useLayerContext()\n const [startDate, setStartDate] = useState(\n initialStartDate || startOfMonth(Date.now()),\n )\n const [endDate, setEndDate] = useState(\n initialEndDate || endOfMonth(Date.now()),\n )\n\n const {\n data: rawData,\n isLoading,\n error: rawError,\n } = useSWR(\n businessId &&\n startDate &&\n endDate &&\n auth?.access_token &&\n `profit-and-loss-${businessId}-${startDate.valueOf()}-${endDate.valueOf()}`,\n Layer.getProfitAndLoss(apiUrl, auth?.access_token, {\n params: {\n businessId,\n startDate: formatISO(startDate),\n endDate: formatISO(endDate),\n },\n }),\n )\n const { data, error } = rawData || {}\n\n const changeDateRange = ({\n startDate: newStartDate,\n endDate: newEndDate,\n }: Partial<DateRange>) => {\n newStartDate && setStartDate(newStartDate)\n newEndDate && setEndDate(newEndDate)\n }\n\n return {\n data,\n isLoading,\n error: error || rawError,\n dateRange: { startDate, endDate },\n changeDateRange,\n }\n}\n", "import React, { useContext, useMemo, useState } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLoss } from '../../types'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { Indicator } from './Indicator'\nimport { endOfMonth, format, parseISO, startOfMonth, sub } from 'date-fns'\nimport {\n BarChart,\n XAxis,\n Cell,\n Bar,\n LabelList,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n} from 'recharts'\nimport { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart'\n\nconst barGap = 4\nconst barSize = 20\n\nexport const ProfitAndLossChart = () => {\n const { changeDateRange, dateRange } = useContext(PNL.Context)\n const thisMonth = startOfMonth(Date.now())\n\n const startSelectionMonth = dateRange.startDate.getMonth()\n const endSelectionMonth = dateRange.endDate.getMonth()\n\n // Yes, this looks weird, but we have to load all the data from the\n // last 12 months as we don't have a single endpoint yet. And we\n // can't use hooks in a loop.\n const monthData: (ProfitAndLoss | undefined)[] = []\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 11 })),\n endDate: endOfMonth(sub(thisMonth, { months: 11 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 10 })),\n endDate: endOfMonth(sub(thisMonth, { months: 10 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 9 })),\n endDate: endOfMonth(sub(thisMonth, { months: 9 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 8 })),\n endDate: endOfMonth(sub(thisMonth, { months: 8 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 7 })),\n endDate: endOfMonth(sub(thisMonth, { months: 7 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 6 })),\n endDate: endOfMonth(sub(thisMonth, { months: 6 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 5 })),\n endDate: endOfMonth(sub(thisMonth, { months: 5 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 4 })),\n endDate: endOfMonth(sub(thisMonth, { months: 4 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 3 })),\n endDate: endOfMonth(sub(thisMonth, { months: 3 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 2 })),\n endDate: endOfMonth(sub(thisMonth, { months: 2 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 1 })),\n endDate: endOfMonth(sub(thisMonth, { months: 1 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: thisMonth,\n endDate: endOfMonth(thisMonth),\n })?.data,\n )\n\n const getMonthName = (pnl: ProfitAndLoss | undefined) =>\n pnl ? format(parseISO(pnl.start_date), 'LLL') : ''\n\n const summarizePnL = (pnl: ProfitAndLoss | undefined) => ({\n name: getMonthName(pnl),\n revenue: pnl?.income.value || 0,\n expenses: (pnl?.income.value || 0) - (pnl?.net_profit || 0),\n selected:\n !!pnl &&\n parseISO(pnl.start_date).getMonth() >= startSelectionMonth &&\n parseISO(pnl.end_date).getMonth() <= endSelectionMonth,\n })\n\n const onClick: CategoricalChartFunc = ({ activeTooltipIndex }) => {\n const selection = monthData[activeTooltipIndex || -1]\n if (selection) {\n const { start_date: startDate, end_date: endDate } = selection\n changeDateRange({\n startDate: parseISO(startDate),\n endDate: parseISO(endDate),\n })\n }\n }\n\n // If net profit doesn't change, we're probably still the same.\n const data = useMemo(\n () => monthData.map(summarizePnL),\n [\n startSelectionMonth,\n endSelectionMonth,\n ...monthData.map(m => m?.net_profit),\n ],\n )\n\n const [animateFrom, setAnimateFrom] = useState(-1)\n\n return (\n <ResponsiveContainer width='100%' height={250}>\n <BarChart\n margin={{ left: 24, right: 24, bottom: 24 }}\n data={data}\n onClick={onClick}\n barGap={barGap}\n className='Layer__profit-and-loss-chart'\n >\n <CartesianGrid vertical={false} />\n <Legend\n verticalAlign='top'\n align='left'\n payload={[\n { value: 'Income', type: 'circle', id: 'IncomeLegend' },\n { value: 'Expenses', type: 'circle', id: 'ExpensesLegend' },\n ]}\n />\n <XAxis dataKey='name' tickLine={false} />\n <Bar\n dataKey='revenue'\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className='Layer__profit-and-loss-chart__bar--income'\n >\n <LabelList\n content={\n <Indicator\n animateFrom={animateFrom}\n setAnimateFrom={setAnimateFrom}\n />\n }\n />\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n <Bar\n dataKey='expenses'\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className='Layer__profit-and-loss-chart__bar--expenses'\n >\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n )\n}\n", "import React, { useEffect } from 'react'\nimport { Props as BaseProps } from 'recharts/types/component/Label'\n\n// This component does not always exist. It gets recreated each time the\n// selected month changes on the chart. As a result, the coordinates are not\n// persistent and so resist CSS animation. That way we work around this is by\n// telling the parent component what its X value is. The parent renders using\n// that X as the \"animateFrom\" value. This then tells the paren its new X,\n// which becomes the new \"animateFrom\", set using useState setter, which causes\n// a render, which causes the new `animateFrom` to be passed in, which causes a\n// change in the X coordinate, which causes a transition to trigger.\n\ntype Props = BaseProps & {\n animateFrom: number\n setAnimateFrom: (x: number) => void\n}\nconst emptyViewBox = { x: 0, y: 0, width: 0, height: 0 }\nexport const Indicator = ({\n viewBox = {},\n className,\n animateFrom,\n setAnimateFrom,\n}: Props) => {\n if (!className?.match(/selected/)) {\n return null\n }\n\n const {\n x: animateTo = 0,\n y = 0,\n width = 0,\n height = 0,\n } = 'x' in viewBox ? viewBox : emptyViewBox\n const boxWidth = width * 2 + 4 // the bar gap is 4\n const multiplier = 1.5\n const xOffset = (boxWidth * multiplier - boxWidth) / 2\n\n // useEffect callbacks run after the browser paints\n useEffect(() => {\n setAnimateFrom(animateTo)\n }, [animateTo])\n\n const actualX = animateFrom === -1 ? animateTo : animateFrom\n return (\n <rect\n className='Layer__profit-and-loss-chart__selection-indicator'\n style={{\n width: `${boxWidth * multiplier}px`,\n // @ts-expect-error -- y is fine but x apparently isn't!\n x: actualX - xOffset,\n y: y + height,\n }}\n />\n )\n}\n", "import React, { useContext } from 'react'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { add, endOfMonth, format, startOfMonth, Duration } from 'date-fns'\n\nexport const ProfitAndLossDatePicker = () => {\n const { changeDateRange, dateRange } = useContext(ProfitAndLoss.Context)\n const date = dateRange.startDate\n const label = format(date, 'LLLL y')\n const change = (duration: Duration) => {\n const newDate = add(date, duration)\n changeDateRange({\n startDate: startOfMonth(newDate),\n endDate: endOfMonth(newDate),\n })\n }\n const previousMonth = () => change({ months: -1 })\n const nextMonth = () => change({ months: 1 })\n return (\n <div className='Layer__profit-and-loss-date-picker'>\n <button\n aria-label='View Previous Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={previousMonth}\n >\n <ChevronLeft\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={18}\n />\n </button>\n <span className='Layer__profit-and-loss-date-picker__label'>{label}</span>\n <button\n aria-label='View Next Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={nextMonth}\n >\n <ChevronRight\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={18}\n />\n </button>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = {\n strokeColor?: string\n size?: number\n}\n\nconst ChevronLeft = ({\n strokeColor,\n size,\n ...props\n}: Props & SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={size || 24}\n height={size || 24}\n fill='none'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n stroke={strokeColor ?? '#000'}\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='m15 18-6-6 6-6'\n />\n </svg>\n)\nexport default ChevronLeft\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\n\nconst ChavronRight = ({ size, ...props }: Props) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={size || 24}\n height={size || 24}\n fill='none'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n stroke={'#000'}\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='m9 18 6-6-6-6'\n />\n </svg>\n)\nexport default ChavronRight\n", "import React, { useContext } from 'react'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\n\nexport const ProfitAndLossSummaries = () => {\n const { data: storedData } = useContext(PNL.Context)\n const data = storedData\n ? storedData\n : { income: { value: NaN }, net_profit: NaN }\n\n const incomeDirectionClass =\n (data.income.value ?? NaN) < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n const expensesDirectionClass =\n (data?.income?.value ?? NaN) - data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n const netProfitDirectionClass =\n data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n return (\n <div className='Layer__profit-and-loss-summaries'>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--income'>\n <span className='Layer__profit-and-loss-summaries__title'>Revenue</span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${incomeDirectionClass}`}\n >\n {formatMoney(Math.abs(data?.income?.value ?? NaN))}\n </span>\n </div>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--expenses'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Expenses\n </span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${expensesDirectionClass}`}\n >\n {formatMoney(Math.abs((data.income.value ?? 0) - data.net_profit))}\n </span>\n </div>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--net-profit'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Net Profit\n </span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${netProfitDirectionClass}`}\n >\n {formatMoney(Math.abs(data.net_profit))}\n </span>\n </div>\n </div>\n )\n}\n", "import React, { useContext } from 'react'\nimport { Direction } from '../../types'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossRow } from '../ProfitAndLossRow'\nimport emptyPNL from './empty_profit_and_loss_report'\n\nexport const ProfitAndLossTable = () => {\n const { data: actualData, isLoading } = useContext(ProfitAndLoss.Context)\n const data = !actualData || isLoading ? emptyPNL : actualData\n return (\n <>\n <div className='Layer__profit-and-loss-table'>\n <ProfitAndLossRow lineItem={data.income} direction={Direction.CREDIT} />\n <ProfitAndLossRow\n lineItem={data.cost_of_goods_sold}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.gross_profit,\n display_name: 'Gross Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow\n lineItem={data.expenses}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.profit_before_taxes,\n display_name: 'Profit Before Taxes',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow lineItem={data.taxes} direction={Direction.DEBIT} />\n <ProfitAndLossRow\n lineItem={{\n value: data.net_profit,\n display_name: 'Net Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n </div>\n <div className='Layer__profit-and-loss-table Layer__profit-and-loss-table__outflows'>\n <ProfitAndLossRow\n lineItem={data.other_outflows}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={data.personal_expenses}\n direction={Direction.DEBIT}\n />\n </div>\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LineItem } from '../../types'\n\ntype Props = {\n variant?: string\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n direction?: Direction\n summarize?: boolean\n}\n\nexport const ProfitAndLossRow = ({\n variant,\n lineItem,\n depth = 0,\n maxDepth = 1,\n direction = Direction.DEBIT,\n summarize = true,\n}: Props) => {\n if (!lineItem) {\n return null\n }\n const { value, display_name, line_items } = lineItem\n const [expanded, setExpanded] = useState(true)\n const amount = value ?? 0\n const amountString = centsToDollars(Math.abs(amount))\n const labelClasses = [\n 'Layer__profit-and-loss-row',\n 'Layer__profit-and-loss-row__label',\n ]\n const valueClasses = [\n 'Layer__profit-and-loss-row',\n 'Layer__profit-and-loss-row__value',\n ]\n const positive =\n amount === 0 ||\n (direction === Direction.CREDIT && amount > 0) ||\n (direction === Direction.DEBIT && amount < 0)\n valueClasses.push(\n positive\n ? 'Layer__profit-and-loss-row__value--amount-positive'\n : 'Layer__profit-and-loss-row__value--amount-negative',\n )\n labelClasses.push(`Layer__profit-and-loss-row__label--depth-${depth}`)\n valueClasses.push(`Layer__profit-and-loss-row__value--depth-${depth}`)\n variant &&\n labelClasses.push(`Layer__profit-and-loss-row__label--variant-${variant}`)\n variant &&\n valueClasses.push(`Layer__profit-and-loss-row__value--variant-${variant}`)\n\n const toggleExpanded = () => setExpanded(!expanded)\n const canGoDeeper = depth < maxDepth\n const hasChildren = (line_items?.length ?? 0) > 0\n const displayChildren = hasChildren && canGoDeeper\n labelClasses.push(\n `Layer__profit-and-loss-row__label--display-children-${displayChildren}`,\n )\n valueClasses.push(\n `Layer__profit-and-loss-row__value--display-children-${displayChildren}`,\n )\n\n displayChildren &&\n expanded &&\n labelClasses.push('Layer__profit-and-loss-row__label--expanded')\n\n displayChildren &&\n expanded &&\n valueClasses.push('Layer__profit-and-loss-row__value--expanded')\n return (\n <>\n <div className={labelClasses.join(' ')} onClick={toggleExpanded}>\n <ChevronDown size={16} />\n {display_name}\n </div>\n <div className={valueClasses.join(' ')}>{amountString}</div>\n {canGoDeeper && hasChildren && (\n <div\n className={`Layer__profit-and-loss-row__children ${\n expanded && 'Layer__profit-and-loss-row__children--expanded'\n }`}\n >\n <div className='Layer__balance-sheet-row__children--content'>\n {(line_items || []).map(line_item => (\n <ProfitAndLossRow\n key={line_item.display_name}\n lineItem={line_item}\n depth={depth + 1}\n maxDepth={maxDepth}\n direction={direction}\n />\n ))}\n {summarize && (\n <ProfitAndLossRow\n key={display_name}\n lineItem={{ value, display_name: `Total of ${display_name}` }}\n variant='summation'\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n", "import { ProfitAndLoss } from '../../types'\n\nexport default {\n type: 'Profit_And_Loss',\n business_id: '',\n start_date: '',\n end_date: '',\n income: {\n name: 'INCOME',\n display_name: 'Income',\n value: NaN,\n line_items: null,\n },\n cost_of_goods_sold: {\n display_name: 'Cost of Goods Sold',\n name: 'COGS',\n value: NaN,\n line_items: null,\n },\n gross_profit: NaN,\n expenses: {\n name: 'EXPENSES',\n display_name: 'Expenses',\n value: NaN,\n line_items: null,\n },\n profit_before_taxes: NaN,\n taxes: {\n name: 'TAXES',\n display_name: 'Taxes',\n value: NaN,\n line_items: null,\n },\n net_profit: NaN,\n other_outflows: {\n name: 'OTHER_OUTFLOWS',\n display_name: 'Other outflows',\n value: NaN,\n line_items: null,\n },\n personal_expenses: {\n name: 'PERSONAL',\n display_name: 'Personal expenses',\n value: NaN,\n line_items: null,\n },\n fully_categorized: false,\n} as ProfitAndLoss\n", "import React, { PropsWithChildren, useReducer, useEffect, Reducer } from 'react'\nimport { Layer } from '../../api/layer'\nimport { LayerContext } from '../../contexts/LayerContext'\nimport {\n LayerContextValues,\n LayerContextAction,\n LayerContextActionName as Action,\n} from '../../types'\nimport { LayerThemeConfig } from '../../types/layer_context'\nimport { add, isBefore } from 'date-fns'\nimport useSWR, { SWRConfig } from 'swr'\n\nconst reducer: Reducer<LayerContextValues, LayerContextAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case Action.setAuth:\n case Action.setCategories:\n case Action.setTheme:\n return { ...state, ...action.payload }\n default:\n return state\n }\n}\n\ntype LayerEnvironmentConfig = {\n url: string\n scope: string\n apiUrl: string\n}\n\nexport const LayerEnvironment: Record<string, LayerEnvironmentConfig> = {\n production: {\n url: 'not defined yet',\n scope: 'not defined yet',\n apiUrl: 'not defined yet',\n },\n staging: {\n url: 'https://auth.layerfi.com/oauth2/token',\n scope: 'https://sandbox.layerfi.com/sandbox',\n apiUrl: 'https://sandbox.layerfi.com',\n },\n}\n\nexport type Props = {\n businessId: string\n appId?: string\n appSecret?: string\n businessAccessToken?: string\n environment?: keyof typeof LayerEnvironment\n theme?: LayerThemeConfig\n}\n\nexport const LayerProvider = ({\n appId,\n appSecret,\n businessId,\n children,\n businessAccessToken,\n environment = 'production',\n theme,\n}: PropsWithChildren<Props>) => {\n const defaultSWRConfig = {\n revalidateInterval: 0,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n revalidateIfStale: false,\n }\n\n const { url, scope, apiUrl } = LayerEnvironment[environment]\n const [state, dispatch] = useReducer(reducer, {\n auth: {\n access_token: '',\n token_type: '',\n expires_in: 0,\n expires_at: new Date(2000, 1, 1),\n },\n businessId,\n categories: [],\n apiUrl,\n theme,\n })\n\n const { data: auth } =\n appId !== undefined && appSecret !== undefined\n ? useSWR(\n businessAccessToken === undefined &&\n appId !== undefined &&\n appSecret !== undefined &&\n isBefore(state.auth.expires_at, new Date()) &&\n 'authenticate',\n Layer.authenticate({\n appId,\n appSecret,\n authenticationUrl: url,\n scope,\n }),\n defaultSWRConfig,\n )\n : { data: undefined }\n\n useEffect(() => {\n if (businessAccessToken) {\n dispatch({\n type: Action.setAuth,\n payload: {\n auth: {\n access_token: businessAccessToken,\n token_type: 'Bearer',\n expires_in: 3600,\n expires_at: add(new Date(), { seconds: 3600.0 }),\n },\n },\n })\n } else if (auth?.access_token) {\n dispatch({\n type: Action.setAuth,\n payload: {\n auth: {\n ...auth,\n expires_at: add(new Date(), { seconds: auth.expires_in }),\n },\n },\n })\n }\n }, [businessAccessToken, auth?.access_token])\n\n const { data: categories } = useSWR(\n businessId && auth?.access_token && `categories-${businessId}`,\n Layer.getCategories(apiUrl, auth?.access_token, { params: { businessId } }),\n defaultSWRConfig,\n )\n useEffect(() => {\n if (categories?.data?.categories?.length) {\n dispatch({\n type: Action.setCategories,\n payload: { categories: categories.data.categories || [] },\n })\n }\n }, [categories?.data?.categories?.length])\n\n const setTheme = (theme: LayerThemeConfig) =>\n dispatch({\n type: Action.setTheme,\n payload: { theme },\n })\n\n return (\n <SWRConfig value={defaultSWRConfig}>\n <LayerContext.Provider value={{ ...state, setTheme }}>\n {children}\n </LayerContext.Provider>\n </SWRConfig>\n )\n}\n", "import React, { useState } from 'react'\nimport { useChartOfAccounts } from '../../hooks/useChartOfAccounts'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { ChartOfAccountsNewForm } from '../ChartOfAccountsNewForm'\nimport { ChartOfAccountsRow } from '../ChartOfAccountsRow'\n\nexport const ChartOfAccounts = () => {\n const { data, isLoading } = useChartOfAccounts()\n const [showingForm, setShowingForm] = useState(false)\n return (\n <div className='Layer__component Layer__chart-of-accounts'>\n {!data || isLoading ? (\n 'Loading.'\n ) : (\n <>\n <div className='Layer__chart-of-accounts__header'>\n <h2 className='Layer__chart-of-accounts__title'>\n Chart of Accounts\n </h2>\n <div className='Layer__chart-of-accounts__actions'>\n <button className='Layer__chart-of-accounts__download-button'>\n <DownloadCloud />\n Download\n </button>\n <button\n className='Layer__chart-of-accounts__edit-accounts-button'\n onClick={() => setShowingForm(!showingForm)}\n >\n Edit Accounts\n </button>\n </div>\n </div>\n {showingForm && <ChartOfAccountsNewForm />}\n <div className='Layer__chart-of-accounts__table'>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Name\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Type\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Sub-Type\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header Layer__chart-of-accounts__table-cell--header-balance'>\n Balance\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'></div>\n {data.accounts.map(account => (\n <ChartOfAccountsRow\n key={account.id}\n account={account}\n depth={0}\n />\n ))}\n </div>\n </>\n )}\n </div>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { AccountAlternate, ChartOfAccounts, NewAccount } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseChartOfAccounts = () => {\n data: ChartOfAccounts | undefined\n isLoading: boolean\n error: unknown\n create: (newAccount: NewAccount) => Promise<AccountAlternate>\n}\n\nexport const useChartOfAccounts: UseChartOfAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const { data, isLoading, error, mutate } = useSWR(\n businessId && auth?.access_token && `chart-of-accounts-${businessId}`,\n Layer.getChartOfAccounts(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const create = (newAccount: NewAccount) =>\n Layer.createAccount(apiUrl, auth?.access_token, {\n params: { businessId },\n body: newAccount,\n }).then(({ data }) => (mutate(), data))\n\n return { data: data?.data, isLoading, error, create }\n}\n", "import React, { useMemo, useState } from 'react'\nimport Select from 'react-select'\nimport { useChartOfAccounts } from '../../hooks/useChartOfAccounts'\nimport { Account, Direction } from '../../types'\n\ntype Option<T = string> = { label: string; value: T }\n\nconst flattenAccounts = (accounts: Account[]): Account[] =>\n accounts\n .flatMap(a => [a, flattenAccounts(a.subAccounts || [])])\n .flat()\n .filter(id => id)\n\nexport const ChartOfAccountsNewForm = () => {\n const { data, create: createAccount } = useChartOfAccounts()\n const accountOptions: Account[] = useMemo(\n () =>\n flattenAccounts(data?.accounts || []).sort((a, b) =>\n a?.name && b?.name ? a.name.localeCompare(b.name) : 0,\n ),\n [data?.accounts?.length],\n )\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [normality, setNormality] = useState<Direction>(Direction.DEBIT)\n const [parentAccount, setParentAccount] = useState<Account | undefined>(\n data?.accounts[0],\n )\n\n const save = () => {\n createAccount({\n name,\n normality,\n parent_id: {\n type: 'AccountId',\n id: parentAccount?.id || '',\n },\n description,\n })\n }\n\n return (\n <div className='Layer__chart-of-accounts-new-form'>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Name</span>\n <input\n name='name'\n value={name}\n onChange={event => setName(event.target.value)}\n ></input>\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Description</span>\n <input\n name='description'\n value={description}\n onChange={event => setDescription(event.target.value)}\n ></input>\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Normality</span>\n <Select<Option<Direction>>\n isSearchable={false}\n onChange={value => value && setNormality(value.value)}\n options={[\n { label: 'Credit', value: Direction.CREDIT },\n { label: 'Debit', value: Direction.DEBIT },\n ]}\n />\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Parent Account</span>\n <Select<Account>\n isSearchable={true}\n value={parentAccount}\n onChange={value => value && setParentAccount(value)}\n getOptionLabel={a => a.name}\n getOptionValue={a => a.id}\n options={accountOptions}\n />\n </div>\n <div className='Layer__chart-of-accounts-new-form__field Layer__chart-of-accounts-new-form__field--actions'>\n <button onClick={save}>Save</button>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport { centsToDollars } from '../../models/Money'\nimport { Account } from '../../types'\n\ntype Props = {\n account: Account\n depth?: number\n}\n\nexport const ChartOfAccountsRow = ({ account, depth = 0 }: Props) => {\n const classNames = [\n 'Layer__chart-of-accounts-row__table-cell',\n depth > 0 && `Layer__chart-of-accounts-row__table-cell--depth-${depth}`,\n ]\n\n const className = classNames.filter(id => id).join(' ')\n\n const amountClassName =\n account.balance < 0\n ? 'Layer__chart-of-accounts-row__table-cell--amount-negative'\n : 'Layer__chart-of-accounts-row__table-cell--amount-positive'\n\n return (\n <>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--name`}\n >\n {account.name}\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--type`}\n >\n Assets\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--subtype`}\n >\n Cash\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--balance ${amountClassName}`}\n >\n {centsToDollars(Math.abs(account.balance || 0))}\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--actions`}\n >\n <button className='Layer__chart-of-accounts-row__view-entries-button'>\n View Entries\n </button>\n </div>\n {(account.subAccounts || []).map(subAccount => (\n <ChartOfAccountsRow\n key={subAccount.id}\n account={subAccount}\n depth={depth + 1}\n />\n ))}\n </>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useState", "React", "React", "format", "React", "React", "React", "React", "React", "React", "format", "useState", "React", "React", "useState", "useSWR", "useRef", "React", "useRef", "useState", "React", "React", "React", "React", "React", "React", "React", "React", "React", "useState", "React", "TooltipTrigger", "TooltipContent", "classNames", "React", "React", "React", "React", "forwardRef", "useState", "React", "React", "React", "React", "React", "classNames", "React", "React", "useRef", "useState", "classNames", "classNames", "React", "useRef", "useState", "React", "classNames", "classNames", "React", "classNames", "React", "React", "useRef", "React", "useRef", "React", "React", "classNames", "React", "useEffect", "useState", "classNames", "useState", "classNames", "shift", "useEffect", "React", "forwardRef", "categorizeBankTransaction", "useState", "React", "React", "classNames", "parseISO", "dateFormat", "useRef", "useState", "categorizeBankTransaction", "React", "React", "useRef", "useState", "classNames", "parseISO", "formatTime", "isCredit", "dateFormat", "useRef", "useState", "categorizeBankTransaction", "React", "React", "React", "React", "forwardRef", "classNames", "React", "Loader", "React", "useState", "React", "Loader", "React", "useSWR", "React", "createContext", "useState", "useSWR", "useState", "React", "useContext", "useState", "React", "useEffect", "endOfMonth", "format", "parseISO", "startOfMonth", "useContext", "useState", "React", "React", "useContext", "React", "React", "endOfMonth", "format", "startOfMonth", "useContext", "React", "React", "useContext", "useContext", "React", "React", "useContext", "React", "useState", "useState", "React", "useContext", "React", "endOfMonth", "startOfMonth", "createContext", "React", "React", "useEffect", "add", "useSWR", "useEffect", "theme", "React", "React", "useState", "useSWR", "data", "React", "useMemo", "useState", "Select", "createAccount", "useMemo", "useState", "React", "Select", "React", "classNames", "React", "useState", "React"]
|
|
3
|
+
"sources": ["../../src/components/BalanceSheet/BalanceSheet.tsx", "../../src/api/util.ts", "../../src/api/layer/authenticate.ts", "../../src/api/layer/balance_sheet.json", "../../src/api/layer/balance_sheet.ts", "../../src/models/APIError.ts", "../../src/api/layer/authenticated_http.ts", "../../src/api/layer/bankTransactions.ts", "../../src/api/layer/categories.ts", "../../src/api/layer/chart_of_accounts.ts", "../../src/api/layer/profit_and_loss.ts", "../../src/api/layer.ts", "../../src/hooks/useLayerContext/useLayerContext.tsx", "../../src/contexts/LayerContext/LayerContext.tsx", "../../src/hooks/useBalanceSheet/useBalanceSheet.tsx", "../../src/icons/DownloadCloud.tsx", "../../src/components/BalanceSheetDatePicker/BalanceSheetDatePicker.tsx", "../../src/icons/Calendar.tsx", "../../src/components/BalanceSheetRow/BalanceSheetRow.tsx", "../../src/icons/ChevronDown.tsx", "../../src/models/Money.ts", "../../src/components/SkeletonBalanceSheetRow/SkeletonBalanceSheetRow.tsx", "../../src/components/BankTransactions/BankTransactions.tsx", "../../src/hooks/useBankTransactions/useBankTransactions.tsx", "../../src/hooks/useElementSize/useElementSize.ts", "../../src/components/BankTransactionListItem/BankTransactionListItem.tsx", "../../src/components/Button/Button.tsx", "../../src/components/Button/SubmitButton.tsx", "../../src/icons/AlertCircle.tsx", "../../src/icons/Check.tsx", "../../src/icons/CheckCircle.tsx", "../../src/icons/Loader.tsx", "../../src/components/Tooltip/Tooltip.tsx", "../../src/components/Tooltip/useTooltip.ts", "../../src/components/CategoryMenu/CategoryMenu.tsx", "../../src/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow.tsx", "../../src/icons/FolderPlus.tsx", "../../src/icons/Link.tsx", "../../src/icons/RefreshCcw.tsx", "../../src/icons/Scissors.tsx", "../../src/components/Input/Input.tsx", "../../src/components/Input/InputGroup.tsx", "../../src/components/Typography/Text.tsx", "../../src/components/Typography/Heading.tsx", "../../src/components/Input/FileInput.tsx", "../../src/icons/UploadCloud.tsx", "../../src/components/Textarea/Textarea.tsx", "../../src/components/Toggle/Toggle.tsx", "../../src/components/Pill/Pill.tsx", "../../src/components/BankTransactionRow/BankTransactionRow.tsx", "../../src/components/Container/Container.tsx", "../../src/utils/colors.ts", "../../src/components/Container/Header.tsx", "../../src/components/DataState/DataState.tsx", "../../src/icons/AlertOctagon.tsx", "../../src/components/Loader/Loader.tsx", "../../src/components/Hello/Hello.tsx", "../../src/components/ProfitAndLoss/ProfitAndLoss.tsx", "../../src/hooks/useProfitAndLoss/useProfitAndLoss.tsx", "../../src/components/ProfitAndLossChart/ProfitAndLossChart.tsx", "../../src/components/ProfitAndLossChart/Indicator.tsx", "../../src/components/ProfitAndLossDatePicker/ProfitAndLossDatePicker.tsx", "../../src/icons/ChevronLeft.tsx", "../../src/icons/ChevronRight.tsx", "../../src/components/ProfitAndLossSummaries/ProfitAndLossSummaries.tsx", "../../src/components/ProfitAndLossTable/ProfitAndLossTable.tsx", "../../src/components/ProfitAndLossRow/ProfitAndLossRow.tsx", "../../src/components/ProfitAndLossTable/empty_profit_and_loss_report.ts", "../../src/providers/LayerProvider/LayerProvider.tsx", "../../src/components/ChartOfAccounts/ChartOfAccounts.tsx", "../../src/hooks/useChartOfAccounts/useChartOfAccounts.tsx", "../../src/components/ChartOfAccountsNewForm/ChartOfAccountsNewForm.tsx", "../../src/components/ChartOfAccountsRow/ChartOfAccountsRow.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState } from 'react'\nimport { useBalanceSheet } from '../../hooks/useBalanceSheet'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { BalanceSheetDatePicker } from '../BalanceSheetDatePicker'\nimport { BalanceSheetRow } from '../BalanceSheetRow'\nimport { SkeletonBalanceSheetRow } from '../SkeletonBalanceSheetRow'\nimport { format, parseISO } from 'date-fns'\n\nexport const BalanceSheet = () => {\n const [effectiveDate, setEffectiveDate] = useState(new Date())\n const { data, isLoading } = useBalanceSheet(effectiveDate)\n const assets = {\n name: 'Assets',\n display_name: 'Assets',\n line_items: data?.assets || [],\n value: undefined,\n }\n const lne = {\n name: 'LiabilitiesAndEquity',\n display_name: 'Liabilities & Equity',\n line_items: data?.liabilities_and_equity || [],\n value: undefined,\n }\n const dateString = format(effectiveDate, 'LLLL d, yyyy')\n return (\n <div className='Layer__component Layer__balance-sheet'>\n <div className='Layer__balance-sheet__header'>\n <h2 className='Layer__balance-sheet__title'>\n Balance Sheet\n <span className='Layer__balance-sheet__date'>{dateString}</span>\n </h2>\n <BalanceSheetDatePicker\n value={effectiveDate}\n onChange={event => setEffectiveDate(parseISO(event.target.value))}\n />\n <button className='Layer__balance-sheet__download-button'>\n <DownloadCloud />\n Download\n </button>\n </div>\n {!data || isLoading ? (\n <div className='Layer__balance-sheet__table'>\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n <SkeletonBalanceSheetRow />\n </SkeletonBalanceSheetRow>\n </SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow>\n <SkeletonBalanceSheetRow />\n </SkeletonBalanceSheetRow>\n </div>\n ) : (\n <div className='Layer__balance-sheet__table'>\n <BalanceSheetRow\n key={assets.name}\n lineItem={assets}\n summarize={false}\n />\n <BalanceSheetRow key={lne.name} lineItem={lne} summarize={false} />\n </div>\n )}\n </div>\n )\n}\n", "export const formStringFromObject = (\n object: Record<string, string | number | boolean>,\n): string =>\n Object.entries(object)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&')\n", "import { OAuthResponse } from '../../types'\nimport { formStringFromObject } from '../util'\n\ntype AuthenticationArguments = {\n appId: string\n appSecret: string\n authenticationUrl?: string\n scope: string\n}\nexport const authenticate =\n ({\n appId,\n appSecret,\n authenticationUrl = 'https://auth.layerfi.com/oauth2/token',\n scope,\n }: AuthenticationArguments) =>\n (): Promise<OAuthResponse> =>\n fetch(authenticationUrl, {\n method: 'POST',\n headers: {\n Authorization: 'Basic ' + btoa(appId + ':' + appSecret),\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formStringFromObject({\n grant_type: 'client_credentials',\n scope,\n client_id: appId,\n }),\n }).then(res => res.json() as Promise<OAuthResponse>)\n", "{\n \"business_id\": \"05eb0771-ae7d-4cd1-ae7f-cc8765351afc\",\n \"type\": \"Balance_Sheet\",\n \"start_date\": \"2023-01-01T00:00:00Z\",\n \"end_date\": \"2023-01-31T00:00:00Z\",\n \"assets\": [\n {\n \"name\": \"CURRENT_ASSETS\",\n \"display_name\": \"Current Assets\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"BANK_ACCOUNTS\",\n \"display_name\": \"Bank Accounts\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"display_name\": \"Checking Account 123\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"display_name\": \"Savings Account 456\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"name\": \"ACCOUNTS_RECEIVABLE\",\n \"display_name\": \"Bank Accounts\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"account_id\": \"cc7861f7-d8b3-4ab9-b853-6b85838199ef\",\n \"display_name\": \"Accounts Receivable - Customer A\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"account_id\": \"23606d6a-4e78-406b-9283-76bfb750639f\",\n \"display_name\": \"Accounts Receivable - Customer B\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"name\": \"OTHER_ASSETS\",\n \"display_name\": \"Other Assets\",\n \"value\": \"150\",\n \"line_items\": [\n {\n \"account_id\": \"40816f76-1409-4727-b733-c4c126f0a725\",\n \"display_name\": \"Inventory Item A\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n }\n ]\n }\n ],\n \"liabilities_and_equity\": [\n {\n \"name\": \"LIABILITIES\",\n \"display_name\": \"Liabilities\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"CURRENT_LIABILITIES\",\n \"display_name\": \"Current Liabilities\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"account_id\": \"40816f76-1409-4727-b733-c4c126f0a725\",\n \"display_name\": \"ACCOUNTS_PAYABLE\",\n \"value\": \"50000\",\n \"line_items\": [\n {\n \"account_id\": \"261d0ef4-6d35-4081-8c82-685114fd497d\",\n \"display_name\": \"Supplier A\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"account_id\": \"5123c5eb-28ce-4cce-90bd-389e4befb645\",\n \"display_name\": \"Credit Cards\",\n \"value\": \"50000\",\n \"line_items\": [\n {\n \"account_id\": \"beb41e99-0539-4d97-8faf-c8464eac60dc\",\n \"display_name\": \"Visa 5678\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n },\n {\n \"account_id\": \"7261b324-aa1a-4c03-9ac8-0a40980d5886\",\n \"display_name\": \"Other current Liabilities\",\n \"value\": \"2309\",\n \"line_items\": []\n }\n ]\n }\n ]\n },\n {\n \"name\": \"EQUITY\",\n \"display_name\": \"Equity\",\n \"value\": \"100000\",\n \"line_items\": [\n {\n \"name\": \"OPENING_BALANCE_EQUITY\",\n \"display_name\": \"Opening Balance Equity\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"name\": \"RETAINED_EARNINGS\",\n \"display_name\": \"Retained Earnings\",\n \"value\": \"50000\",\n \"line_items\": []\n },\n {\n \"name\": \"NET_INCOME\",\n \"display_name\": \"Net Income\",\n \"value\": \"50000\",\n \"line_items\": []\n }\n ]\n }\n ],\n \"fully_categorized\": true\n}\n", "// import { BalanceSheet } from '../../types'\n// import { get } from './authenticated_http'\nimport { BalanceSheet } from '../../types'\nimport Data from './balance_sheet.json'\n\n// export const getBalanceSheet = get<{\n// data?: BalanceSheet\n// error?: unknown\n// }>(\n// ({ businessId }) =>\n// `https://sandbox.layerfi.com/v1/businesses/${businessId}/balances`,\n// )\n\nexport interface GetBalanceSheetParams {\n businessId: string\n date: string\n}\n\nexport const getBalanceSheet =\n (_token: string, _params: { params: GetBalanceSheetParams }) => () =>\n Data as unknown as BalanceSheet\n", "export interface APIErrorMessage {\n type?: string\n description?: string\n}\n\nexport class APIError extends Error {\n code?: number\n info?: string\n messages?: APIErrorMessage[]\n\n constructor(message: string, code?: number, messages?: APIErrorMessage[]) {\n super(message)\n this.name = 'APIError'\n this.code = code\n this.messages = messages\n\n Object.setPrototypeOf(this, APIError.prototype)\n }\n\n getMessage() {\n return this.message\n }\n\n getAllMessages() {\n return this.messages?.map(x => x.description)\n }\n}\n", "import { APIError } from '../../models/APIError'\n\nexport type HTTPVerb = 'get' | 'put' | 'post' | 'patch' | 'options' | 'delete'\n\nexport const get =\n <\n Return extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, string | undefined> = Record<\n string,\n string | undefined\n >,\n >(\n url: (params: Params) => string,\n ) =>\n (\n baseUrl: string,\n accessToken: string | undefined,\n options?: { params?: Params },\n ) =>\n (): Promise<Return> =>\n fetch(`${baseUrl}${url(options?.params || ({} as Params))}`, {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n .then(res => handleResponse<Return>(res))\n .catch(error => handleException(error))\n\nexport const request =\n (verb: HTTPVerb) =>\n <\n Return extends Record<string, unknown> = Record<string, unknown>,\n Body extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, string | undefined> = Record<\n string,\n string | undefined\n >,\n >(\n url: (params: Params) => string,\n ) =>\n (\n baseUrl: string,\n accessToken: string | undefined,\n options?: {\n params?: Params\n body?: Body\n },\n ): Promise<Return> =>\n fetch(`${baseUrl}${url(options?.params || ({} as Params))}`, {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n method: verb.toUpperCase(),\n body: JSON.stringify(options?.body),\n })\n .then(res => handleResponse<Return>(res))\n .catch(error => handleException(error))\n\nexport const post = request('post')\nexport const put = request('put')\n\nconst handleResponse = async <Return>(res: Response) => {\n if (!res.ok) {\n const errors = await tryToReadErrorsFromResponse(res)\n const apiError = new APIError(\n 'An error occurred while fetching the data from API.',\n res.status,\n errors,\n )\n throw apiError\n }\n\n const parsedResponse = await res.json()\n if (parsedResponse && 'errors' in parsedResponse) {\n const apiError = new APIError(\n 'Errors in the API response.',\n res.status,\n parsedResponse.errors ?? [],\n )\n throw apiError\n }\n\n return parsedResponse as Return\n}\n\nconst handleException = async (error: Error) => {\n if (error.name === 'APIError') {\n throw error\n }\n\n const apiError = new APIError(\n 'An error occurred while parsing the data from API.',\n undefined,\n [],\n )\n throw apiError\n}\n\nconst tryToReadErrorsFromResponse = async (res?: Response) => {\n try {\n const data = await res?.json()\n return data?.errors ?? []\n } catch (_err) {\n return []\n }\n}\n", "import { CategoryUpdate, BankTransaction, Metadata } from '../../types'\nimport { get, put } from './authenticated_http'\n\nexport type GetBankTransactionsReturn = {\n data?: BankTransaction[]\n meta?: Metadata\n error?: unknown\n}\nexport interface GetBankTransactionsParams\n extends Record<string, string | undefined> {\n businessId: string\n sortOrder?: 'ASC' | 'DESC'\n sortBy?: string\n}\nexport const getBankTransactions = get<\n GetBankTransactionsReturn,\n GetBankTransactionsParams\n>(\n ({\n businessId,\n sortBy = 'date',\n sortOrder = 'DESC',\n }: GetBankTransactionsParams) =>\n `/v1/businesses/${businessId}/bank-transactions?sort_by=${sortBy}&sort_order=${sortOrder}`,\n)\n\nexport const categorizeBankTransaction = put<\n { data: BankTransaction; errors: unknown },\n CategoryUpdate\n>(\n ({ businessId, bankTransactionId }) =>\n `/v1/businesses/${businessId}/bank-transactions/${bankTransactionId}/categorize`,\n)\n", "import { Category } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getCategories = get<{\n data: {\n type: 'Category_List'\n categories: Category[]\n }\n}>(({ businessId }) => `/v1/businesses/${businessId}/categories`)\n", "import { AccountAlternate, ChartOfAccounts, NewAccount } from '../../types'\nimport { get, post } from './authenticated_http'\n\nexport const getChartOfAccounts = get<{ data: ChartOfAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const createAccount = post<{ data: AccountAlternate }, NewAccount>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n", "import { ProfitAndLoss } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getProfitAndLoss = get<{\n data?: ProfitAndLoss\n error?: unknown\n}>(\n ({ businessId, startDate, endDate }) =>\n `/v1/businesses/${businessId}/reports/profit-and-loss?start_date=${\n startDate ? encodeURIComponent(startDate) : ''\n }&end_date=${endDate ? encodeURIComponent(endDate) : ''}`,\n)\n", "import { authenticate } from './layer/authenticate'\nimport { getBalanceSheet } from './layer/balance_sheet'\nimport {\n getBankTransactions,\n categorizeBankTransaction,\n} from './layer/bankTransactions'\nimport { getCategories } from './layer/categories'\nimport { getChartOfAccounts, createAccount } from './layer/chart_of_accounts'\nimport { getProfitAndLoss } from './layer/profit_and_loss'\n\nexport const Layer = {\n authenticate,\n categorizeBankTransaction,\n createAccount,\n getBalanceSheet,\n getBankTransactions,\n getCategories,\n getChartOfAccounts,\n getProfitAndLoss,\n}\n", "import { useContext } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\n\nexport const useLayerContext = () => useContext(LayerContext)\n", "import { createContext } from 'react'\nimport { LayerContextValues } from '../../types'\nimport { LayerThemeConfig } from '../../types/layer_context'\n\nexport const LayerContext = createContext<\n LayerContextValues & { setTheme: (theme: LayerThemeConfig) => void }\n>({\n auth: {\n access_token: '',\n expires_at: new Date(2000, 1, 1),\n expires_in: -1,\n token_type: '',\n },\n businessId: '',\n categories: [],\n apiUrl: '',\n theme: undefined,\n setTheme: () => undefined,\n})\n", "import { Layer } from '../../api/layer'\nimport { BalanceSheet } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport { format, startOfDay } from 'date-fns'\nimport useSWR from 'swr'\n\ntype UseBalanceSheet = (date?: Date) => {\n data: BalanceSheet | undefined\n isLoading: boolean\n error: unknown\n}\n\nexport const useBalanceSheet: UseBalanceSheet = (date: Date = new Date()) => {\n const { auth, businessId } = useLayerContext()\n const dateString = format(startOfDay(date), 'yyyy-mm-dd')\n\n const { data, isLoading, error } = useSWR(\n businessId &&\n dateString &&\n auth?.access_token &&\n `balance-sheet-${businessId}-${dateString}`,\n Layer.getBalanceSheet(auth?.access_token, {\n params: { businessId, date: dateString },\n }),\n )\n\n return { data, isLoading, error }\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst DownloadCloud = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={24}\n height={24}\n fill='none'\n {...props}\n >\n <path\n stroke='#000'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='M4 16.242A4.5 4.5 0 0 1 6.08 8.02a6.002 6.002 0 0 1 11.84 0A4.5 4.5 0 0 1 20 16.242M8 17l4 4m0 0 4-4m-4 4v-9'\n />\n </svg>\n)\nexport default DownloadCloud\n", "import React, { useRef } from 'react'\nimport CalendarIcon from '../../icons/Calendar'\nimport { format } from 'date-fns'\n\ntype Props = {\n value: Date\n onChange: React.ChangeEventHandler<HTMLInputElement>\n}\n\nexport const BalanceSheetDatePicker = ({ value, onChange }: Props) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const showPicker = () => inputRef.current && inputRef.current.showPicker()\n return (\n <span className='Layer__balance-sheet-date-picker'>\n <button onClick={showPicker}>\n <CalendarIcon />\n {format(value, 'LLLL dd, yyyy')}\n <input\n type='date'\n ref={inputRef}\n value={format(value, 'yyyy-MM-dd')}\n onChange={onChange}\n />\n </button>\n </span>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst Calendar = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={20}\n height={22}\n fill='none'\n {...props}\n >\n <path\n stroke='#000'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='M19 9H1m13-8v4M6 1v4m-.2 16h8.4c1.68 0 2.52 0 3.162-.327a3 3 0 0 0 1.311-1.311C19 18.72 19 17.88 19 16.2V7.8c0-1.68 0-2.52-.327-3.162a3 3 0 0 0-1.311-1.311C16.72 3 15.88 3 14.2 3H5.8c-1.68 0-2.52 0-3.162.327a3 3 0 0 0-1.311 1.311C1 5.28 1 6.12 1 7.8v8.4c0 1.68 0 2.52.327 3.162a3 3 0 0 0 1.311 1.311C3.28 21 4.12 21 5.8 21Z'\n />\n </svg>\n)\nexport default Calendar\n", "import React, { useState } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars } from '../../models/Money'\nimport { LineItem } from '../../types'\n\ntype Props = {\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n variant?: string\n summarize?: boolean\n}\n\nexport const BalanceSheetRow = ({\n lineItem,\n depth = 0,\n maxDepth = 2,\n variant,\n summarize = true,\n}: Props) => {\n if (!lineItem) {\n return null\n }\n const { value, display_name, line_items } = lineItem\n const [expanded, setExpanded] = useState(true)\n const amount = value || 0\n const isPositive = amount >= 0\n const amountString = centsToDollars(Math.abs(amount))\n const labelClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__label',\n ]\n const valueClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__value',\n ]\n !!value &&\n valueClasses.push(\n isPositive\n ? 'Layer__balance-sheet-row__value--amount-positive'\n : 'Layer__balance-sheet-row__value--amount-negative',\n )\n labelClasses.push(`Layer__balance-sheet-row__label--depth-${depth}`)\n valueClasses.push(`Layer__balance-sheet-row__value--depth-${depth}`)\n\n variant &&\n labelClasses.push(`Layer__balance-sheet-row__label--variant-${variant}`)\n variant &&\n valueClasses.push(`Layer__balance-sheet-row__value--variant-${variant}`)\n\n const toggleExpanded = () => setExpanded(!expanded)\n const canGoDeeper = depth < maxDepth\n const hasChildren = (line_items?.length ?? 0) > 0\n const displayChildren = hasChildren && canGoDeeper\n labelClasses.push(\n `Layer__balance-sheet-row__label--display-children-${displayChildren}`,\n )\n valueClasses.push(\n `Layer__balance-sheet-row__value--display-children-${displayChildren}`,\n )\n\n displayChildren &&\n expanded &&\n labelClasses.push('Layer__balance-sheet-row__label--expanded')\n\n displayChildren &&\n expanded &&\n valueClasses.push('Layer__balance-sheet-row__value--expanded')\n\n return (\n <>\n <div className={labelClasses.join(' ')} onClick={toggleExpanded}>\n <ChevronDown size={16} />\n {display_name}\n </div>\n <div className={valueClasses.join(' ')}>{!!value && amountString}</div>\n {canGoDeeper && hasChildren && (\n <div\n className={`Layer__balance-sheet-row__children ${\n expanded && 'Layer__balance-sheet-row__children--expanded'\n }`}\n >\n <div className='Layer__balance-sheet-row__children--content'>\n {(line_items || []).map((line_item, idx) => (\n <BalanceSheetRow\n key={`${line_item.display_name}_${idx}`}\n lineItem={line_item}\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n ))}\n {summarize && (\n <BalanceSheetRow\n key={display_name}\n lineItem={{ value, display_name: `Total of ${display_name}` }}\n variant='summation'\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronDown = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M4.5 6.75L9 11.25L13.5 6.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default ChevronDown\n", "const formatter = new Intl.NumberFormat('en-US', {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n})\n\nexport const centsToDollars = (cents: number = NaN): string =>\n isNaN(cents) ? '-.--' : formatter.format(cents / 100)\n\nexport const dollarsToCents = (dollars: string = ''): number =>\n Math.round(parseFloat(dollars) * 100)\n\nexport default {\n centsToDollars,\n dollarsToCents,\n}\n", "import React, { PropsWithChildren } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\n\ntype Props = PropsWithChildren\n\nexport const SkeletonBalanceSheetRow = ({ children }: Props) => {\n const labelClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__label',\n 'Layer__balance-sheet-row__label--skeleton',\n ]\n const valueClasses = [\n 'Layer__balance-sheet-row',\n 'Layer__balance-sheet-row__value',\n 'Layer__balance-sheet-row__value--skeleton',\n ]\n return (\n <>\n <div className={labelClasses.join(' ')}>\n {children && <ChevronDown size={16} />}\n <div\n style={{ width: '20rem' }}\n className='Layer__balance-sheet-row__skeleton-text'\n >\n {' '}\n </div>\n </div>\n <div className={valueClasses.join(' ')}>\n <div\n style={{ width: '4rem' }}\n className='Layer__balance-sheet-row__skeleton-text'\n >\n {' '}\n </div>\n </div>\n {children && (\n <div className='Layer__balance-sheet-row__children Layer__balance-sheet-row__children--expanded Layer__balance-sheet-row__children--skeleton'>\n {children}\n </div>\n )}\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { BankTransactionListItem } from '../BankTransactionListItem'\nimport { BankTransactionRow } from '../BankTransactionRow'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { Loader } from '../Loader'\nimport { Toggle } from '../Toggle'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'bank-transactions'\n\nconst dateFormat = 'LLL d, yyyy'\n\nenum DisplayState {\n review = 'review',\n categorized = 'categorized',\n}\n\nconst CategorizedCategories = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n]\nconst ReviewCategories = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n]\n\nexport interface BankTransactionsProps {\n asWidget?: boolean\n}\n\nconst filterVisibility =\n (display: DisplayState) => (bankTransaction: BankTransaction) => {\n const categorized = CategorizedCategories.includes(\n bankTransaction.categorization_status,\n )\n const inReview =\n ReviewCategories.includes(bankTransaction.categorization_status) ||\n bankTransaction.recently_categorized\n\n return (\n (display === DisplayState.review && inReview) ||\n (display === DisplayState.categorized && categorized)\n )\n }\n\nexport const BankTransactions = ({\n asWidget = false,\n}: BankTransactionsProps) => {\n const [display, setDisplay] = useState<DisplayState>(DisplayState.review)\n const { data, isLoading, error, isValidating, refetch } =\n useBankTransactions()\n const bankTransactions = data?.filter(filterVisibility(display))\n const onCategorizationDisplayChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) =>\n setDisplay(\n event.target.value === DisplayState.categorized\n ? DisplayState.categorized\n : DisplayState.review,\n )\n const [openRows, setOpenRows] = useState<Record<string, boolean>>({})\n const toggleOpen = (id: string) =>\n setOpenRows({ ...openRows, [id]: !openRows[id] })\n const [shiftStickyHeader, setShiftStickyHeader] = useState(0)\n\n const headerRef = useElementSize((_el, _en, size) => {\n if (size?.height && size?.height >= 90) {\n const newShift = -Math.floor(size.height / 2) + 6\n if (newShift !== shiftStickyHeader) {\n setShiftStickyHeader(newShift)\n }\n } else if (size?.height > 0 && shiftStickyHeader !== 0) {\n setShiftStickyHeader(0)\n }\n })\n\n const editable = display === DisplayState.review\n return (\n <Container name={COMPONENT_NAME} asWidget={asWidget}>\n <Header\n ref={headerRef}\n className='Layer__bank-transactions__header'\n style={{ top: shiftStickyHeader }}\n >\n <Heading className='Layer__bank-transactions__title'>\n Transactions\n </Heading>\n <Toggle\n name='bank-transaction-display'\n options={[\n { label: 'To Review', value: DisplayState.review },\n { label: 'Categorized', value: DisplayState.categorized },\n ]}\n selected={display}\n onChange={onCategorizationDisplayChange}\n />\n </Header>\n <table\n width='100%'\n className='Layer__table Layer__bank-transactions__table'\n >\n <thead>\n <tr>\n <th className='Layer__table-header Layer__bank-transactions__date-col'>\n Date\n </th>\n <th className='Layer__table-header Layer__bank-transactions__tx-col'>\n Transaction\n </th>\n <th className='Layer__table-header Layer__bank-transactions__account-col'>\n Account\n </th>\n <th className='Layer__table-header Layer__table-cell--amount Layer__table-cell__amount-col'>\n Amount\n </th>\n {editable ? (\n <th className='Layer__table-header Layer__table-header--primary Layer__table-cell__category-col'>\n Categorize\n </th>\n ) : (\n <th className='Layer__table-header Layer__table-cell__category-col'>\n Category\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {!isLoading &&\n bankTransactions?.map((bankTransaction: BankTransaction) => (\n <BankTransactionRow\n key={bankTransaction.id}\n dateFormat={dateFormat}\n bankTransaction={bankTransaction}\n isOpen={openRows[bankTransaction.id]}\n toggleOpen={toggleOpen}\n editable={editable}\n />\n ))}\n </tbody>\n </table>\n {isLoading && !bankTransactions ? (\n <div className='Layer__bank-transactions__loader-container'>\n <Loader />\n </div>\n ) : null}\n {!isLoading && (\n <ul className='Layer__bank-transactions__list'>\n {bankTransactions?.map((bankTransaction: BankTransaction) => (\n <BankTransactionListItem\n key={bankTransaction.id}\n dateFormat={dateFormat}\n bankTransaction={bankTransaction}\n isOpen={openRows[bankTransaction.id]}\n toggleOpen={toggleOpen}\n editable={editable}\n />\n ))}\n </ul>\n )}\n {!isLoading &&\n !error &&\n (bankTransactions === undefined ||\n (bankTransactions !== undefined && bankTransactions.length === 0)) ? (\n <div className='Layer__table-state-container'>\n <DataState\n status={DataStateStatus.allDone}\n title='You are up to date with transactions!'\n description='All uncategorized transaction will be displayed here'\n onRefresh={() => refetch()}\n isLoading={isValidating}\n />\n </div>\n ) : null}\n {!isLoading && error ? (\n <div className='Layer__table-state-container'>\n <DataState\n status={DataStateStatus.failed}\n title='Something went wrong'\n description='We couldn\u2019t load your data.'\n onRefresh={() => refetch()}\n isLoading={isValidating}\n />\n </div>\n ) : null}\n </Container>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { BankTransaction, CategoryUpdate, Metadata } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseBankTransactions = () => {\n data?: BankTransaction[]\n metadata: Metadata\n isLoading: boolean\n isValidating: boolean\n error: unknown\n categorize: (\n id: BankTransaction['id'],\n newCategory: CategoryUpdate,\n ) => Promise<void>\n updateOneLocal: (bankTransaction: BankTransaction) => void\n refetch: () => void\n}\n\nexport const useBankTransactions: UseBankTransactions = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const {\n data: responseData,\n isLoading,\n isValidating,\n error: responseError,\n mutate,\n } = useSWR(\n businessId && auth?.access_token && `bank-transactions-${businessId}`,\n Layer.getBankTransactions(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const {\n data = undefined,\n meta: metadata = {},\n error = undefined,\n } = responseData || {}\n\n const categorize = (\n id: BankTransaction['id'],\n newCategory: CategoryUpdate,\n ) => {\n const foundBT = data?.find(x => x.business_id === businessId && x.id === id)\n if (foundBT) {\n updateOneLocal({ ...foundBT, processing: true, error: undefined })\n }\n\n return Layer.categorizeBankTransaction(apiUrl, auth.access_token, {\n params: { businessId, bankTransactionId: id },\n body: newCategory,\n })\n .then(({ data: newBT, errors }) => {\n if (newBT) {\n newBT.recently_categorized = true\n updateOneLocal(newBT)\n }\n if (errors) {\n console.error(errors)\n throw errors\n }\n })\n .catch(err => {\n const newBT = data?.find(\n x => x.business_id === businessId && x.id === id,\n )\n\n if (newBT) {\n updateOneLocal({\n ...newBT,\n error: err.message,\n processing: false,\n })\n }\n })\n }\n\n const updateOneLocal = (newBankTransaction: BankTransaction) => {\n const updatedData = data?.map(bt =>\n bt.id === newBankTransaction.id ? newBankTransaction : bt,\n )\n mutate({ data: updatedData }, { revalidate: false })\n }\n\n const refetch = () => {\n mutate()\n }\n\n return {\n data,\n metadata,\n isLoading,\n isValidating,\n refetch,\n error: responseError || error,\n categorize,\n updateOneLocal,\n }\n}\n", "import { useLayoutEffect, useRef } from 'react'\n\nexport const useElementSize = <T extends HTMLElement>(\n callback: (\n target: T,\n entry: ResizeObserverEntry,\n size: { width: number; height: number },\n ) => void,\n) => {\n const ref = useRef<T>(null)\n\n useLayoutEffect(() => {\n const element = ref?.current\n\n if (!element) {\n return\n }\n\n const observer = new ResizeObserver(entries => {\n callback(element, entries[0], {\n width: element.offsetWidth,\n height: element.offsetHeight,\n })\n })\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [callback, ref])\n\n return ref\n}\n", "import React, { useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Direction } from '../../types'\nimport { SubmitButton } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Pill } from '../Pill'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n bankTransaction: BankTransaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n editable: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionListItem = ({\n dateFormat,\n bankTransaction,\n isOpen,\n toggleOpen,\n editable,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? bankTransaction.categorization_flow.suggestions[0]\n : undefined,\n )\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (isOpen && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n toggleOpen(bankTransaction.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n selectedCategory?.stable_name || selectedCategory?.category || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-list-item'\n const openClassName = isOpen ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n isOpen ? openClassName : '',\n )\n\n return (\n <li className={rowClassName}>\n <span className={`${className}__heading`}>\n <span className={`${className}__heading-date`}>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n <span className={`${className}__heading-separator`} />\n <span className={`${className}__heading-account-name`}>\n {bankTransaction.account_name ?? ''}\n </span>\n </span>\n <span className={`${className}__body`}>\n <span className={`${className}__body__name`}>\n {bankTransaction.counterparty_name}\n </span>\n <span\n className={`${className}__amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n >\n {isCredit(bankTransaction) ? '+$' : ' $'}\n {formatMoney(bankTransaction.amount)}\n </span>\n <div\n onClick={() => toggleOpen(bankTransaction.id)}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDown\n className={`Layer__chevron ${\n isOpen ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n <span className={`${className}__expanded-row`}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n close={() => toggleOpen(bankTransaction.id)}\n isOpen={isOpen}\n asListItem={true}\n submitBtnText={editable ? 'Approve' : 'Save'}\n />\n </span>\n <span className={`${className}__base-row`}>\n {editable ? (\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={setSelectedCategory}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable ? (\n <Pill>{bankTransaction?.category?.display_name}</Pill>\n ) : null}\n {editable && (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n iconOnly={true}\n />\n )}\n </span>\n </li>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode, useRef } from 'react'\nimport classNames from 'classnames'\n\nexport enum ButtonVariant {\n primary = 'primary',\n secondary = 'secondary',\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n iconOnly?: ReactNode\n}\n\nexport const Button = ({\n className,\n children,\n variant = ButtonVariant.primary,\n leftIcon,\n rightIcon,\n iconOnly,\n ...props\n}: ButtonProps) => {\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n let justify = 'center'\n if (leftIcon && rightIcon) {\n justify = 'space-between'\n } else if (rightIcon) {\n justify = 'space-between'\n } else if (leftIcon) {\n justify = 'start'\n }\n\n const baseClassName = classNames(\n 'Layer__btn',\n `Layer__btn--${variant}`,\n iconOnly ? 'Layer__btn--icon-only' : '',\n className,\n )\n\n const startAnimation = () =>\n buttonRef.current &&\n [...buttonRef.current.getElementsByClassName('animateOnHover')].forEach(\n el => (el as SVGAnimateElement).beginElement(),\n )\n\n const stopAnimation = () =>\n buttonRef.current &&\n [...buttonRef.current.getElementsByClassName('animateOnHover')].forEach(\n el => (el as SVGAnimateElement).endElement(),\n )\n\n return (\n <button\n {...props}\n className={baseClassName}\n onMouseEnter={startAnimation}\n onMouseLeave={stopAnimation}\n ref={buttonRef}\n >\n <span className={`Layer__btn-content Layer__justify--${justify}`}>\n {leftIcon && (\n <span className='Layer__btn-icon Layer__btn-icon--left'>\n {leftIcon}\n </span>\n )}\n {!iconOnly && <span className='Layer__btn-text'>{children}</span>}\n {rightIcon && (\n <span className='Layer__btn-icon Layer__btn-icon--right'>\n {rightIcon}\n </span>\n )}\n </span>\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes } from 'react'\nimport AlertCircle from '../../icons/AlertCircle'\nimport Check from '../../icons/Check'\nimport CheckCircle from '../../icons/CheckCircle'\nimport Loader from '../../icons/Loader'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport { Button, ButtonVariant } from './Button'\nimport classNames from 'classnames'\n\nexport interface SubmitButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n processing?: boolean\n disabled?: boolean\n error?: boolean | string\n active?: boolean\n iconOnly?: boolean\n}\n\nconst buildRightIcon = ({\n processing,\n error,\n}: {\n processing?: boolean\n error?: boolean | string\n}) => {\n if (processing) {\n return <Loader size={14} className='Layer__anim--rotating' />\n }\n\n if (error) {\n return (\n <Tooltip offset={12}>\n <TooltipTrigger>\n <AlertCircle size={14} />\n </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{error}</TooltipContent>\n </Tooltip>\n )\n }\n\n return (\n <span>\n <Check className='Layer__btn-icon--on-active' size={14} />\n <CheckCircle\n className='Layer__btn-icon--on-inactive'\n size={14}\n style={{ paddingTop: 4 }}\n />\n </span>\n )\n}\n\nexport const SubmitButton = ({\n active,\n className,\n processing,\n disabled,\n error,\n children,\n ...props\n}: SubmitButtonProps) => {\n const baseClassName = classNames(\n active ? 'Layer__btn--active' : '',\n className,\n )\n\n return (\n <Button\n {...props}\n className={baseClassName}\n variant={ButtonVariant.primary}\n disabled={processing || disabled}\n rightIcon={buildRightIcon({ processing, error })}\n >\n {children}\n </Button>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst AlertCircle = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 6V9'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 12H9.0075'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default AlertCircle\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Check = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M15 4.5L6.75 12.75L3 9'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Check\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst CheckCircle = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M16.5 8.30999V8.99999C16.4991 10.6173 15.9754 12.191 15.007 13.4864C14.0386 14.7817 12.6775 15.7293 11.1265 16.1879C9.57557 16.6465 7.91794 16.5914 6.40085 16.0309C4.88375 15.4704 3.58848 14.4346 2.70821 13.0778C1.82794 11.721 1.40984 10.116 1.51625 8.50223C1.62266 6.88841 2.2479 5.35223 3.2987 4.12279C4.34951 2.89335 5.76958 2.03653 7.34713 1.6801C8.92469 1.32367 10.5752 1.48674 12.0525 2.14499'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M16.5 3L9 10.5075L6.75 8.2575'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default CheckCircle\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Loader = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M9 1.5V4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 13.5V16.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M3.6975 3.6975L5.82 5.82'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.18 12.18L14.3025 14.3025'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M1.5 9H4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M13.5 9H16.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M3.6975 14.3025L5.82 12.18'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.18 5.82L14.3025 3.6975'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Loader\n", "import React, {\n ReactNode,\n forwardRef,\n HTMLProps,\n isValidElement,\n cloneElement,\n} from 'react'\nimport { TooltipContext, useTooltip, useTooltipContext } from './useTooltip'\nimport { useMergeRefs, FloatingPortal } from '@floating-ui/react'\nimport type { Placement } from '@floating-ui/react'\n\nexport interface TooltipOptions {\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n disabled?: boolean\n onOpenChange?: (open: boolean) => void\n offset?: number\n shift?: { padding?: number }\n}\n\nexport const Tooltip = ({\n children,\n ...options\n}: { children: ReactNode } & TooltipOptions) => {\n const tooltip = useTooltip(options)\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n}\n\nexport const TooltipTrigger = forwardRef<\n HTMLElement,\n HTMLProps<HTMLElement> & { asChild?: boolean }\n>(function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = (children as any).ref\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...children.props,\n 'data-state': context.open ? 'open' : 'closed',\n }),\n )\n }\n\n return (\n <span\n ref={ref}\n data-state={context.open ? 'open' : 'closed'}\n className={`Layer__tooltip-trigger Layer__tooltip-trigger--${\n context.open ? 'open' : 'closed'\n }`}\n {...context.getReferenceProps(props)}\n >\n {children}\n </span>\n )\n})\n\nexport const TooltipContent = forwardRef<\n HTMLDivElement,\n HTMLProps<HTMLDivElement>\n>(function TooltipContent({ style, className, ...props }, propRef) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open || context.disabled) return null\n\n return (\n <FloatingPortal>\n <div\n ref={ref}\n className={className}\n style={{\n ...context.styles,\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n />\n </FloatingPortal>\n )\n})\n", "import React, { useState } from 'react'\nimport { TooltipOptions } from './Tooltip'\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useTransitionStyles,\n} from '@floating-ui/react'\n\nexport type ContextType = ReturnType<typeof useTooltip> | null\n\nexport const TooltipContext = React.createContext<ContextType>(null)\n\nexport const useTooltipContext = () => {\n const context = React.useContext(TooltipContext)\n\n if (context == null) {\n throw new Error('Tooltip components must be wrapped in <Tooltip />')\n }\n\n return context\n}\n\nexport const useTooltip = ({\n initialOpen = false,\n placement = 'top',\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n disabled,\n offset: offsetProp = 5,\n shift: shiftProp = { padding: 5 },\n}: TooltipOptions = {}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open: disabled ? false : open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(offsetProp),\n flip({\n crossAxis: placement.includes('-'),\n fallbackAxisSideDirection: 'start',\n padding: shiftProp?.padding ?? 5,\n }),\n shift(shiftProp),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n move: false,\n enabled: controlledOpen == null,\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: 'tooltip' })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n const { isMounted, styles } = useTransitionStyles(context, {\n initial: {\n opacity: 0,\n },\n duration: 200,\n })\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n isMounted,\n styles,\n disabled,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data, styles, disabled],\n )\n}\n", "import React from 'react'\nimport Select, {\n DropdownIndicatorProps,\n GroupBase,\n components,\n} from 'react-select'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { BankTransaction, CategorizationType, Category } from '../../types'\n\ntype Props = {\n name?: string\n bankTransaction: BankTransaction\n value: Category | undefined\n onChange: (newValue: Category) => void\n disabled?: boolean\n className?: string\n}\n\nconst DropdownIndicator:\n | React.ComponentType<\n DropdownIndicatorProps<Category, false, GroupBase<Category>>\n >\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n )\n}\n\nexport const CategoryMenu = ({\n bankTransaction,\n name,\n value,\n onChange,\n disabled,\n className,\n}: Props) => {\n const { categories } = useLayerContext()\n\n const suggestedOptions =\n bankTransaction?.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? [\n {\n label: 'Suggested',\n options: bankTransaction.categorization_flow.suggestions,\n },\n ]\n : []\n\n const categoryOptions = (categories || [])\n .map(category => {\n if (category?.subCategories && category?.subCategories?.length > 0) {\n return {\n label: category.display_name,\n options: category.subCategories,\n }\n }\n return {\n label: category.display_name,\n options: [category],\n }\n })\n .filter(x => x)\n\n const options = [...suggestedOptions, ...categoryOptions]\n\n // The menu does not show in all cases unless the\n // menuPortalTarget and styles lines exist\n // See: https://stackoverflow.com/questions/55830799/how-to-change-zindex-in-react-select-drowpdown\n return (\n <Select<Category>\n name={name}\n className={`Layer__category-menu Layer__select ${className ?? ''}`}\n classNamePrefix='Layer__select'\n options={options}\n isSearchable={true}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n getOptionLabel={category => category.display_name}\n getOptionValue={category => category.stable_name || category.category}\n menuPortalTarget={document.body}\n styles={{ menuPortal: base => ({ ...base, zIndex: 9999 }) }}\n components={{ DropdownIndicator }}\n isDisabled={disabled}\n />\n )\n}\n", "import React, { forwardRef, useImperativeHandle, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport FolderPlus from '../../icons/FolderPlus'\nimport Link from '../../icons/Link'\nimport RefreshCcw from '../../icons/RefreshCcw'\nimport Scissors from '../../icons/Scissors'\nimport {\n centsToDollars as formatMoney,\n dollarsToCents as parseMoney,\n} from '../../models/Money'\nimport {\n BankTransaction,\n SplitCategoryUpdate,\n SingleCategoryUpdate,\n Category,\n CategorizationType,\n} from '../../types'\nimport { Button, SubmitButton, ButtonVariant } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { InputGroup, Input, FileInput } from '../Input'\nimport { Textarea } from '../Textarea'\nimport { Toggle } from '../Toggle'\nimport { ToggleSize } from '../Toggle/Toggle'\n\ntype Props = {\n bankTransaction: BankTransaction\n close?: () => void\n isOpen?: boolean\n asListItem?: boolean\n submitBtnText?: string\n}\n\ntype Split = {\n amount: number\n inputValue: string\n category: Category | undefined\n}\n\ntype RowState = {\n splits: Split[]\n description: string\n file: unknown\n}\n\nenum Purpose {\n categorize = 'categorize',\n match = 'match',\n}\n\nexport type SaveHandle = {\n save: () => void\n}\n\nexport const ExpandedBankTransactionRow = forwardRef<SaveHandle, Props>(\n (\n {\n bankTransaction,\n isOpen = false,\n asListItem = false,\n submitBtnText = 'Save',\n },\n ref,\n ) => {\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [purpose, setPurpose] = useState<Purpose>(Purpose.categorize)\n\n const defaultCategory =\n bankTransaction.category ||\n (bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS &&\n bankTransaction.categorization_flow?.suggestions?.[0])\n const [rowState, updateRowState] = useState<RowState>({\n splits: [\n {\n amount: bankTransaction.amount,\n inputValue: formatMoney(bankTransaction.amount),\n category: defaultCategory,\n },\n ],\n description: '',\n file: undefined,\n })\n\n const addSplit = () =>\n updateRowState({\n ...rowState,\n splits: [\n ...rowState.splits,\n { amount: 0, inputValue: '0.00', category: defaultCategory },\n ],\n })\n\n const removeSplit = () =>\n updateRowState({\n ...rowState,\n splits: rowState.splits.slice(0, -1),\n })\n\n const updateAmounts =\n (rowNumber: number) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const newAmount = parseMoney(event.target.value) || 0\n const newDisplaying = event.target.value\n const splitTotal = rowState.splits\n .slice(0, -1)\n .reduce((sum, split, index) => {\n const amount = index === rowNumber ? newAmount : split.amount\n return sum + amount\n }, 0)\n const remaining = bankTransaction.amount - splitTotal\n rowState.splits[rowNumber].amount = newAmount\n rowState.splits[rowNumber].inputValue = newDisplaying\n rowState.splits[rowState.splits.length - 1].amount = remaining\n rowState.splits[rowState.splits.length - 1].inputValue =\n formatMoney(remaining)\n updateRowState({ ...rowState })\n }\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n const [_, index] = event.target.name.split('-')\n rowState.splits[parseInt(index)].inputValue = '0.00'\n updateRowState({ ...rowState })\n }\n }\n\n const onChangePurpose = (event: React.ChangeEvent<HTMLInputElement>) =>\n setPurpose(\n event.target.value === Purpose.match\n ? Purpose.match\n : Purpose.categorize,\n )\n\n const changeCategory = (index: number, newValue: Category) => {\n rowState.splits[index].category = newValue\n updateRowState({ ...rowState })\n }\n\n const save = () =>\n categorizeBankTransaction(\n bankTransaction.id,\n rowState.splits.length === 1\n ? ({\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n rowState?.splits[0].category?.stable_name ||\n rowState?.splits[0].category?.category,\n },\n } as SingleCategoryUpdate)\n : ({\n type: 'Split',\n entries: rowState.splits.map(split => ({\n category:\n split.category?.stable_name || split.category?.category,\n amount: split.amount,\n })),\n } as SplitCategoryUpdate),\n ).catch(e => console.error(e))\n\n // Call this save action after clicking save in parent component:\n useImperativeHandle(ref, () => ({\n save,\n }))\n\n const className = 'Layer__expanded-bank-transaction-row'\n return (\n <span\n className={`${className} ${className}--${\n isOpen ? 'expanded' : 'collapsed'\n }`}\n >\n <span className={`${className}__wrapper`}>\n <div className={`${className}__content-toggle`}>\n <Toggle\n name={`purpose-${bankTransaction.id}${asListItem ? '-li' : ''}`}\n size={ToggleSize.small}\n options={[\n {\n value: 'categorize',\n label: 'Categorize',\n leftIcon: <FolderPlus size={15} />,\n },\n {\n value: 'match',\n label: 'Match',\n disabled: true,\n leftIcon: <RefreshCcw size={15} />,\n },\n ]}\n selected={purpose}\n onChange={onChangePurpose}\n />\n </div>\n <div\n className={`${className}__content`}\n id={`expanded-${bankTransaction.id}`}\n >\n <div className={`${className}__splits`}>\n <div className={`${className}__splits-inputs`}>\n {rowState.splits.map((split, index) => (\n <div\n className={`${className}__table-cell--split-entry`}\n key={`split-${index}`}\n >\n {rowState.splits.length > 1 && (\n <Input\n type='text'\n name={`split-${index}${asListItem ? '-li' : ''}`}\n disabled={index + 1 === rowState.splits.length}\n onChange={updateAmounts(index)}\n value={split.inputValue}\n onBlur={onBlur}\n className={`${className}__split-amount${\n split.amount < 0 ? '--negative' : ''\n }`}\n />\n )}\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${index}${asListItem ? '-li' : ''}`}\n value={split.category}\n onChange={value => changeCategory(index, value)}\n className='Layer__category-menu--full'\n />\n </div>\n ))}\n </div>\n <div className={`${className}__splits-buttons`}>\n {rowState.splits.length === 1 ? (\n <Button\n onClick={addSplit}\n leftIcon={<Scissors size={14} />}\n variant={ButtonVariant.secondary}\n >\n Split\n </Button>\n ) : (\n <Button\n onClick={removeSplit}\n leftIcon={<Link size={14} />}\n variant={ButtonVariant.secondary}\n >\n Merge\n </Button>\n )}\n </div>\n </div>\n\n <InputGroup\n className={`${className}__description`}\n name='description'\n label='Description'\n >\n <Textarea name='description' placeholder='Enter description' />\n </InputGroup>\n\n <div className={`${className}__file-upload`}>\n <FileInput text='Upload receipt' />\n </div>\n\n {asListItem ? (\n <div className={`${className}__submit-btn`}>\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n active={true}\n >\n {submitBtnText}\n </SubmitButton>\n </div>\n ) : null}\n </div>\n </span>\n </span>\n )\n },\n)\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst FolderPlus = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M16.5 14.25C16.5 14.6478 16.342 15.0294 16.0607 15.3107C15.7794 15.592 15.3978 15.75 15 15.75H3C2.60218 15.75 2.22064 15.592 1.93934 15.3107C1.65804 15.0294 1.5 14.6478 1.5 14.25V3.75C1.5 3.35218 1.65804 2.97064 1.93934 2.68934C2.22064 2.40804 2.60218 2.25 3 2.25H6.75L8.25 4.5H15C15.3978 4.5 15.7794 4.65804 16.0607 4.93934C16.342 5.22064 16.5 5.60218 16.5 6V14.25Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M6.75 10.5H11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default FolderPlus\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Link = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M7.5 9.75C7.82209 10.1806 8.23302 10.5369 8.70491 10.7947C9.17681 11.0525 9.69863 11.2058 10.235 11.2442C10.7713 11.2827 11.3097 11.2053 11.8135 11.0173C12.3173 10.8294 12.7748 10.5353 13.155 10.155L15.405 7.905C16.0881 7.19774 16.4661 6.25048 16.4575 5.26724C16.449 4.284 16.0546 3.34346 15.3593 2.64818C14.664 1.9529 13.7235 1.55851 12.7403 1.54997C11.757 1.54143 10.8098 1.9194 10.1025 2.6025L8.8125 3.885'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 8.25C10.1779 7.8194 9.76698 7.46311 9.29508 7.2053C8.82319 6.94748 8.30137 6.79416 7.76501 6.75575C7.22865 6.71734 6.69031 6.79473 6.18649 6.98266C5.68267 7.1706 5.22516 7.4647 4.845 7.845L2.595 10.095C1.9119 10.8023 1.53393 11.7495 1.54247 12.7328C1.55101 13.716 1.9454 14.6565 2.64068 15.3518C3.33596 16.0471 4.2765 16.4415 5.25974 16.45C6.24298 16.4586 7.19024 16.0806 7.8975 15.3975L9.18 14.115'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Link\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst RefreshCcw = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M0.75 3V7.5H5.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M17.25 15V10.5H12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15.3675 6.75C14.9871 5.67508 14.3407 4.71405 13.4884 3.95656C12.6361 3.19907 11.6059 2.66982 10.4938 2.41819C9.38167 2.16656 8.22393 2.20075 7.12861 2.51758C6.03328 2.8344 5.03606 3.42353 4.23 4.23L0.75 7.5M17.25 10.5L13.77 13.77C12.9639 14.5765 11.9667 15.1656 10.8714 15.4824C9.77607 15.7992 8.61833 15.8334 7.50621 15.5818C6.3941 15.3302 5.36385 14.8009 4.5116 14.0434C3.65935 13.2859 3.01288 12.3249 2.6325 11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default RefreshCcw\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Scissors = ({ size = 11, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 11 11'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M2.75 4.125C3.50939 4.125 4.125 3.50939 4.125 2.75C4.125 1.99061 3.50939 1.375 2.75 1.375C1.99061 1.375 1.375 1.99061 1.375 2.75C1.375 3.50939 1.99061 4.125 2.75 4.125Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n >\n <animate\n attributeName='d'\n className='animateOnHover'\n values='M2.75 4.125C3.50939 4.125 4.125 3.50939 4.125 2.75C4.125 1.99061 3.50939 1.375 2.75 1.375C1.99061 1.375 1.375 1.99061 1.375 2.75C1.375 3.50939 1.99061 4.125 2.75 4.125Z;M2.50519 5.21436C3.20276 4.91424 3.52494 4.10544 3.22481 3.40788C2.92468 2.71031 2.11589 2.38813 1.41833 2.68826C0.720762 2.98839 0.398577 3.79718 0.698706 4.49474C0.998836 5.19231 1.80763 5.51449 2.50519 5.21436Z;M2.75 4.125C3.50939 4.125 4.125 3.50939 4.125 2.75C4.125 1.99061 3.50939 1.375 2.75 1.375C1.99061 1.375 1.375 1.99061 1.375 2.75C1.375 3.50939 1.99061 4.125 2.75 4.125Z'\n begin='indefinite'\n dur='400ms'\n repeatCount='1'\n fill='freeze'\n calcMode='linear'\n keyTimes='0;0.5;1'\n />\n </path>\n <path\n d='M2.75 9.625C3.50939 9.625 4.125 9.00939 4.125 8.25C4.125 7.49061 3.50939 6.875 2.75 6.875C1.99061 6.875 1.375 7.49061 1.375 8.25C1.375 9.00939 1.99061 9.625 2.75 9.625Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n >\n <animate\n attributeName='d'\n className='animateOnHover'\n values='M2.75 9.625C3.50939 9.625 4.125 9.00939 4.125 8.25C4.125 7.49061 3.50939 6.875 2.75 6.875C1.99061 6.875 1.375 7.49061 1.375 8.25C1.375 9.00939 1.99061 9.625 2.75 9.625Z;M1.43277 8.38576C2.13615 8.67201 2.9384 8.33386 3.22465 7.63049C3.5109 6.92711 3.17275 6.12486 2.46937 5.83861C1.766 5.55236 0.96375 5.89051 0.6775 6.59389C0.391251 7.29726 0.729398 8.09951 1.43277 8.38576Z;M2.75 9.625C3.50939 9.625 4.125 9.00939 4.125 8.25C4.125 7.49061 3.50939 6.875 2.75 6.875C1.99061 6.875 1.375 7.49061 1.375 8.25C1.375 9.00939 1.99061 9.625 2.75 9.625Z'\n begin='indefinite'\n dur='400ms'\n repeatCount='1'\n fill='freeze'\n calcMode='linear'\n keyTimes='0;0.5;1'\n />\n </path>\n <path\n d='M9.16668 1.83325L3.72168 7.27825'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n >\n <animate\n attributeName='d'\n className='animateOnHover'\n values='M9.16668 1.83325L3.72168 7.27825;M10.3129 3.58763L3.21706 6.57851;M9.16668 1.83325L3.72168 7.27825'\n begin='indefinite'\n dur='400ms'\n repeatCount='1'\n fill='freeze'\n calcMode='linear'\n keyTimes='0;0.5;1'\n />\n </path>\n <path\n d='M6.63232 6.63672L9.16691 9.16672'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n >\n <animate\n attributeName='d'\n className='animateOnHover'\n values='M6.63232 6.63672L9.16691 9.16672;M7.06396 5.9873L10.3921 7.3096;M6.63232 6.63672L9.16691 9.16672'\n begin='indefinite'\n dur='400ms'\n repeatCount='1'\n fill='freeze'\n calcMode='linear'\n keyTimes='0;0.5;1'\n />\n </path>\n <path\n d='M3.72168 3.72168L5.50001 5.50001'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n >\n <animate\n attributeName='d'\n className='animateOnHover'\n values='M3.72168 3.72168L5.50001 5.50001;M3.23828 4.45996L5.57467 5.39067;M3.72168 3.72168L5.50001 5.50001'\n begin='indefinite'\n dur='400ms'\n repeatCount='1'\n fill='freeze'\n calcMode='linear'\n keyTimes='0;0.5;1'\n />\n </path>\n </svg>\n)\n\nexport default Scissors\n", "import React, { HTMLProps } from 'react'\nimport classNames from 'classnames'\n\nexport const Input = ({ className, ...props }: HTMLProps<HTMLInputElement>) => {\n const baseClassName = classNames('Layer__input', className)\n return <input {...props} className={baseClassName} />\n}\n", "import React, { ReactNode } from 'react'\nimport { Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nexport interface InputGroupProps {\n label?: string\n name?: string\n className?: string\n children?: ReactNode\n}\n\nexport const InputGroup = ({\n label,\n name,\n className,\n children,\n}: InputGroupProps) => {\n const baseClassName = classNames('Layer__input-group', className)\n return (\n <div className={baseClassName}>\n {label && (\n <Text\n as='label'\n size={TextSize.sm}\n className='Layer__input-label'\n htmlFor={name}\n >\n {label}\n </Text>\n )}\n {children}\n </div>\n )\n}\n", "import React, { ReactNode, useRef, useState, useEffect } from 'react'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport enum TextSize {\n lg = 'lg',\n md = 'md',\n sm = 'sm',\n}\n\nexport enum TextWeight {\n normal = 'normal',\n bold = 'bold',\n}\n\nexport enum TextUseTooltip {\n whenTruncated = 'whenTruncated',\n always = 'always',\n}\n\nexport interface TextTooltipOptions {\n contentClassName?: string\n offset?: number\n shift?: { padding?: number }\n}\n\nexport interface TextProps {\n as?: React.ElementType\n className?: string\n children: ReactNode\n size?: TextSize\n weight?: TextWeight\n htmlFor?: string\n withTooltip?: TextUseTooltip\n tooltipOptions?: TextTooltipOptions\n}\n\nexport const Text = ({\n as: Component = 'p',\n className,\n children,\n size = TextSize.md,\n weight = TextWeight.normal,\n withTooltip,\n ...props\n}: TextProps) => {\n const baseClassName = classNames(\n `Layer__text Layer__text--${size} Layer__text--${weight}`,\n className,\n )\n\n if (withTooltip) {\n return (\n <TextWithTooltip\n as={Component}\n className={baseClassName}\n size={size}\n weight={weight}\n withTooltip={withTooltip}\n {...props}\n >\n {children}\n </TextWithTooltip>\n )\n }\n\n return (\n <Component {...props} className={baseClassName}>\n {children}\n </Component>\n )\n}\n\nexport const TextWithTooltip = ({\n as: Component = 'p',\n className,\n children,\n size = TextSize.md,\n weight = TextWeight.normal,\n withTooltip = TextUseTooltip.whenTruncated,\n tooltipOptions,\n ...props\n}: TextProps) => {\n const textElementRef = useRef<HTMLElement>()\n const compareSize = () => {\n if (textElementRef.current) {\n const compare =\n textElementRef.current.children[0].scrollWidth >\n textElementRef.current.children[0].clientWidth\n setHover(compare)\n }\n }\n\n useEffect(() => {\n compareSize()\n window.addEventListener('resize', compareSize)\n }, [])\n\n useEffect(\n () => () => {\n window.removeEventListener('resize', compareSize)\n },\n [],\n )\n\n const [hoverStatus, setHover] = useState(false)\n\n const contentClassName = classNames(\n 'Layer__tooltip',\n tooltipOptions?.contentClassName,\n )\n\n return (\n <Tooltip\n disabled={!hoverStatus}\n offset={tooltipOptions?.offset}\n shift={tooltipOptions?.shift}\n >\n <TooltipTrigger>\n <Component className={className} ref={textElementRef} {...props}>\n {children}\n </Component>\n </TooltipTrigger>\n <TooltipContent className={contentClassName}>{children}</TooltipContent>\n </Tooltip>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport classNames from 'classnames'\n\nexport enum HeadingSize {\n primary = 'primary',\n secondary = 'secondary',\n}\n\nexport interface HeadingProps {\n as?: React.ElementType\n className?: string\n children: ReactNode\n size?: HeadingSize\n}\n\nexport const Heading = ({\n as: Component = 'h2',\n className,\n children,\n size = HeadingSize.primary,\n}: HeadingProps) => {\n const baseClassName = classNames(\n `Layer__heading Layer__heading--${size}`,\n className,\n )\n\n return <Component className={baseClassName}>{children}</Component>\n}\n", "import React, { useRef, ChangeEvent } from 'react'\nimport UploadCloud from '../../icons/UploadCloud'\nimport { Button } from '../Button'\nimport { ButtonVariant } from '../Button/Button'\n\nexport interface FileInputProps {\n text?: string\n onUpload?: (file: File) => void\n}\n\nexport const FileInput = ({ text = 'Upload', onUpload }: FileInputProps) => {\n const hiddenFileInput = useRef<HTMLInputElement>(null)\n\n const onClick = () => {\n if (hiddenFileInput.current) {\n hiddenFileInput.current.click()\n }\n }\n\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files.length > 0 && onUpload) {\n const fileUploaded = event.target.files[0]\n onUpload(fileUploaded)\n }\n }\n\n return (\n <>\n <Button\n onClick={onClick}\n variant={ButtonVariant.secondary}\n leftIcon={<UploadCloud />}\n >\n {text}\n </Button>\n <input\n type='file'\n onChange={onChange}\n ref={hiddenFileInput}\n style={{ display: 'none' }}\n />\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst UploadCloud = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M12 12L9 9L6 12'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 9V15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15.2925 13.7925C16.024 13.3937 16.6019 12.7626 16.9349 11.999C17.2679 11.2353 17.3372 10.3824 17.1317 9.57501C16.9262 8.7676 16.4576 8.05162 15.8 7.54007C15.1424 7.02852 14.3332 6.75054 13.5 6.74999H12.555C12.328 5.87192 11.9049 5.05674 11.3175 4.36573C10.7301 3.67473 9.99364 3.12588 9.16358 2.76044C8.33352 2.39501 7.43141 2.22251 6.52509 2.2559C5.61876 2.28929 4.7318 2.52771 3.93088 2.95324C3.12997 3.37876 2.43593 3.98032 1.90097 4.71267C1.366 5.44503 1.00402 6.28914 0.842236 7.18153C0.680453 8.07393 0.72308 8.99139 0.966911 9.86493C1.21074 10.7385 1.64943 11.5454 2.25 12.225'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12 12L9 9L6 12'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default UploadCloud\n", "import React, { HTMLProps } from 'react'\nimport classNames from 'classnames'\n\nexport const Textarea = ({\n className,\n ...props\n}: HTMLProps<HTMLTextAreaElement>) => {\n const baseClassName = classNames('Layer__textarea', className)\n return <textarea {...props} className={baseClassName} />\n}\n", "import React, {\n ChangeEvent,\n ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport classNames from 'classnames'\n\nexport interface Option {\n label: string\n value: string\n disabled?: boolean\n leftIcon?: ReactNode\n}\n\nexport enum ToggleSize {\n medium = 'medium',\n small = 'small',\n}\n\nexport interface ToggleProps {\n name: string\n size?: ToggleSize\n options: Option[]\n selected?: Option['value']\n onChange: (event: ChangeEvent<HTMLInputElement>) => void\n}\n\ninterface ToggleOptionProps {\n checked: boolean\n label: string\n name: string\n size: ToggleSize\n onChange: (event: ChangeEvent<HTMLInputElement>) => void\n value: string\n disabled?: boolean\n leftIcon?: ReactNode\n index: number\n}\n\nexport const Toggle = ({\n name,\n options,\n selected,\n onChange,\n size = ToggleSize.medium,\n}: ToggleProps) => {\n const [currentWidth, setCurrentWidth] = useState(0)\n const [thumbPos, setThumbPos] = useState({ left: 0, width: 0 })\n const [initialized, setInitialized] = useState(false)\n\n const toggleRef = useElementSize<HTMLDivElement>((a, b, c) => {\n if (c.width && c?.width !== currentWidth) {\n setCurrentWidth(c.width)\n }\n })\n\n const selectedValue = selected || options[0].value\n const baseClassName = classNames(\n 'Layer__toggle',\n `Layer__toggle--${size}`,\n initialized ? 'Layer__toggle--initialized' : '',\n )\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n updateThumbPosition(Number(e.target.getAttribute('data-idx') ?? 0))\n onChange(e)\n }\n\n const updateThumbPosition = (active: number) => {\n if (!toggleRef?.current) {\n return\n }\n\n const optionsNodes = [...toggleRef.current.children].filter(c =>\n c.className.includes('Layer__toggle-option'),\n )\n\n let shift = 0\n let width = thumbPos.width\n\n optionsNodes.forEach((c, i) => {\n if (i < active) {\n shift = shift + (c as HTMLElement).offsetWidth\n } else if (i === active) {\n width = (c as HTMLElement).offsetWidth\n }\n })\n\n shift = shift + (size === ToggleSize.medium ? 2 : 1)\n\n setThumbPos({ left: shift, width })\n }\n\n useEffect(() => {\n const selectedIndex = getSelectedIndex()\n updateThumbPosition(selectedIndex)\n\n setTimeout(() => {\n setInitialized(true)\n }, 400)\n }, [])\n\n useEffect(() => {\n const selectedIndex = getSelectedIndex()\n updateThumbPosition(selectedIndex)\n }, [currentWidth])\n\n const getSelectedIndex = () => {\n let selectedIndex = options.findIndex(\n option => option.value === selectedValue,\n )\n if (selectedIndex === -1) {\n return 0\n }\n\n return selectedIndex\n }\n\n return (\n <div className={baseClassName} ref={toggleRef}>\n {options.map((option, index) => (\n <ToggleOption\n {...option}\n size={size}\n key={option.value}\n name={name}\n checked={selectedValue === option.value}\n onChange={handleChange}\n disabled={option.disabled ?? false}\n index={index}\n />\n ))}\n <span className='Layer__toggle__thumb' style={{ ...thumbPos }} />\n </div>\n )\n}\n\nconst ToggleOption = ({\n checked,\n label,\n name,\n onChange,\n value,\n size,\n leftIcon,\n disabled,\n index,\n}: ToggleOptionProps) => {\n return (\n <label className={`Layer__toggle-option`} data-checked={checked}>\n <input\n type='radio'\n checked={checked}\n name={name}\n onChange={onChange}\n value={value}\n disabled={disabled ?? false}\n data-idx={index}\n />\n\n <span className='Layer__toggle-option-content'>\n {leftIcon && (\n <span className='Layer__toggle-option__icon'>{leftIcon}</span>\n )}\n <span>{label}</span>\n </span>\n </label>\n )\n}\n", "import React, { PropsWithChildren } from 'react'\n\nexport const Pill = ({ children }: PropsWithChildren) => (\n <span className='Layer__pill'>{children}</span>\n)\n", "import React, { useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Direction } from '../../types'\nimport { SubmitButton } from '../Button'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Text } from '../Typography'\nimport { TextUseTooltip } from '../Typography/Text'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n bankTransaction: BankTransaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n editable: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionRow = ({\n dateFormat,\n bankTransaction,\n isOpen,\n toggleOpen,\n editable,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? bankTransaction.categorization_flow.suggestions[0]\n : undefined,\n )\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (isOpen && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n toggleOpen(bankTransaction.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n selectedCategory?.stable_name || selectedCategory?.category || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-row'\n const openClassName = isOpen ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n isOpen ? openClassName : '',\n )\n\n return (\n <>\n <tr\n className={rowClassName}\n onTransitionEnd={({ propertyName }) => {\n if (propertyName === 'top') {\n setRemoved(true)\n }\n }}\n >\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n </td>\n <td className='Layer__table-cell Layer__bank-transactions__tx-col'>\n <span className='Layer__table-cell-content'>\n <Text\n as='span'\n className='Layer__bank-transactions__tx-text'\n withTooltip={TextUseTooltip.whenTruncated}\n tooltipOptions={{\n contentClassName: 'Layer__bank-transactions__tx-tooltip',\n }}\n >\n {bankTransaction.counterparty_name}\n </Text>\n </span>\n </td>\n <td className='Layer__table-cell Layer__bank-transactions__account-col'>\n <span className='Layer__table-cell-content'>\n <Text\n as='span'\n className='Layer__bank-transactions__account-text'\n withTooltip={TextUseTooltip.whenTruncated}\n >\n {bankTransaction.account_name ?? ''}\n </Text>\n </span>\n </td>\n <td\n className={`Layer__table-cell Layer__table-cell__amount-col Layer__table-cell--amount ${className}__table-cell--amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n >\n <span className='Layer__table-cell-content'>\n {isCredit(bankTransaction) ? '+$' : ' $'}\n {formatMoney(bankTransaction.amount)}\n </span>\n </td>\n <td\n className={classNames(\n 'Layer__table-cell',\n 'Layer__table-cell__category-col',\n `${className}__actions-cell`,\n `${className}__actions-cell--${isOpen ? 'open' : 'close'}`,\n )}\n >\n <span\n className={`${className}__actions-container Layer__table-cell-content`}\n >\n {editable && !isOpen ? (\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={setSelectedCategory}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable && !isOpen ? (\n <Text as='span' className={`${className}__category-text`}>\n {bankTransaction?.category?.display_name}\n </Text>\n ) : null}\n {editable || isOpen ? (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n error={bankTransaction.error}\n active={isOpen}\n >\n {editable ? 'Approve' : 'Save'}\n </SubmitButton>\n ) : null}\n <div\n onClick={() => toggleOpen(bankTransaction.id)}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDown\n className={`Layer__chevron ${\n isOpen ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n </td>\n </tr>\n <tr>\n <td colSpan={5}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n close={() => toggleOpen(bankTransaction.id)}\n isOpen={isOpen}\n />\n </td>\n </tr>\n </>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { parseStylesFromThemeConfig } from '../../utils/colors'\nimport classNames from 'classnames'\n\nexport interface ContainerProps {\n name: string\n className?: string\n asWidget?: boolean\n children: ReactNode\n}\n\nexport const Container = ({\n name,\n className,\n children,\n asWidget,\n}: ContainerProps) => {\n const baseClassName = classNames(\n 'Layer__component Layer__component-container',\n `Layer__${name}`,\n asWidget ? 'Layer__component--as-widget' : '',\n className,\n )\n\n const { theme } = useLayerContext()\n\n const styles = parseStylesFromThemeConfig(theme)\n\n return (\n <div className={baseClassName} style={{ ...styles }}>\n {children}\n </div>\n )\n}\n", "import {\n LayerThemeConfig,\n ColorConfig,\n ColorRGBConfig,\n} from '../types/layer_context'\n\n/**\n * Convert `theme` config set in Provider into component styles.\n *\n * @param {LayerThemeConfig} theme - the theme set with provider\n */\nexport const parseStylesFromThemeConfig = (theme?: LayerThemeConfig) => {\n let styles = {}\n if (!theme) {\n return styles\n }\n\n if (theme.colors) {\n const darkColor = parseColorFromTheme('dark', theme.colors.dark)\n const lightColor = parseColorFromTheme('light', theme.colors.light)\n styles = { ...styles, ...darkColor, ...lightColor }\n }\n\n return styles\n}\n\n/**\n * Parse the color from theme config into a CSS variables.\n * @param {string} colorName\n * @param {ColorConfig} color\n */\nconst parseColorFromTheme = (colorName: string, color?: ColorConfig) => {\n if (!color) {\n return {}\n }\n\n try {\n if ('h' in color && 's' in color && 'l' in color) {\n return {\n [`--color-${colorName}-h`]: color.h,\n [`--color-${colorName}-s`]: color.s,\n [`--color-${colorName}-l`]: color.l,\n }\n }\n\n if ('r' in color && 'g' in color && 'b' in color) {\n const { h, s, l } = rgbToHsl(color)\n return {\n [`--color-${colorName}-h`]: h,\n [`--color-${colorName}-s`]: `${s}%`,\n [`--color-${colorName}-l`]: `${l}%`,\n }\n }\n\n if ('hex' in color) {\n const rgb = hexToRgb(color.hex)\n if (!rgb) {\n return {}\n }\n const { h, s, l } = rgbToHsl({\n r: rgb.r.toString(),\n g: rgb.g.toString(),\n b: rgb.b.toString(),\n })\n return {\n [`--color-${colorName}-h`]: h,\n [`--color-${colorName}-s`]: `${s}%`,\n [`--color-${colorName}-l`]: `${l}%`,\n }\n }\n\n return {}\n } catch (_err) {\n return {}\n }\n}\n\n/**\n * Convert RGB to HSL\n */\nconst rgbToHsl = (color: ColorRGBConfig) => {\n let r = Number(color.r)\n let g = Number(color.g)\n let b = Number(color.b)\n r /= 255\n g /= 255\n b /= 255\n const l = Math.max(r, g, b)\n const s = l - Math.min(r, g, b)\n const h = s\n ? l === r\n ? (g - b) / s\n : l === g\n ? 2 + (b - r) / s\n : 4 + (r - g) / s\n : 0\n return {\n h: 60 * h < 0 ? 60 * h + 360 : 60 * h,\n s: 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0),\n l: (100 * (2 * l - s)) / 2,\n }\n}\n\n/**\n * Convert HEX to RGB\n */\nconst hexToRgb = (hex: string) => {\n const values = hex\n .replace(\n /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,\n (m, r, g, b) => '#' + r + r + g + g + b + b,\n )\n .substring(1)\n .match(/.{2}/g)\n ?.map(x => parseInt(x, 16))\n\n if (!values) {\n return\n }\n\n return {\n r: values[0],\n g: values[1],\n b: values[2],\n }\n}\n", "import React, { CSSProperties, ReactNode, forwardRef } from 'react'\nimport classNames from 'classnames'\n\nexport interface HeaderProps {\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(\n ({ className, children, style }, ref) => {\n const baseClassName = classNames('Layer__component-header', className)\n\n return (\n <header ref={ref} className={baseClassName} style={style}>\n {children}\n </header>\n )\n },\n)\n", "import React from 'react'\nimport AlertOctagon from '../../icons/AlertOctagon'\nimport CheckCircle from '../../icons/CheckCircle'\nimport Loader from '../../icons/Loader'\nimport RefreshCcw from '../../icons/RefreshCcw'\nimport { Button, ButtonVariant } from '../Button'\nimport { Text, TextSize, TextWeight } from '../Typography'\n\nexport enum DataStateStatus {\n allDone = 'allDone',\n failed = 'failed',\n}\n\nexport interface DataStateProps {\n status: DataStateStatus\n title?: string\n description?: string\n onRefresh?: () => void\n isLoading?: boolean\n}\n\nconst getIcon = (status: DataStateStatus) => {\n switch (status) {\n case DataStateStatus.failed:\n return (\n <span className='Layer__data-state__icon Layer__data-state__icon--error'>\n <AlertOctagon size={12} />\n </span>\n )\n default:\n return (\n <span className='Layer__data-state__icon Layer__data-state__icon--neutral'>\n <CheckCircle size={12} />\n </span>\n )\n }\n}\n\nexport const DataState = ({\n status,\n title,\n description,\n onRefresh,\n isLoading,\n}: DataStateProps) => {\n return (\n <div className='Layer__data-state'>\n {getIcon(status)}\n <Text\n as='span'\n size={TextSize.lg}\n weight={TextWeight.bold}\n className='Layer__data-state__title'\n >\n {title}\n </Text>\n <Text as='span' className='Layer__data-state__description'>\n {description}\n </Text>\n {onRefresh && (\n <span className='Layer__data-state__btn'>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={\n isLoading ? (\n <Loader size={14} className='Layer__anim--rotating' />\n ) : (\n <RefreshCcw size={12} />\n )\n }\n onClick={onRefresh}\n disabled={isLoading}\n >\n Refresh\n </Button>\n </span>\n )}\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst AlertOctagon = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 18 18'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M5.895 1.5H12.105L16.5 5.895V12.105L12.105 16.5H5.895L1.5 12.105V5.895L5.895 1.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 6V9'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M9 12H9.0075'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default AlertOctagon\n", "import React, { ReactNode } from 'react'\nimport LoaderIcon from '../../icons/Loader'\n\nexport interface LoaderProps {\n children?: ReactNode\n}\n\nexport const Loader = ({ children }: LoaderProps) => {\n return (\n <span className='Layer__loader'>\n <LoaderIcon size={28} className='Layer__anim--rotating' />\n {children}\n </span>\n )\n}\n", "import React from 'react'\nimport useSWR from 'swr'\n\ntype Props = {\n user?: string | undefined\n}\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json())\n\nexport const Hello = ({ user }: Props) => {\n const { data, isLoading } = useSWR(\n `https://api.github.com/users/${user || 'jyurek'}`,\n fetcher,\n )\n const name = (isLoading ? '...' : data?.name) || 'User'\n return (\n <>\n <div className='hello'>Hello, {name}!</div>\n </>\n )\n}\n", "import React, { PropsWithChildren, createContext } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLossChart } from '../ProfitAndLossChart'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { ProfitAndLossSummaries } from '../ProfitAndLossSummaries'\nimport { ProfitAndLossTable } from '../ProfitAndLossTable'\nimport { endOfMonth, startOfMonth } from 'date-fns'\n\ntype PNLContextType = ReturnType<typeof useProfitAndLoss>\nconst PNLContext = createContext<PNLContextType>({\n data: undefined,\n isLoading: true,\n error: undefined,\n dateRange: {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n changeDateRange: () => {},\n})\n\nconst ProfitAndLoss = ({ children }: PropsWithChildren) => {\n const contextData = useProfitAndLoss()\n return (\n <PNLContext.Provider value={contextData}>\n <div className='Layer__component Layer__profit-and-loss'>\n <h2 className='Layer__profit-and-loss__title'>Profit & Loss</h2>\n {children}\n </div>\n </PNLContext.Provider>\n )\n}\n\nProfitAndLoss.Chart = ProfitAndLossChart\nProfitAndLoss.Context = PNLContext\nProfitAndLoss.DatePicker = ProfitAndLossDatePicker\nProfitAndLoss.Summaries = ProfitAndLossSummaries\nProfitAndLoss.Table = ProfitAndLossTable\nexport { ProfitAndLoss }\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { ProfitAndLoss, DateRange } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport { startOfMonth, endOfMonth, formatISO } from 'date-fns'\nimport useSWR from 'swr'\n\ntype Props = DateRange\n\ntype UseProfitAndLoss = (props?: Props) => {\n data: ProfitAndLoss | undefined\n isLoading: boolean\n error: unknown\n dateRange: DateRange\n changeDateRange: (dateRange: Partial<DateRange>) => void\n}\n\nexport const useProfitAndLoss: UseProfitAndLoss = (\n { startDate: initialStartDate, endDate: initialEndDate }: Props = {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n) => {\n const { auth, businessId, apiUrl } = useLayerContext()\n const [startDate, setStartDate] = useState(\n initialStartDate || startOfMonth(Date.now()),\n )\n const [endDate, setEndDate] = useState(\n initialEndDate || endOfMonth(Date.now()),\n )\n\n const {\n data: rawData,\n isLoading,\n error: rawError,\n } = useSWR(\n businessId &&\n startDate &&\n endDate &&\n auth?.access_token &&\n `profit-and-loss-${businessId}-${startDate.valueOf()}-${endDate.valueOf()}`,\n Layer.getProfitAndLoss(apiUrl, auth?.access_token, {\n params: {\n businessId,\n startDate: formatISO(startDate),\n endDate: formatISO(endDate),\n },\n }),\n )\n const { data, error } = rawData || {}\n\n const changeDateRange = ({\n startDate: newStartDate,\n endDate: newEndDate,\n }: Partial<DateRange>) => {\n newStartDate && setStartDate(newStartDate)\n newEndDate && setEndDate(newEndDate)\n }\n\n return {\n data,\n isLoading,\n error: error || rawError,\n dateRange: { startDate, endDate },\n changeDateRange,\n }\n}\n", "import React, { useContext, useMemo, useState } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLoss } from '../../types'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { Indicator } from './Indicator'\nimport { endOfMonth, format, parseISO, startOfMonth, sub } from 'date-fns'\nimport {\n BarChart,\n XAxis,\n Cell,\n Bar,\n LabelList,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n} from 'recharts'\nimport { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart'\n\nconst barGap = 4\nconst barSize = 20\n\nexport const ProfitAndLossChart = () => {\n const { changeDateRange, dateRange } = useContext(PNL.Context)\n const thisMonth = startOfMonth(Date.now())\n\n const startSelectionMonth = dateRange.startDate.getMonth()\n const endSelectionMonth = dateRange.endDate.getMonth()\n\n // Yes, this looks weird, but we have to load all the data from the\n // last 12 months as we don't have a single endpoint yet. And we\n // can't use hooks in a loop.\n const monthData: (ProfitAndLoss | undefined)[] = []\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 11 })),\n endDate: endOfMonth(sub(thisMonth, { months: 11 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 10 })),\n endDate: endOfMonth(sub(thisMonth, { months: 10 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 9 })),\n endDate: endOfMonth(sub(thisMonth, { months: 9 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 8 })),\n endDate: endOfMonth(sub(thisMonth, { months: 8 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 7 })),\n endDate: endOfMonth(sub(thisMonth, { months: 7 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 6 })),\n endDate: endOfMonth(sub(thisMonth, { months: 6 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 5 })),\n endDate: endOfMonth(sub(thisMonth, { months: 5 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 4 })),\n endDate: endOfMonth(sub(thisMonth, { months: 4 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 3 })),\n endDate: endOfMonth(sub(thisMonth, { months: 3 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 2 })),\n endDate: endOfMonth(sub(thisMonth, { months: 2 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 1 })),\n endDate: endOfMonth(sub(thisMonth, { months: 1 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: thisMonth,\n endDate: endOfMonth(thisMonth),\n })?.data,\n )\n\n const getMonthName = (pnl: ProfitAndLoss | undefined) =>\n pnl ? format(parseISO(pnl.start_date), 'LLL') : ''\n\n const summarizePnL = (pnl: ProfitAndLoss | undefined) => ({\n name: getMonthName(pnl),\n revenue: pnl?.income.value || 0,\n expenses: (pnl?.income.value || 0) - (pnl?.net_profit || 0),\n selected:\n !!pnl &&\n parseISO(pnl.start_date).getMonth() >= startSelectionMonth &&\n parseISO(pnl.end_date).getMonth() <= endSelectionMonth,\n })\n\n const onClick: CategoricalChartFunc = ({ activeTooltipIndex }) => {\n const selection = monthData[activeTooltipIndex || -1]\n if (selection) {\n const { start_date: startDate, end_date: endDate } = selection\n changeDateRange({\n startDate: parseISO(startDate),\n endDate: parseISO(endDate),\n })\n }\n }\n\n // If net profit doesn't change, we're probably still the same.\n const data = useMemo(\n () => monthData.map(summarizePnL),\n [\n startSelectionMonth,\n endSelectionMonth,\n ...monthData.map(m => m?.net_profit),\n ],\n )\n\n const [animateFrom, setAnimateFrom] = useState(-1)\n\n return (\n <ResponsiveContainer width='100%' height={250}>\n <BarChart\n margin={{ left: 24, right: 24, bottom: 24 }}\n data={data}\n onClick={onClick}\n barGap={barGap}\n className='Layer__profit-and-loss-chart'\n >\n <CartesianGrid vertical={false} />\n <Legend\n verticalAlign='top'\n align='left'\n payload={[\n { value: 'Income', type: 'circle', id: 'IncomeLegend' },\n { value: 'Expenses', type: 'circle', id: 'ExpensesLegend' },\n ]}\n />\n <XAxis dataKey='name' tickLine={false} />\n <Bar\n dataKey='revenue'\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className='Layer__profit-and-loss-chart__bar--income'\n >\n <LabelList\n content={\n <Indicator\n animateFrom={animateFrom}\n setAnimateFrom={setAnimateFrom}\n />\n }\n />\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n <Bar\n dataKey='expenses'\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className='Layer__profit-and-loss-chart__bar--expenses'\n >\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n )\n}\n", "import React, { useEffect } from 'react'\nimport { Props as BaseProps } from 'recharts/types/component/Label'\n\n// This component does not always exist. It gets recreated each time the\n// selected month changes on the chart. As a result, the coordinates are not\n// persistent and so resist CSS animation. That way we work around this is by\n// telling the parent component what its X value is. The parent renders using\n// that X as the \"animateFrom\" value. This then tells the paren its new X,\n// which becomes the new \"animateFrom\", set using useState setter, which causes\n// a render, which causes the new `animateFrom` to be passed in, which causes a\n// change in the X coordinate, which causes a transition to trigger.\n\ntype Props = BaseProps & {\n animateFrom: number\n setAnimateFrom: (x: number) => void\n}\nconst emptyViewBox = { x: 0, y: 0, width: 0, height: 0 }\nexport const Indicator = ({\n viewBox = {},\n className,\n animateFrom,\n setAnimateFrom,\n}: Props) => {\n if (!className?.match(/selected/)) {\n return null\n }\n\n const {\n x: animateTo = 0,\n y = 0,\n width = 0,\n height = 0,\n } = 'x' in viewBox ? viewBox : emptyViewBox\n const boxWidth = width * 2 + 4 // the bar gap is 4\n const multiplier = 1.5\n const xOffset = (boxWidth * multiplier - boxWidth) / 2\n\n // useEffect callbacks run after the browser paints\n useEffect(() => {\n setAnimateFrom(animateTo)\n }, [animateTo])\n\n const actualX = animateFrom === -1 ? animateTo : animateFrom\n return (\n <rect\n className='Layer__profit-and-loss-chart__selection-indicator'\n style={{\n width: `${boxWidth * multiplier}px`,\n // @ts-expect-error -- y is fine but x apparently isn't!\n x: actualX - xOffset,\n y: y + height,\n }}\n />\n )\n}\n", "import React, { useContext } from 'react'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { add, endOfMonth, format, startOfMonth, Duration } from 'date-fns'\n\nexport const ProfitAndLossDatePicker = () => {\n const { changeDateRange, dateRange } = useContext(ProfitAndLoss.Context)\n const date = dateRange.startDate\n const label = format(date, 'LLLL y')\n const change = (duration: Duration) => {\n const newDate = add(date, duration)\n changeDateRange({\n startDate: startOfMonth(newDate),\n endDate: endOfMonth(newDate),\n })\n }\n const previousMonth = () => change({ months: -1 })\n const nextMonth = () => change({ months: 1 })\n return (\n <div className='Layer__profit-and-loss-date-picker'>\n <button\n aria-label='View Previous Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={previousMonth}\n >\n <ChevronLeft\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={18}\n />\n </button>\n <span className='Layer__profit-and-loss-date-picker__label'>{label}</span>\n <button\n aria-label='View Next Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={nextMonth}\n >\n <ChevronRight\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={18}\n />\n </button>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = {\n strokeColor?: string\n size?: number\n}\n\nconst ChevronLeft = ({\n strokeColor,\n size,\n ...props\n}: Props & SVGProps<SVGSVGElement>) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={size || 24}\n height={size || 24}\n fill='none'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n stroke={strokeColor ?? '#000'}\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='m15 18-6-6 6-6'\n />\n </svg>\n)\nexport default ChevronLeft\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\n\nconst ChavronRight = ({ size, ...props }: Props) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={size || 24}\n height={size || 24}\n fill='none'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n stroke={'#000'}\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth={2}\n d='m9 18 6-6-6-6'\n />\n </svg>\n)\nexport default ChavronRight\n", "import React, { useContext } from 'react'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\n\nexport const ProfitAndLossSummaries = () => {\n const { data: storedData } = useContext(PNL.Context)\n const data = storedData\n ? storedData\n : { income: { value: NaN }, net_profit: NaN }\n\n const incomeDirectionClass =\n (data.income.value ?? NaN) < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n const expensesDirectionClass =\n (data?.income?.value ?? NaN) - data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n const netProfitDirectionClass =\n data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--pasitive'\n\n return (\n <div className='Layer__profit-and-loss-summaries'>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--income'>\n <span className='Layer__profit-and-loss-summaries__title'>Revenue</span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${incomeDirectionClass}`}\n >\n {formatMoney(Math.abs(data?.income?.value ?? NaN))}\n </span>\n </div>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--expenses'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Expenses\n </span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${expensesDirectionClass}`}\n >\n {formatMoney(Math.abs((data.income.value ?? 0) - data.net_profit))}\n </span>\n </div>\n <div className='Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--net-profit'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Net Profit\n </span>\n <span\n className={`Layer__profit-and-loss-summaries__amount ${netProfitDirectionClass}`}\n >\n {formatMoney(Math.abs(data.net_profit))}\n </span>\n </div>\n </div>\n )\n}\n", "import React, { useContext } from 'react'\nimport { Direction } from '../../types'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossRow } from '../ProfitAndLossRow'\nimport emptyPNL from './empty_profit_and_loss_report'\n\nexport const ProfitAndLossTable = () => {\n const { data: actualData, isLoading } = useContext(ProfitAndLoss.Context)\n const data = !actualData || isLoading ? emptyPNL : actualData\n return (\n <>\n <div className='Layer__profit-and-loss-table'>\n <ProfitAndLossRow lineItem={data.income} direction={Direction.CREDIT} />\n <ProfitAndLossRow\n lineItem={data.cost_of_goods_sold}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.gross_profit,\n display_name: 'Gross Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow\n lineItem={data.expenses}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.profit_before_taxes,\n display_name: 'Profit Before Taxes',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow lineItem={data.taxes} direction={Direction.DEBIT} />\n <ProfitAndLossRow\n lineItem={{\n value: data.net_profit,\n display_name: 'Net Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n />\n </div>\n <div className='Layer__profit-and-loss-table Layer__profit-and-loss-table__outflows'>\n <ProfitAndLossRow\n lineItem={data.other_outflows}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={data.personal_expenses}\n direction={Direction.DEBIT}\n />\n </div>\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LineItem } from '../../types'\n\ntype Props = {\n variant?: string\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n direction?: Direction\n summarize?: boolean\n}\n\nexport const ProfitAndLossRow = ({\n variant,\n lineItem,\n depth = 0,\n maxDepth = 1,\n direction = Direction.DEBIT,\n summarize = true,\n}: Props) => {\n if (!lineItem) {\n return null\n }\n const { value, display_name, line_items } = lineItem\n const [expanded, setExpanded] = useState(true)\n const amount = value ?? 0\n const amountString = centsToDollars(Math.abs(amount))\n const labelClasses = [\n 'Layer__profit-and-loss-row',\n 'Layer__profit-and-loss-row__label',\n ]\n const valueClasses = [\n 'Layer__profit-and-loss-row',\n 'Layer__profit-and-loss-row__value',\n ]\n const positive =\n amount === 0 ||\n (direction === Direction.CREDIT && amount > 0) ||\n (direction === Direction.DEBIT && amount < 0)\n valueClasses.push(\n positive\n ? 'Layer__profit-and-loss-row__value--amount-positive'\n : 'Layer__profit-and-loss-row__value--amount-negative',\n )\n labelClasses.push(`Layer__profit-and-loss-row__label--depth-${depth}`)\n valueClasses.push(`Layer__profit-and-loss-row__value--depth-${depth}`)\n variant &&\n labelClasses.push(`Layer__profit-and-loss-row__label--variant-${variant}`)\n variant &&\n valueClasses.push(`Layer__profit-and-loss-row__value--variant-${variant}`)\n\n const toggleExpanded = () => setExpanded(!expanded)\n const canGoDeeper = depth < maxDepth\n const hasChildren = (line_items?.length ?? 0) > 0\n const displayChildren = hasChildren && canGoDeeper\n labelClasses.push(\n `Layer__profit-and-loss-row__label--display-children-${displayChildren}`,\n )\n valueClasses.push(\n `Layer__profit-and-loss-row__value--display-children-${displayChildren}`,\n )\n\n displayChildren &&\n expanded &&\n labelClasses.push('Layer__profit-and-loss-row__label--expanded')\n\n displayChildren &&\n expanded &&\n valueClasses.push('Layer__profit-and-loss-row__value--expanded')\n return (\n <>\n <div className={labelClasses.join(' ')} onClick={toggleExpanded}>\n <ChevronDown size={16} />\n {display_name}\n </div>\n <div className={valueClasses.join(' ')}>{amountString}</div>\n {canGoDeeper && hasChildren && (\n <div\n className={`Layer__profit-and-loss-row__children ${\n expanded && 'Layer__profit-and-loss-row__children--expanded'\n }`}\n >\n <div className='Layer__balance-sheet-row__children--content'>\n {(line_items || []).map(line_item => (\n <ProfitAndLossRow\n key={line_item.display_name}\n lineItem={line_item}\n depth={depth + 1}\n maxDepth={maxDepth}\n direction={direction}\n />\n ))}\n {summarize && (\n <ProfitAndLossRow\n key={display_name}\n lineItem={{ value, display_name: `Total of ${display_name}` }}\n variant='summation'\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n", "import { ProfitAndLoss } from '../../types'\n\nexport default {\n type: 'Profit_And_Loss',\n business_id: '',\n start_date: '',\n end_date: '',\n income: {\n name: 'INCOME',\n display_name: 'Income',\n value: NaN,\n line_items: null,\n },\n cost_of_goods_sold: {\n display_name: 'Cost of Goods Sold',\n name: 'COGS',\n value: NaN,\n line_items: null,\n },\n gross_profit: NaN,\n expenses: {\n name: 'EXPENSES',\n display_name: 'Expenses',\n value: NaN,\n line_items: null,\n },\n profit_before_taxes: NaN,\n taxes: {\n name: 'TAXES',\n display_name: 'Taxes',\n value: NaN,\n line_items: null,\n },\n net_profit: NaN,\n other_outflows: {\n name: 'OTHER_OUTFLOWS',\n display_name: 'Other outflows',\n value: NaN,\n line_items: null,\n },\n personal_expenses: {\n name: 'PERSONAL',\n display_name: 'Personal expenses',\n value: NaN,\n line_items: null,\n },\n fully_categorized: false,\n} as ProfitAndLoss\n", "import React, { PropsWithChildren, useReducer, useEffect, Reducer } from 'react'\nimport { Layer } from '../../api/layer'\nimport { LayerContext } from '../../contexts/LayerContext'\nimport {\n LayerContextValues,\n LayerContextAction,\n LayerContextActionName as Action,\n} from '../../types'\nimport { LayerThemeConfig } from '../../types/layer_context'\nimport { add, isBefore } from 'date-fns'\nimport useSWR, { SWRConfig } from 'swr'\n\nconst reducer: Reducer<LayerContextValues, LayerContextAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case Action.setAuth:\n case Action.setCategories:\n case Action.setTheme:\n return { ...state, ...action.payload }\n default:\n return state\n }\n}\n\ntype LayerEnvironmentConfig = {\n url: string\n scope: string\n apiUrl: string\n}\n\nexport const LayerEnvironment: Record<string, LayerEnvironmentConfig> = {\n production: {\n url: 'not defined yet',\n scope: 'not defined yet',\n apiUrl: 'not defined yet',\n },\n staging: {\n url: 'https://auth.layerfi.com/oauth2/token',\n scope: 'https://sandbox.layerfi.com/sandbox',\n apiUrl: 'https://sandbox.layerfi.com',\n },\n}\n\nexport type Props = {\n businessId: string\n appId?: string\n appSecret?: string\n businessAccessToken?: string\n environment?: keyof typeof LayerEnvironment\n theme?: LayerThemeConfig\n}\n\nexport const LayerProvider = ({\n appId,\n appSecret,\n businessId,\n children,\n businessAccessToken,\n environment = 'production',\n theme,\n}: PropsWithChildren<Props>) => {\n const defaultSWRConfig = {\n revalidateInterval: 0,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n revalidateIfStale: false,\n }\n\n const { url, scope, apiUrl } = LayerEnvironment[environment]\n const [state, dispatch] = useReducer(reducer, {\n auth: {\n access_token: '',\n token_type: '',\n expires_in: 0,\n expires_at: new Date(2000, 1, 1),\n },\n businessId,\n categories: [],\n apiUrl,\n theme,\n })\n\n const { data: auth } =\n appId !== undefined && appSecret !== undefined\n ? useSWR(\n businessAccessToken === undefined &&\n appId !== undefined &&\n appSecret !== undefined &&\n isBefore(state.auth.expires_at, new Date()) &&\n 'authenticate',\n Layer.authenticate({\n appId,\n appSecret,\n authenticationUrl: url,\n scope,\n }),\n defaultSWRConfig,\n )\n : { data: undefined }\n\n useEffect(() => {\n if (businessAccessToken) {\n dispatch({\n type: Action.setAuth,\n payload: {\n auth: {\n access_token: businessAccessToken,\n token_type: 'Bearer',\n expires_in: 3600,\n expires_at: add(new Date(), { seconds: 3600.0 }),\n },\n },\n })\n } else if (auth?.access_token) {\n dispatch({\n type: Action.setAuth,\n payload: {\n auth: {\n ...auth,\n expires_at: add(new Date(), { seconds: auth.expires_in }),\n },\n },\n })\n }\n }, [businessAccessToken, auth?.access_token])\n\n const { data: categories } = useSWR(\n businessId && auth?.access_token && `categories-${businessId}`,\n Layer.getCategories(apiUrl, auth?.access_token, { params: { businessId } }),\n defaultSWRConfig,\n )\n useEffect(() => {\n if (categories?.data?.categories?.length) {\n dispatch({\n type: Action.setCategories,\n payload: { categories: categories.data.categories || [] },\n })\n }\n }, [categories?.data?.categories?.length])\n\n const setTheme = (theme: LayerThemeConfig) =>\n dispatch({\n type: Action.setTheme,\n payload: { theme },\n })\n\n return (\n <SWRConfig value={defaultSWRConfig}>\n <LayerContext.Provider value={{ ...state, setTheme }}>\n {children}\n </LayerContext.Provider>\n </SWRConfig>\n )\n}\n", "import React, { useState } from 'react'\nimport { useChartOfAccounts } from '../../hooks/useChartOfAccounts'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { ChartOfAccountsNewForm } from '../ChartOfAccountsNewForm'\nimport { ChartOfAccountsRow } from '../ChartOfAccountsRow'\n\nexport const ChartOfAccounts = () => {\n const { data, isLoading } = useChartOfAccounts()\n const [showingForm, setShowingForm] = useState(false)\n return (\n <div className='Layer__component Layer__chart-of-accounts'>\n {!data || isLoading ? (\n 'Loading.'\n ) : (\n <>\n <div className='Layer__chart-of-accounts__header'>\n <h2 className='Layer__chart-of-accounts__title'>\n Chart of Accounts\n </h2>\n <div className='Layer__chart-of-accounts__actions'>\n <button className='Layer__chart-of-accounts__download-button'>\n <DownloadCloud />\n Download\n </button>\n <button\n className='Layer__chart-of-accounts__edit-accounts-button'\n onClick={() => setShowingForm(!showingForm)}\n >\n Edit Accounts\n </button>\n </div>\n </div>\n {showingForm && <ChartOfAccountsNewForm />}\n <div className='Layer__chart-of-accounts__table'>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Name\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Type\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'>\n Sub-Type\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header Layer__chart-of-accounts__table-cell--header-balance'>\n Balance\n </div>\n <div className='Layer__chart-of-accounts__table-cell Layer__chart-of-accounts__table-cell--header'></div>\n {data.accounts.map(account => (\n <ChartOfAccountsRow\n key={account.id}\n account={account}\n depth={0}\n />\n ))}\n </div>\n </>\n )}\n </div>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { AccountAlternate, ChartOfAccounts, NewAccount } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseChartOfAccounts = () => {\n data: ChartOfAccounts | undefined\n isLoading: boolean\n error: unknown\n create: (newAccount: NewAccount) => Promise<AccountAlternate>\n}\n\nexport const useChartOfAccounts: UseChartOfAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const { data, isLoading, error, mutate } = useSWR(\n businessId && auth?.access_token && `chart-of-accounts-${businessId}`,\n Layer.getChartOfAccounts(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const create = (newAccount: NewAccount) =>\n Layer.createAccount(apiUrl, auth?.access_token, {\n params: { businessId },\n body: newAccount,\n }).then(({ data }) => (mutate(), data))\n\n return { data: data?.data, isLoading, error, create }\n}\n", "import React, { useMemo, useState } from 'react'\nimport Select from 'react-select'\nimport { useChartOfAccounts } from '../../hooks/useChartOfAccounts'\nimport { Account, Direction } from '../../types'\n\ntype Option<T = string> = { label: string; value: T }\n\nconst flattenAccounts = (accounts: Account[]): Account[] =>\n accounts\n .flatMap(a => [a, flattenAccounts(a.subAccounts || [])])\n .flat()\n .filter(id => id)\n\nexport const ChartOfAccountsNewForm = () => {\n const { data, create: createAccount } = useChartOfAccounts()\n const accountOptions: Account[] = useMemo(\n () =>\n flattenAccounts(data?.accounts || []).sort((a, b) =>\n a?.name && b?.name ? a.name.localeCompare(b.name) : 0,\n ),\n [data?.accounts?.length],\n )\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [normality, setNormality] = useState<Direction>(Direction.DEBIT)\n const [parentAccount, setParentAccount] = useState<Account | undefined>(\n data?.accounts[0],\n )\n\n const save = () => {\n createAccount({\n name,\n normality,\n parent_id: {\n type: 'AccountId',\n id: parentAccount?.id || '',\n },\n description,\n })\n }\n\n return (\n <div className='Layer__chart-of-accounts-new-form'>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Name</span>\n <input\n name='name'\n value={name}\n onChange={event => setName(event.target.value)}\n ></input>\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Description</span>\n <input\n name='description'\n value={description}\n onChange={event => setDescription(event.target.value)}\n ></input>\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Normality</span>\n <Select<Option<Direction>>\n isSearchable={false}\n onChange={value => value && setNormality(value.value)}\n options={[\n { label: 'Credit', value: Direction.CREDIT },\n { label: 'Debit', value: Direction.DEBIT },\n ]}\n />\n </div>\n <div className='Layer__chart-of-accounts-new-form__field'>\n <span>Parent Account</span>\n <Select<Account>\n isSearchable={true}\n value={parentAccount}\n onChange={value => value && setParentAccount(value)}\n getOptionLabel={a => a.name}\n getOptionValue={a => a.id}\n options={accountOptions}\n />\n </div>\n <div className='Layer__chart-of-accounts-new-form__field Layer__chart-of-accounts-new-form__field--actions'>\n <button onClick={save}>Save</button>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport { centsToDollars } from '../../models/Money'\nimport { Account } from '../../types'\n\ntype Props = {\n account: Account\n depth?: number\n}\n\nexport const ChartOfAccountsRow = ({ account, depth = 0 }: Props) => {\n const classNames = [\n 'Layer__chart-of-accounts-row__table-cell',\n depth > 0 && `Layer__chart-of-accounts-row__table-cell--depth-${depth}`,\n ]\n\n const className = classNames.filter(id => id).join(' ')\n\n const amountClassName =\n account.balance < 0\n ? 'Layer__chart-of-accounts-row__table-cell--amount-negative'\n : 'Layer__chart-of-accounts-row__table-cell--amount-positive'\n\n return (\n <>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--name`}\n >\n {account.name}\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--type`}\n >\n Assets\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--subtype`}\n >\n Cash\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--balance ${amountClassName}`}\n >\n {centsToDollars(Math.abs(account.balance || 0))}\n </div>\n <div\n className={`${className} Layer__chart-of-accounts-row__table-cell--actions`}\n >\n <button className='Layer__chart-of-accounts-row__view-entries-button'>\n View Entries\n </button>\n </div>\n {(account.subAccounts || []).map(subAccount => (\n <ChartOfAccountsRow\n key={subAccount.id}\n account={subAccount}\n depth={depth + 1}\n />\n ))}\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useState", "React", "React", "format", "React", "React", "React", "React", "React", "React", "format", "useState", "React", "React", "useState", "useSWR", "useRef", "React", "useRef", "useState", "React", "useRef", "useRef", "React", "React", "React", "React", "React", "React", "React", "React", "useState", "React", "TooltipTrigger", "TooltipContent", "classNames", "React", "React", "React", "React", "forwardRef", "useState", "React", "React", "React", "React", "React", "classNames", "React", "React", "useRef", "useState", "classNames", "classNames", "React", "useRef", "useState", "React", "classNames", "classNames", "React", "classNames", "React", "React", "useRef", "React", "useRef", "React", "React", "classNames", "React", "useEffect", "useState", "classNames", "useState", "classNames", "shift", "useEffect", "React", "forwardRef", "categorizeBankTransaction", "useState", "React", "React", "classNames", "parseISO", "dateFormat", "useRef", "useState", "categorizeBankTransaction", "React", "React", "useRef", "useState", "classNames", "parseISO", "formatTime", "isCredit", "dateFormat", "useRef", "useState", "categorizeBankTransaction", "React", "React", "classNames", "React", "React", "forwardRef", "classNames", "React", "React", "React", "React", "Loader", "React", "useState", "React", "Loader", "React", "useSWR", "React", "createContext", "useState", "useSWR", "useState", "React", "useContext", "useState", "React", "useEffect", "endOfMonth", "format", "parseISO", "startOfMonth", "useContext", "useState", "React", "React", "useContext", "React", "React", "endOfMonth", "format", "startOfMonth", "useContext", "React", "React", "useContext", "useContext", "React", "React", "useContext", "React", "useState", "useState", "React", "useContext", "React", "endOfMonth", "startOfMonth", "createContext", "React", "React", "useEffect", "add", "useSWR", "useEffect", "theme", "React", "React", "useState", "useSWR", "data", "React", "useMemo", "useState", "Select", "createAccount", "useMemo", "useState", "React", "Select", "React", "classNames", "React", "useState", "React"]
|
|
7
7
|
}
|