@layerfi/components 0.1.10 → 0.1.11

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/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.tsx", "../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/linked_accounts.ts", "../src/api/layer/ledger_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/config/general.ts", "../src/hooks/useBankTransactions/useBankTransactions.tsx", "../src/hooks/useElementSize/useElementSize.ts", "../src/types/categories.ts", "../src/utils/helpers.ts", "../src/components/BankTransactionListItem/BankTransactionListItem.tsx", "../src/icons/ChevronDownFill.tsx", "../src/components/BankTransactionRow/BankTransactionRow.tsx", "../src/icons/AlertCircle.tsx", "../src/icons/Scissors.tsx", "../src/components/Badge/Badge.tsx", "../src/components/Button/Button.tsx", "../src/components/Button/IconButton.tsx", "../src/components/Button/RetryButton.tsx", "../src/icons/RefreshCcw.tsx", "../src/components/Button/SubmitButton.tsx", "../src/icons/CheckCircle.tsx", "../src/icons/Loader.tsx", "../src/icons/Save.tsx", "../src/components/Tooltip/Tooltip.tsx", "../src/components/Tooltip/useTooltip.ts", "../src/components/Button/TextButton.tsx", "../src/components/Button/BackButton.tsx", "../src/icons/BackArrow.tsx", "../src/components/CategorySelect/CategorySelect.tsx", "../src/icons/Check.tsx", "../src/icons/MinimizeTwo.tsx", "../src/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow.tsx", "../src/icons/ScissorsFullOpen.tsx", "../src/icons/Trash.tsx", "../src/components/Input/Input.tsx", "../src/components/Input/InputGroup.tsx", "../src/components/Typography/Text.tsx", "../src/components/Typography/Heading.tsx", "../src/components/Typography/ErrorText.tsx", "../src/components/Input/FileInput.tsx", "../src/icons/UploadCloud.tsx", "../src/components/Input/Select.tsx", "../src/components/MatchForm/MatchForm.tsx", "../src/components/BankTransactionRow/MatchBadge.tsx", "../src/components/Textarea/Textarea.tsx", "../src/components/Toggle/Toggle.tsx", "../src/components/ExpandedBankTransactionRow/APIErrorNotifications.tsx", "../src/icons/AlertOctagon.tsx", "../src/components/BankTransactionRow/SplitTooltipDetails.tsx", "../src/components/BankTransactionListItem/Assignment.tsx", "../src/components/Container/Container.tsx", "../src/config/theme.ts", "../src/utils/colors.ts", "../src/components/Container/Header.tsx", "../src/components/DataState/DataState.tsx", "../src/components/Loader/Loader.tsx", "../src/components/Pagination/Pagination.tsx", "../src/hooks/usePagination/usePagination.ts", "../src/icons/ChevronLeft.tsx", "../src/icons/ChevronRight.tsx", "../src/components/Hello/Hello.tsx", "../src/components/LinkedAccounts/LinkedAccounts.tsx", "../src/hooks/useLinkedAccounts/useLinkedAccounts.ts", "../src/icons/PlusIcon.tsx", "../src/components/LinkedAccountOptions/LinkedAccountOptions.tsx", "../src/icons/MoreVertical.tsx", "../src/components/HoverMenu/HoverMenu.tsx", "../src/components/LinkedAccountThumb/LinkedAccountThumb.tsx", "../src/icons/InstitutionIcon.tsx", "../src/components/ProfitAndLoss/ProfitAndLoss.tsx", "../src/hooks/useProfitAndLoss/useProfitAndLoss.tsx", "../src/utils/profitAndLossUtils.ts", "../src/components/ProfitAndLossChart/ProfitAndLossChart.tsx", "../src/utils/format.ts", "../src/components/ProfitAndLossChart/Indicator.tsx", "../src/components/ProfitAndLossDatePicker/ProfitAndLossDatePicker.tsx", "../src/components/ProfitAndLossSummaries/ProfitAndLossSummaries.tsx", "../src/components/SkeletonLoader/SkeletonLoader.tsx", "../src/components/ProfitAndLossSummaries/MiniChart.tsx", "../src/config/charts.ts", "../src/components/ProfitAndLossTable/ProfitAndLossTable.tsx", "../src/components/ProfitAndLossRow/ProfitAndLossRow.tsx", "../src/icons/PieChart.tsx", "../src/components/ProfitAndLossTable/empty_profit_and_loss_report.ts", "../src/components/ProfitAndLossView/ProfitAndLossView.tsx", "../src/components/ProfitAndLossDetailedCharts/ProfitAndLossDetailedCharts.tsx", "../src/icons/X.tsx", "../src/components/ProfitAndLossDetailedCharts/DetailedChart.tsx", "../src/components/ProfitAndLossDetailedCharts/DetailedTable.tsx", "../src/icons/SortArrows.tsx", "../src/components/ProfitAndLossDetailedCharts/Filters.tsx", "../src/components/LedgerAccounts/LedgerAccounts.tsx", "../src/hooks/useLedgerAccounts/useLedgerAccounts.tsx", "../src/components/AccountsReceivable/AccountsReceivableIndex.tsx", "../src/components/LedgerAccountsRow/LedgerAccountsRow.tsx", "../src/icons/ArrowRightCircle.tsx", "../src/icons/Edit2.tsx", "../src/components/LedgerAccountsSidebar/LedgerAccountsSidebar.tsx", "../src/components/LedgerAccountsForm/LedgerAccountsForm.tsx", "../src/providers/LayerProvider/LayerProvider.tsx"],
4
- "sourcesContent": ["export { BalanceSheet } from './components/BalanceSheet'\nexport { BankTransactions } from './components/BankTransactions'\nexport { Hello } from './components/Hello'\nexport { LinkedAccounts } from './components/LinkedAccounts'\nexport { ProfitAndLoss } from './components/ProfitAndLoss'\nexport { ProfitAndLossView } from './components/ProfitAndLossView'\nexport { LedgerAccounts } from './components/LedgerAccounts'\nexport { LayerProvider } from './providers/LayerProvider'\n", "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 {\n BankTransactionMatch,\n BankTransactionMatchType,\n} from '../../types/bank_transactions'\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}&limit=200`,\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\nexport const matchBankTransaction = put<\n { data: BankTransactionMatch; errors: unknown },\n { match_id: string; type: BankTransactionMatchType }\n>(\n ({ businessId, bankTransactionId }) =>\n `/v1/businesses/${businessId}/bank-transactions/${bankTransactionId}/match`,\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 { LinkedAccounts } from '../../types/linked_accounts'\nimport { get, post } from './authenticated_http'\n\nexport const getLinkedAccounts = get<{ data: LinkedAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/external-accounts`,\n)\n\n// export const createAccount = post<{ data: LinkedAccount }, NewAccount>(\n// ({ businessId }) => `/v1/businesses/${businessId}/external-accounts`,\n// )\n", "import { Account, LedgerAccounts, NewAccount, EditAccount } from '../../types'\nimport { get, post, put } from './authenticated_http'\n\nexport const getLedgerAccounts = get<{ data: LedgerAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const createAccount = post<{ data: Account }, NewAccount>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const updateAccount = put<{ data: Account }, EditAccount>(\n ({ businessId, accountId }) =>\n `/v1/businesses/${businessId}/ledger/accounts/${accountId}`,\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, tagKey, tagValues, reportingBasis }) =>\n `/v1/businesses/${businessId}/reports/profit-and-loss?start_date=${\n startDate ? encodeURIComponent(startDate) : ''\n }&end_date=${endDate ? encodeURIComponent(endDate) : ''}${\n reportingBasis ? `&reporting_basis=${reportingBasis}` : ''\n }${tagKey ? `&tag_key=${tagKey}` : ''}${\n tagValues ? `&tag_values=${tagValues}` : ''\n }`,\n)\n", "import { authenticate } from './layer/authenticate'\nimport { getBalanceSheet } from './layer/balance_sheet'\nimport {\n getBankTransactions,\n categorizeBankTransaction,\n matchBankTransaction,\n} from './layer/bankTransactions'\nimport { getCategories } from './layer/categories'\nimport { getLinkedAccounts } from './layer/linked_accounts'\nimport {\n getLedgerAccounts,\n createAccount,\n updateAccount,\n} from './layer/ledger_accounts'\nimport { getProfitAndLoss } from './layer/profit_and_loss'\n\nexport const Layer = {\n authenticate,\n categorizeBankTransaction,\n matchBankTransaction,\n createAccount,\n updateAccount,\n getBalanceSheet,\n getBankTransactions,\n getCategories,\n getLedgerAccounts,\n getProfitAndLoss,\n getLinkedAccounts,\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 {\n LayerContextHelpers,\n LayerThemeConfig,\n} from '../../types/layer_context'\n\nexport const LayerContext = createContext<\n LayerContextValues &\n LayerContextHelpers & { 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 colors: {},\n setTheme: () => undefined,\n getColor: _shade => 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 { IconSvgProps } from './types'\n\nconst DownloadCloud = ({ 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='M6 12.75L9 15.75L12 12.75'\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.66 13.5675C16.3121 13.109 16.801 12.4546 17.056 11.6994C17.3109 10.9441 17.3186 10.1273 17.0778 9.36737C16.837 8.60748 16.3604 7.94407 15.7171 7.47342C15.0737 7.00278 14.2971 6.74938 13.5 6.75H12.555C12.3294 5.87091 11.9074 5.05444 11.3206 4.36206C10.7338 3.66969 9.99762 3.11945 9.16742 2.75277C8.33721 2.38609 7.43464 2.21252 6.52766 2.24514C5.62067 2.27776 4.7329 2.51571 3.93118 2.94107C3.12946 3.36644 2.43468 3.96814 1.89915 4.70087C1.36362 5.43361 1.0013 6.27829 0.839456 7.17132C0.677613 8.06434 0.720468 8.98245 0.964796 9.85652C1.20912 10.7306 1.64856 11.5378 2.25001 12.2175'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\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, useMemo, useEffect } from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { debounce } from '../../utils/helpers'\nimport { BankTransactionListItem } from '../BankTransactionListItem'\nimport { BankTransactionRow } from '../BankTransactionRow'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { Loader } from '../Loader'\nimport { Pagination } from '../Pagination'\nimport { Toggle } from '../Toggle'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'bank-transactions'\n\nenum DisplayState {\n review = 'review',\n categorized = 'categorized',\n}\n\nconst CategorizedCategories = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n CategorizationStatus.MATCHED,\n]\nconst ReviewCategories = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n]\n\nexport interface BankTransactionsProps {\n asWidget?: boolean\n pageSize?: number\n categorizedOnly?: boolean\n}\n\nconst filterVisibility = (\n display: DisplayState,\n bankTransaction: BankTransaction,\n) => {\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 pageSize = 15,\n categorizedOnly = false,\n}: BankTransactionsProps) => {\n const [display, setDisplay] = useState<DisplayState>(\n categorizedOnly ? DisplayState.categorized : DisplayState.review,\n )\n const [currentPage, setCurrentPage] = useState(1)\n const [removedTxs, setRemovedTxs] = useState<string[]>([])\n const [initialLoad, setInitialLoad] = useState(true)\n const { data, isLoading, error, isValidating, refetch } =\n useBankTransactions()\n\n const bankTransactionsByFilter = data?.filter(\n tx => !removedTxs.includes(tx.id) && filterVisibility(display, tx),\n )\n\n useEffect(() => {\n if (!isLoading) {\n const timeoutLoad = setTimeout(() => {\n setInitialLoad(false)\n }, 1000)\n return () => clearTimeout(timeoutLoad)\n }\n }, [isLoading])\n\n const bankTransactions = useMemo(() => {\n const firstPageIndex = (currentPage - 1) * pageSize\n const lastPageIndex = firstPageIndex + pageSize\n return bankTransactionsByFilter?.slice(firstPageIndex, lastPageIndex)\n }, [currentPage, bankTransactionsByFilter, removedTxs])\n\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 setCurrentPage(1)\n }\n\n const [shiftStickyHeader, setShiftStickyHeader] = useState(0)\n const debounceShiftStickyHeader = debounce(setShiftStickyHeader, 500)\n const [listView, setListView] = useState(false)\n const [containerWidth, setContainerWidth] = useState(0)\n const debounceContainerWidth = debounce(setContainerWidth, 500)\n\n const removeTransaction = (id: string) => {\n const newTxs = removedTxs.slice()\n newTxs.push(id)\n setRemovedTxs(newTxs)\n }\n\n const containerRef = useElementSize<HTMLDivElement>((_el, _en, size) => {\n if (size?.height && size?.height >= 90) {\n const newShift = -Math.floor(size.height / 2) + 6\n if (newShift !== shiftStickyHeader) {\n debounceShiftStickyHeader(newShift)\n }\n } else if (size?.height > 0 && shiftStickyHeader !== 0) {\n debounceShiftStickyHeader(0)\n }\n\n if (size.width > 700 && listView) {\n setListView(false)\n } else if (size.width <= 700 && !listView) {\n setListView(true)\n }\n\n debounceContainerWidth(size?.width)\n })\n\n const editable = display === DisplayState.review\n return (\n <Container\n className={\n editable\n ? 'Layer__bank-transactions--to-review'\n : 'Layer__bank-transactions--categorized'\n }\n name={COMPONENT_NAME}\n asWidget={asWidget}\n ref={containerRef}\n >\n <Header\n className='Layer__bank-transactions__header'\n style={{ top: shiftStickyHeader }}\n >\n <Heading className='Layer__bank-transactions__title'>\n Transactions\n </Heading>\n {!categorizedOnly && (\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 )}\n </Header>\n {!listView && (\n <table\n width='100%'\n className='Layer__table Layer__bank-transactions__table with-cell-separators'\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(\n (bankTransaction: BankTransaction, index: number) => (\n <BankTransactionRow\n initialLoad={initialLoad}\n index={index}\n key={bankTransaction.id}\n dateFormat={DATE_FORMAT}\n bankTransaction={bankTransaction}\n editable={editable}\n removeTransaction={removeTransaction}\n containerWidth={containerWidth}\n />\n ),\n )}\n </tbody>\n </table>\n )}\n\n {isLoading && !bankTransactions ? (\n <div className='Layer__bank-transactions__loader-container'>\n <Loader />\n </div>\n ) : null}\n\n {!isLoading && listView ? (\n <ul className='Layer__bank-transactions__list'>\n {bankTransactions?.map(\n (bankTransaction: BankTransaction, index: number) => (\n <BankTransactionListItem\n index={index}\n key={bankTransaction.id}\n dateFormat={DATE_FORMAT}\n bankTransaction={bankTransaction}\n editable={editable}\n removeTransaction={removeTransaction}\n containerWidth={containerWidth}\n />\n ),\n )}\n </ul>\n ) : null}\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\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\n <div className='Layer__bank-transactions__pagination'>\n <Pagination\n currentPage={currentPage}\n totalCount={bankTransactionsByFilter?.length || 0}\n pageSize={pageSize}\n onPageChange={page => setCurrentPage(page)}\n />\n </div>\n </Container>\n )\n}\n", "export const DATE_FORMAT = 'LLL d, yyyy'\n", "import { Layer } from '../../api/layer'\nimport { BankTransaction, CategoryUpdate, Metadata } from '../../types'\nimport { BankTransactionMatchType } from '../../types/bank_transactions'\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 match: (\n id: BankTransaction['id'],\n matchId: BankTransaction['id'],\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 match = (id: BankTransaction['id'], matchId: BankTransaction['id']) => {\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.matchBankTransaction(apiUrl, auth.access_token, {\n params: { businessId, bankTransactionId: id },\n body: { match_id: matchId, type: BankTransactionMatchType.CONFIRM_MATCH },\n })\n .then(({ data: bt, errors }) => {\n const newBT = data?.find(\n x => x.business_id === businessId && x.id === id,\n )\n\n if (newBT) {\n newBT.recently_categorized = true\n newBT.match = bt\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 match,\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", "export enum CategorizationStatus {\n PENDING = 'PENDING',\n READY_FOR_INPUT = 'READY_FOR_INPUT',\n LAYER_REVIEW = 'LAYER_REVIEW',\n CATEGORIZED = 'CATEGORIZED',\n SPLIT = 'SPLIT',\n JOURNALING = 'JOURNALING',\n MATCHED = 'MATCHED',\n}\n\nexport interface CategoryEntry {\n amount?: number\n category: Category\n}\n\nexport interface Category {\n id: string\n type: string\n display_name: string\n category: string\n stable_name?: string\n subCategories?: Category[]\n entries?: CategoryEntry[]\n}\n\nexport enum CategorizationType {\n AUTO = 'AUTO',\n ASK_FROM_SUGGESTIONS = 'ASK_FROM_SUGGESTIONS',\n MEALS = 'MEALS',\n BUSINESS_TRAVEL_TRANSPORTATION = 'BUSINESS_TRAVEL_TRANSPORTATION',\n}\n\nexport interface AutoCategorization {\n type: CategorizationType.AUTO\n category: Category\n}\nexport interface SuggestedCategorization {\n type: CategorizationType\n suggestions: Category[]\n}\nexport type Categorization = AutoCategorization | SuggestedCategorization\n\nexport type SingleCategoryUpdate = {\n type: 'Category'\n category: {\n type: 'StableName'\n stable_name: string\n }\n}\nexport type SplitCategoryUpdate = {\n type: 'Split'\n entries: {\n category: string\n amount: number\n }[]\n}\nexport type CategoryUpdate = SingleCategoryUpdate | SplitCategoryUpdate\n\nexport function hasSuggestions(\n categorization: Categorization,\n): categorization is SuggestedCategorization {\n return (categorization as SuggestedCategorization).suggestions !== undefined\n}\n", "export const range = (start: number, end: number) => {\n let length = end - start + 1\n return Array.from({ length }, (_, idx) => idx + start)\n}\n\nexport const debounce = <F extends (...args: Parameters<F>) => ReturnType<F>>(\n fnc: F,\n timeout = 300,\n) => {\n let timer: ReturnType<typeof setTimeout>\n return (...args: Parameters<F>) => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n fnc.apply(this, args)\n }, timeout)\n }\n}\n\nexport const sleep = (time: number) => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n\n/**\n * Convert the account name into stable_name\n */\nexport const convertToStableName = (name: string): string =>\n name\n .replace(/[`~!@#$%^&*()_|+\\-=?;:'\",.<>\\{\\}\\[\\]\\\\\\/]/gi, '')\n .replace(/\\W+/g, ' ')\n .split(/ |\\B(?=[A-Z])/)\n .map(word => word.toLowerCase())\n .join('_')\n", "import React, { useEffect, useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, Direction } from '../../types'\nimport { getDefaultSelectedCategory } from '../BankTransactionRow/BankTransactionRow'\nimport { RetryButton, SubmitButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { ErrorText, Text } from '../Typography'\nimport { TextUseTooltip } from '../Typography/Text'\nimport { Assignment } from './Assignment'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n index: number\n dateFormat: string\n bankTransaction: BankTransaction\n editable: boolean\n removeTransaction: (id: string) => void\n containerWidth?: number\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionListItem = ({\n index = 0,\n dateFormat,\n bankTransaction,\n editable,\n containerWidth,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [showRetry, setShowRetry] = useState(false)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction, match: matchBankTransaction } =\n useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n getDefaultSelectedCategory(bankTransaction),\n )\n\n const [open, setOpen] = useState(false)\n const toggleOpen = () => {\n setShowRetry(false)\n setOpen(!open)\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, index * 80)\n\n return () => clearTimeout(timeoutId)\n }, [])\n\n useEffect(() => {\n if (bankTransaction.error) {\n setShowRetry(true)\n }\n }, [bankTransaction.error])\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (open && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n return\n }\n\n if (!selectedCategory) {\n return\n }\n\n if (selectedCategory.type === 'match') {\n matchBankTransaction(bankTransaction.id, selectedCategory.payload.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: selectedCategory?.payload.stable_name || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-list-item'\n const openClassName = open ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n open ? openClassName : '',\n showComponent ? 'show' : '',\n )\n\n return (\n <li className={rowClassName}>\n <span className={`${className}__heading`}>\n <div className={`${className}__heading__main`}>\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 </div>\n <div\n onClick={toggleOpen}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDownFill\n className={`Layer__chevron ${\n open ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n <span className={`${className}__body`}>\n <span className={`${className}__body__name`}>\n <Text as='span' withTooltip={TextUseTooltip.whenTruncated}>\n {bankTransaction.counterparty_name ?? bankTransaction.description}\n </Text>\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 </span>\n <span className={`${className}__expanded-row`}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n isOpen={open}\n close={() => setOpen(false)}\n editable={editable}\n asListItem={true}\n submitBtnText={editable ? 'Approve' : 'Update'}\n containerWidth={containerWidth}\n />\n </span>\n <span className={`${className}__base-row`}>\n {editable ? (\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={category => {\n setShowRetry(false)\n setSelectedCategory(category)\n }}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable ? <Assignment bankTransaction={bankTransaction} /> : null}\n {editable && !showRetry ? (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {editable ? 'Approve' : 'Update'}\n </SubmitButton>\n ) : null}\n {editable && showRetry ? (\n <RetryButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__retry-btn'\n processing={bankTransaction.processing}\n error={\n 'Approval failed. Check connection and retry in few seconds.'\n }\n >\n Retry\n </RetryButton>\n ) : null}\n </span>\n {bankTransaction.error && showRetry ? (\n <ErrorText>\n Approval failed. Check connection and retry in few seconds.\n </ErrorText>\n ) : null}\n </li>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronDownFill = ({ 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 d='M4.5 6.75L9 11.25L13.5 6.75' fill='currentColor' />\n <path\n d='M4.5 6.75L9 11.25L13.5 6.75H4.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default ChevronDownFill\n", "import React, { useEffect, useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport AlertCircle from '../../icons/AlertCircle'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport Scissors from '../../icons/Scissors'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport {\n BankTransaction,\n CategorizationStatus,\n Category,\n Direction,\n} from '../../types'\nimport { hasSuggestions } from '../../types/categories'\nimport { Badge } from '../Badge'\nimport { SubmitButton, IconButton, RetryButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport {\n mapCategoryToOption,\n mapSuggestedMatchToOption,\n} from '../CategorySelect/CategorySelect'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Text } from '../Typography'\nimport { TextSize, TextUseTooltip } from '../Typography/Text'\nimport { MatchBadge } from './MatchBadge'\nimport { SplitTooltipDetails } from './SplitTooltipDetails'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n index: number\n dateFormat: string\n bankTransaction: BankTransaction\n editable: boolean\n removeTransaction: (id: string) => void\n containerWidth?: number\n initialLoad?: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport type LastSubmittedForm = 'simple' | 'match' | 'split' | undefined\n\nexport const extractDescriptionForSplit = (category: Category) => {\n if (!category.entries) {\n return ''\n }\n\n return category.entries.map(c => c.category.display_name).join(', ')\n}\n\nexport const getDefaultSelectedCategory = (\n bankTransaction: BankTransaction,\n) => {\n return hasSuggestions(bankTransaction.categorization_flow)\n ? mapCategoryToOption(bankTransaction.categorization_flow.suggestions[0])\n : bankTransaction.suggested_matches?.length === 1\n ? mapSuggestedMatchToOption(bankTransaction.suggested_matches[0])\n : undefined\n}\n\nlet clickTimer = Date.now()\n\nexport const BankTransactionRow = ({\n index = 0,\n dateFormat,\n bankTransaction,\n editable,\n removeTransaction,\n containerWidth,\n initialLoad,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [showRetry, setShowRetry] = useState(false)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction, match: matchBankTransaction } =\n useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n getDefaultSelectedCategory(bankTransaction),\n )\n const [open, setOpen] = useState(false)\n const toggleOpen = () => {\n setShowRetry(false)\n setOpen(!open)\n }\n\n const openRow = {\n onMouseDown: () => {\n clickTimer = Date.now()\n },\n onMouseUp: () => {\n if (Date.now() - clickTimer < 100 && !open) {\n setShowRetry(false)\n setOpen(true)\n }\n },\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n if (initialLoad) {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, index * 10)\n\n return () => clearTimeout(timeoutId)\n } else {\n setShowComponent(true)\n }\n }, [])\n\n useEffect(() => {\n if (bankTransaction.error) {\n setShowRetry(true)\n }\n }, [bankTransaction.error])\n\n const save = async () => {\n // Save using form from expanded row when row is open:\n if (open && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n return\n }\n\n if (!selectedCategory) {\n return\n }\n\n if (selectedCategory.type === 'match') {\n await matchBankTransaction(\n bankTransaction.id,\n selectedCategory.payload.id,\n )\n setOpen(false)\n return\n }\n\n await categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: selectedCategory?.payload.stable_name || '',\n },\n })\n setOpen(false)\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-row'\n const openClassName = open ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized && editable\n ? 'Layer__bank-transaction-row--removing'\n : '',\n open ? openClassName : '',\n initialLoad ? 'initial-load' : '',\n showComponent ? 'show' : '',\n )\n\n return (\n <>\n <tr\n className={rowClassName}\n onTransitionEnd={({ propertyName }) => {\n if (propertyName === 'top') {\n setRemoved(true)\n if (editable) {\n removeTransaction(bankTransaction.id)\n }\n }\n }}\n >\n <td\n className='Layer__table-cell Layer__bank-transaction-table__date-col'\n {...openRow}\n >\n <span className='Layer__table-cell-content'>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n </td>\n <td\n className='Layer__table-cell Layer__bank-transactions__tx-col'\n {...openRow}\n >\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 ?? bankTransaction.description}\n </Text>\n </span>\n </td>\n <td\n className='Layer__table-cell Layer__bank-transactions__account-col'\n {...openRow}\n >\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__bank-transactions__amount-col Layer__table-cell--amount ${className}__table-cell--amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n {...openRow}\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--${open ? 'open' : 'close'}`,\n )}\n >\n <span\n className={`${className}__actions-container Layer__table-cell-content`}\n >\n {editable && !open ? (\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={category => {\n setSelectedCategory(category)\n setShowRetry(false)\n }}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable && !open ? (\n <Text as='span' className={`${className}__category-text`}>\n {bankTransaction.categorization_status ===\n CategorizationStatus.SPLIT && (\n <>\n <Badge\n icon={<Scissors size={11} />}\n tooltip={\n <SplitTooltipDetails\n classNamePrefix={className}\n category={bankTransaction.category}\n />\n }\n >\n Split\n </Badge>\n <span className={`${className}__category-text__text`}>\n {extractDescriptionForSplit(bankTransaction.category)}\n </span>\n </>\n )}\n {bankTransaction?.categorization_status ===\n CategorizationStatus.MATCHED &&\n bankTransaction?.match && (\n <>\n <MatchBadge\n classNamePrefix={className}\n bankTransaction={bankTransaction}\n dateFormat={dateFormat}\n />\n <span className={`${className}__category-text__text`}>\n {`${formatTime(\n parseISO(bankTransaction.match.bank_transaction.date),\n dateFormat,\n )}, ${bankTransaction.match?.details?.description}`}\n </span>\n </>\n )}\n {bankTransaction?.categorization_status !==\n CategorizationStatus.MATCHED &&\n bankTransaction?.categorization_status !==\n CategorizationStatus.SPLIT && (\n <span className={`${className}__category-text__text`}>\n {bankTransaction?.category?.display_name}\n </span>\n )}\n </Text>\n ) : null}\n {editable && !open && showRetry ? (\n <RetryButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__retry-btn'\n processing={bankTransaction.processing}\n error={\n 'Approval failed. Check connection and retry in few seconds.'\n }\n >\n Retry\n </RetryButton>\n ) : null}\n {open && bankTransaction.error ? (\n <Text\n as='span'\n size={TextSize.md}\n className='Layer__unsaved-info'\n >\n <span>Unsaved</span>\n <AlertCircle size={12} />\n </Text>\n ) : null}\n {(editable && (open || (!open && !showRetry))) ||\n (!editable && open) ? (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n active={open}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {editable ? 'Approve' : 'Update'}\n </SubmitButton>\n ) : null}\n <IconButton\n onClick={toggleOpen}\n className='Layer__bank-transaction-row__expand-button'\n active={open}\n icon={\n <ChevronDownFill\n className={`Layer__chevron ${\n open ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n }\n />\n </span>\n </td>\n </tr>\n <tr>\n <td colSpan={5} className='Layer__bank-transaction-row__expanded-td'>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n isOpen={open}\n close={() => setOpen(false)}\n containerWidth={containerWidth}\n editable={editable}\n />\n </td>\n </tr>\n </>\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 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, { ReactNode, MouseEvent } from 'react'\nimport { Button } from '../Button'\nimport { ButtonProps } from '../Button/Button'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport enum BadgeSize {\n SMALL = 'small',\n MEDIUM = 'medium',\n}\n\nexport interface BadgeProps {\n children: ReactNode\n icon?: ReactNode\n onClick?: ButtonProps['onClick']\n tooltip?: ReactNode\n size?: BadgeSize\n}\n\nexport const Badge = ({\n icon,\n onClick,\n children,\n tooltip,\n size = BadgeSize.MEDIUM,\n}: BadgeProps) => {\n const baseProps = {\n className: classNames(\n 'Layer__badge',\n onClick || tooltip ? 'Layer__badge--clickable' : '',\n `Layer__badge--${size}`,\n ),\n onClick,\n children,\n }\n\n let content = (\n <>\n {icon && <span className='Layer__badge__icon'>{icon}</span>}\n {children}\n </>\n )\n\n content = onClick ? (\n <Button {...baseProps}>{content}</Button>\n ) : (\n <span {...baseProps}>{content}</span>\n )\n\n if (tooltip) {\n return (\n <Tooltip offset={12}>\n <TooltipTrigger>{content}</TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{tooltip}</TooltipContent>\n </Tooltip>\n )\n }\n\n return content\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 type ButtonJustify = 'center' | 'space-between' | 'start'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n iconOnly?: ReactNode\n iconAsPrimary?: boolean\n justify?: ButtonJustify\n}\n\nexport const Button = ({\n className,\n children,\n variant = ButtonVariant.primary,\n leftIcon,\n rightIcon,\n iconOnly,\n iconAsPrimary = false,\n justify = 'center',\n ...props\n}: ButtonProps) => {\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n let justifyContent = 'center'\n if (justify) {\n justifyContent = justify\n } else if (leftIcon && rightIcon) {\n justifyContent = 'space-between'\n } else if (rightIcon) {\n justifyContent = 'space-between'\n } else if (leftIcon) {\n justifyContent = 'start'\n }\n\n const baseClassName = classNames(\n 'Layer__btn',\n `Layer__btn--${variant}`,\n iconOnly ? 'Layer__btn--icon-only' : '',\n iconAsPrimary && 'Layer__btn--with-primary-icon',\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--${justifyContent}`}>\n {leftIcon && (\n <span\n className={classNames(\n 'Layer__btn-icon Layer__btn-icon--left',\n iconAsPrimary && 'Layer__btn-icon--primary',\n )}\n >\n {leftIcon}\n </span>\n )}\n {!iconOnly && <span className='Layer__btn-text'>{children}</span>}\n {rightIcon && (\n <span\n className={classNames(\n 'Layer__btn-icon Layer__btn-icon--right',\n iconAsPrimary && 'Layer__btn-icon--primary',\n )}\n >\n {rightIcon}\n </span>\n )}\n </span>\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode, useRef } from 'react'\nimport classNames from 'classnames'\n\nexport interface IconButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode\n active?: boolean\n}\n\nexport const IconButton = ({\n className,\n children,\n icon,\n active,\n ...props\n}: IconButtonProps) => {\n const baseClassName = classNames(\n 'Layer__icon-btn',\n `Layer__icon-btn--${active ? 'active' : 'inactive'}`,\n className,\n )\n\n return (\n <button {...props} className={baseClassName}>\n {icon}\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes } from 'react'\nimport RefreshCcw from '../../icons/RefreshCcw'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport { Button, ButtonVariant } from './Button'\nimport classNames from 'classnames'\n\nexport interface RetryButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n processing?: boolean\n disabled?: boolean\n error: string\n}\n\nexport const RetryButton = ({\n className,\n processing,\n disabled,\n error,\n children,\n ...props\n}: RetryButtonProps) => {\n const baseClassName = classNames(\n 'Layer__retry-btn',\n processing ? 'Layer__btn--processing' : '',\n className,\n )\n\n return (\n <Button\n {...props}\n className={baseClassName}\n variant={ButtonVariant.secondary}\n disabled={processing || disabled}\n rightIcon={<RefreshCcw size={12} />}\n justify='center'\n >\n {children}\n </Button>\n )\n}\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 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 Save from '../../icons/Save'\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 action?: SubmitAction\n noIcon?: boolean\n}\n\nexport enum SubmitAction {\n SAVE = 'save',\n UPDATE = 'update',\n}\n\nconst buildRightIcon = ({\n processing,\n error,\n action,\n noIcon,\n}: {\n processing?: boolean\n error?: boolean | string\n action: SubmitAction\n noIcon?: boolean\n}) => {\n if (noIcon) {\n return\n }\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 if (action === SubmitAction.UPDATE) {\n return (\n <span className='Layer__pt-2'>\n <Save size={14} />\n </span>\n )\n }\n\n return (\n <span>\n <CheckCircle size={14} style={{ paddingTop: 4 }} />\n </span>\n )\n}\n\nexport const SubmitButton = ({\n active,\n className,\n processing,\n disabled,\n error,\n children,\n action = SubmitAction.SAVE,\n noIcon,\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, action, noIcon })}\n iconAsPrimary={true}\n >\n {children}\n </Button>\n )\n}\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 * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Save = ({ 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='M14.25 15.75H3.75C3.35218 15.75 2.97064 15.592 2.68934 15.3107C2.40804 15.0294 2.25 14.6478 2.25 14.25V3.75C2.25 3.35218 2.40804 2.97064 2.68934 2.68934C2.97064 2.40804 3.35218 2.25 3.75 2.25H12L15.75 6V14.25C15.75 14.6478 15.592 15.0294 15.3107 15.3107C15.0294 15.592 14.6478 15.75 14.25 15.75Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.75 15.75V9.75H5.25V15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M5.25 2.25V6H11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Save\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.floatingStyles,\n }}\n {...context.getFloatingProps(props)}\n >\n <div className='Layer__tooltip-content ' style={{ ...context.styles }}>\n {props.children}\n </div>\n </div>\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 transform: 'scale(0.7)',\n color: 'transparent',\n },\n duration: 300,\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, { ButtonHTMLAttributes, ReactNode, useRef } from 'react'\nimport classNames from 'classnames'\n\nexport type TextButtonProps = ButtonHTMLAttributes<HTMLButtonElement>\n\nexport const TextButton = ({\n className,\n children,\n ...props\n}: TextButtonProps) => {\n const baseClassName = classNames('Layer__text-btn', className)\n\n return (\n <button {...props} className={baseClassName}>\n {children}\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode } from 'react'\nimport BackArrow from '../../icons/BackArrow'\nimport classNames from 'classnames'\n\nexport interface BackButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n textOnly?: boolean\n}\n\nexport const BackButton = ({\n className,\n children,\n textOnly = false,\n ...props\n}: BackButtonProps) => {\n const baseClassName = classNames('Layer__btn', 'Layer__back-btn', className)\n\n return (\n <button {...props} className={baseClassName}>\n {textOnly ? 'Back' : <BackArrow size={16} />}\n </button>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst BackArrow = ({ size = 18, ...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 <path\n d='M7.375 8.75L4.625 6L7.375 3.25'\n stroke='#1A130D'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default BackArrow\n", "import React from 'react'\nimport Select, {\n DropdownIndicatorProps,\n GroupHeadingProps,\n GroupBase,\n OptionProps,\n components,\n} from 'react-select'\nimport { DATE_FORMAT } from '../../config/general'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport Check from '../../icons/Check'\nimport ChevronDown from '../../icons/ChevronDown'\nimport MinimizeTwo from '../../icons/MinimizeTwo'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Category } from '../../types'\nimport { SuggestedMatch } from '../../types/bank_transactions'\nimport { CategoryEntry } from '../../types/categories'\nimport { Badge } from '../Badge'\nimport { BadgeSize } from '../Badge/Badge'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n name?: string\n bankTransaction: BankTransaction\n value: CategoryOption | undefined\n onChange: (newValue: CategoryOption) => void\n disabled?: boolean\n className?: string\n}\n\nexport enum OptionActionType {\n CATEGORY = 'category',\n MATCH = 'match',\n HIDDEN = 'hidden',\n}\n\nexport interface CategoryOptionPayload {\n id: string\n option_type: OptionActionType\n display_name: string\n date?: string\n amount?: number\n type?: string\n stable_name?: string\n entries?: CategoryEntry[]\n subCategories?: Category[]\n}\n\nexport interface CategoryOption {\n type: string\n disabled?: boolean\n payload: CategoryOptionPayload\n}\n\nexport const mapCategoryToOption = (category: Category): CategoryOption => {\n return {\n type: OptionActionType.CATEGORY,\n payload: {\n id: category.id,\n option_type: OptionActionType.CATEGORY,\n display_name: category.display_name,\n type: category.type,\n stable_name: category.stable_name,\n entries: category.entries,\n subCategories: category.subCategories,\n },\n }\n}\n\nexport const mapSuggestedMatchToOption = (\n record: SuggestedMatch,\n): CategoryOption => {\n return {\n type: OptionActionType.MATCH,\n payload: {\n id: record.id,\n option_type: OptionActionType.MATCH,\n display_name: record.details.description,\n amount: record.details.amount,\n },\n }\n}\n\nconst DropdownIndicator:\n | React.ComponentType<\n DropdownIndicatorProps<CategoryOption, false, GroupBase<CategoryOption>>\n >\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n )\n}\n\nconst GroupHeading = (\n props: GroupHeadingProps<CategoryOption, false, GroupBase<CategoryOption>>,\n) => {\n return (\n <components.GroupHeading\n className={classNames(\n props.className,\n props.children === 'Match' || props.children === 'All categories'\n ? 'Layer__select__group-heading--main'\n : '',\n )}\n {...props}\n />\n )\n}\n\nconst Option = (\n props: OptionProps<CategoryOption, false, GroupBase<CategoryOption>>,\n) => {\n if (props.data.payload.option_type === 'hidden') {\n return\n }\n\n if (props.data.type === 'match') {\n return (\n <components.Option\n {...props}\n className={`${props.className} Layer__select__option-content__match`}\n >\n <div className='Layer__select__option-content__match__main-row'>\n <span className='Layer__select__option-content__match__date'>\n {props.data.payload.date &&\n formatTime(parseISO(props.data.payload.date), DATE_FORMAT)}\n </span>\n <span className='Layer__select__option-content__match__description'>\n {props.data.payload.display_name}\n </span>\n </div>\n <div className='Layer__select__option-content__match__amount-row'>\n <span className='Layer__select__option-content__match__amount'>\n ${formatMoney(props.data.payload.amount)}\n </span>\n </div>\n </components.Option>\n )\n }\n\n return (\n <components.Option\n {...props}\n className={`Layer__select__option-menu-content ${props.className}`}\n >\n <div>{props.data.payload.display_name}</div>\n {props.isSelected ? (\n <span className='Layer__select__option-menu-content-check'>\n <Check size={16} />\n </span>\n ) : null}\n </components.Option>\n )\n}\n\nconst allCategoriesDivider: GroupBase<CategoryOption>[] = [\n {\n label: 'All categories',\n options: [\n {\n type: 'All categories',\n disabled: true,\n payload: {\n id: 'all_categories',\n option_type: OptionActionType.HIDDEN,\n display_name: 'ALL CATEGORIES',\n },\n } satisfies CategoryOption,\n ],\n },\n]\n\nfunction flattenCategories(\n categories: Category[],\n): GroupBase<CategoryOption>[] {\n const categoryOptions = (categories || []).flatMap(category => {\n if (category?.subCategories && category?.subCategories?.length > 0) {\n if (category?.subCategories?.every(c => c.subCategories === undefined)) {\n return [\n {\n label: category.display_name,\n options: category.subCategories.map(x => mapCategoryToOption(x)),\n },\n ]\n }\n return flattenCategories(category.subCategories)\n }\n const resultOption = {\n label: category.display_name,\n options: [mapCategoryToOption(category)],\n } satisfies GroupBase<CategoryOption>\n return [resultOption]\n })\n return categoryOptions\n}\n\nexport const CategorySelect = ({\n bankTransaction,\n name,\n value,\n onChange,\n disabled,\n className,\n}: Props) => {\n const { categories } = useLayerContext()\n\n const matchOptions = bankTransaction?.suggested_matches\n ? [\n {\n label: 'Match',\n options: bankTransaction.suggested_matches.map(x => {\n return {\n type: OptionActionType.MATCH,\n payload: {\n id: x.id,\n option_type: OptionActionType.MATCH,\n display_name: x.details.description,\n date: x.details.date,\n amount: x.details.amount,\n },\n } satisfies CategoryOption\n }),\n } satisfies GroupBase<CategoryOption>,\n ]\n : []\n\n const suggestedOptions =\n bankTransaction?.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? [\n {\n label: 'Suggestions',\n options: bankTransaction.categorization_flow.suggestions.map(x =>\n mapCategoryToOption(x),\n ),\n } satisfies GroupBase<CategoryOption>,\n ]\n : []\n\n const categoryOptions = flattenCategories(categories)\n\n const options = [\n ...matchOptions,\n ...suggestedOptions,\n ...allCategoriesDivider,\n ...categoryOptions,\n ]\n\n const selected = value\n ? value\n : matchOptions?.length === 1 && matchOptions[0].options.length === 1\n ? matchOptions[0].options[0]\n : undefined\n\n // @TODO ^ do this same for suggested options so user can just click approve\n // However... parent component may handle this already - need some test data from API to verify\n\n const placeholder =\n matchOptions?.length === 1 && matchOptions[0].options.length > 1\n ? `${matchOptions[0].options.length} possible matches...`\n : 'Categorize or match...'\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<CategoryOption>\n name={name}\n className={`Layer__category-menu Layer__select ${className ?? ''}`}\n classNamePrefix='Layer__select'\n classNames={{\n menu: () => 'Layer__select__menu--lg',\n }}\n options={options}\n isSearchable={true}\n placeholder={placeholder}\n defaultValue={selected}\n formatOptionLabel={props => (\n <div className='Layer__select__option-label'>\n {props.type === 'match' && (\n <Badge size={BadgeSize.SMALL} icon={<MinimizeTwo size={11} />}>\n Match\n </Badge>\n )}\n <span>{props.payload.display_name}</span>\n </div>\n )}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n getOptionLabel={category => category.payload.display_name}\n getOptionValue={category => category.payload.id}\n menuPortalTarget={document.body}\n styles={{\n menuPortal: base => ({ ...base, zIndex: 9999 }),\n }}\n components={{ DropdownIndicator, GroupHeading, Option }}\n isDisabled={disabled}\n isOptionDisabled={option => option.disabled ?? false}\n />\n )\n}\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 MinimizeTwo = ({ 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='M3 10.5H7.5V15'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15 7.5H10.5V3'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 7.5L15.75 2.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M2.25 15.75L7.5 10.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default MinimizeTwo\n", "import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useCallback,\n useEffect,\n useRef,\n TransitionEvent,\n} from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport AlertCircle from '../../icons/AlertCircle'\nimport Scissors from '../../icons/ScissorsFullOpen'\nimport Trash from '../../icons/Trash'\nimport {\n centsToDollars as formatMoney,\n dollarsToCents as parseMoney,\n} from '../../models/Money'\nimport {\n BankTransaction,\n SplitCategoryUpdate,\n SingleCategoryUpdate,\n Category,\n} from '../../types'\nimport { hasSuggestions } from '../../types/categories'\nimport { Button, SubmitButton, ButtonVariant, TextButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport {\n CategoryOption,\n mapCategoryToOption,\n} from '../CategorySelect/CategorySelect'\nimport { InputGroup, Input, FileInput } from '../Input'\nimport { MatchForm } from '../MatchForm'\nimport { Textarea } from '../Textarea'\nimport { Toggle } from '../Toggle'\nimport { ToggleSize } from '../Toggle/Toggle'\nimport { Text, ErrorText, TextSize } from '../Typography'\nimport { APIErrorNotifications } from './APIErrorNotifications'\nimport classNames from 'classnames'\n\ntype Props = {\n bankTransaction: BankTransaction\n isOpen?: boolean\n close: () => void\n asListItem?: boolean\n submitBtnText?: string\n containerWidth?: number\n editable?: boolean\n}\n\ntype Split = {\n amount: number\n inputValue: string\n category: CategoryOption | 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\nconst hasMatch = (bankTransaction?: BankTransaction) => {\n return Boolean(\n (bankTransaction?.suggested_matches &&\n bankTransaction?.suggested_matches?.length > 0) ||\n bankTransaction?.match,\n )\n}\n\nconst isAlreadyMatched = (bankTransaction?: BankTransaction) => {\n if (bankTransaction?.match) {\n const foundMatch = bankTransaction.suggested_matches?.find(\n x => x.details.id === bankTransaction?.match?.details.id,\n )\n return foundMatch?.id\n }\n\n return undefined\n}\n\nconst validateSplit = (splitData: RowState) => {\n let valid = true\n\n splitData.splits.forEach(split => {\n if (split.amount <= 0) {\n valid = false\n } else if (!split.category) {\n valid = false\n }\n })\n\n return valid\n}\n\nexport const ExpandedBankTransactionRow = forwardRef<SaveHandle, Props>(\n (\n {\n bankTransaction,\n isOpen = false,\n close,\n editable,\n asListItem = false,\n submitBtnText = 'Save',\n containerWidth,\n },\n ref,\n ) => {\n const {\n categorize: categorizeBankTransaction,\n match: matchBankTransaction,\n } = useBankTransactions()\n const [purpose, setPurpose] = useState<Purpose>(\n bankTransaction.category\n ? Purpose.categorize\n : hasMatch(bankTransaction)\n ? Purpose.match\n : Purpose.categorize,\n )\n const [selectedMatchId, setSelectedMatchId] = useState<string | undefined>(\n isAlreadyMatched(bankTransaction),\n )\n const [matchFormError, setMatchFormError] = useState<string | undefined>()\n const [splitFormError, setSplitFormError] = useState<string | undefined>()\n const [height, setHeight] = useState<string | number>(0)\n const [isOver, setOver] = useState(false)\n const bodyRef = useRef<HTMLSpanElement>(null)\n const [isLoaded, setIsLoaded] = useState(false)\n\n const defaultCategory =\n bankTransaction.category ||\n (hasSuggestions(bankTransaction.categorization_flow) &&\n bankTransaction.categorization_flow?.suggestions?.[0])\n\n const [rowState, updateRowState] = useState<RowState>({\n splits: bankTransaction.category?.entries\n ? bankTransaction.category?.entries.map(c => {\n return {\n amount: c.amount || 0,\n inputValue: formatMoney(c.amount),\n category: mapCategoryToOption(c.category),\n }\n })\n : [\n {\n amount: bankTransaction.amount,\n inputValue: formatMoney(bankTransaction.amount),\n category: mapCategoryToOption(defaultCategory),\n },\n ],\n description: '',\n file: undefined,\n })\n\n const addSplit = () => {\n updateRowState({\n ...rowState,\n splits: [\n ...rowState.splits,\n {\n amount: 0,\n inputValue: '0.00',\n category: mapCategoryToOption(defaultCategory),\n },\n ],\n })\n setSplitFormError(undefined)\n }\n\n const removeSplit = (index: number) => {\n const newSplits = rowState.splits.filter((_v, idx) => idx !== index)\n const splitTotal = newSplits.reduce((sum, split, index) => {\n const amount = index === 0 ? 0 : split.amount\n return sum + amount\n }, 0)\n const remaining = bankTransaction.amount - splitTotal\n newSplits[0].amount = remaining\n newSplits[0].inputValue = formatMoney(remaining)\n\n updateRowState({\n ...rowState,\n splits: newSplits,\n })\n setSplitFormError(undefined)\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.reduce((sum, split, index) => {\n const amount =\n index === 0 ? 0 : 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[0].amount = remaining\n rowState.splits[0].inputValue = formatMoney(remaining)\n updateRowState({ ...rowState })\n setSplitFormError(undefined)\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 setSplitFormError(undefined)\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 setSplitFormError(undefined)\n setMatchFormError(undefined)\n }\n\n const changeCategory = (index: number, newValue: CategoryOption) => {\n rowState.splits[index].category = newValue\n updateRowState({ ...rowState })\n setSplitFormError(undefined)\n }\n\n const save = async () => {\n if (purpose === Purpose.match) {\n if (!selectedMatchId) {\n setMatchFormError('Select an option to match the transaction')\n } else if (\n selectedMatchId &&\n selectedMatchId !== isAlreadyMatched(bankTransaction)\n ) {\n onMatchSubmit(selectedMatchId)\n }\n return\n }\n\n if (!validateSplit(rowState)) {\n if (rowState.splits.length > 1) {\n setSplitFormError(\n 'Use only positive amounts and select category for each entry',\n )\n } else {\n setSplitFormError('Category is required')\n }\n return\n }\n\n await categorizeBankTransaction(\n bankTransaction.id,\n rowState.splits.length === 1\n ? ({\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: rowState?.splits[0].category?.payload.stable_name,\n },\n } as SingleCategoryUpdate)\n : ({\n type: 'Split',\n entries: rowState.splits.map(split => ({\n category: split.category?.payload.stable_name,\n amount: split.amount,\n })),\n } as SplitCategoryUpdate),\n )\n\n close()\n }\n\n // Call this save action after clicking save in parent component:\n useImperativeHandle(ref, () => ({\n save,\n }))\n\n const onMatchSubmit = async (matchId: string) => {\n const foundMatch = bankTransaction.suggested_matches?.find(\n x => x.id === matchId,\n )\n if (!foundMatch) {\n return\n }\n\n await matchBankTransaction(bankTransaction.id, foundMatch.id)\n close()\n }\n\n const getDivHeight = useCallback(() => {\n const { height } = bodyRef.current\n ? bodyRef.current.getBoundingClientRect()\n : { height: undefined }\n\n return height || 0\n }, [])\n\n const handleTransitionEnd = useCallback(\n (e: TransitionEvent<HTMLSpanElement>) => {\n if (e.propertyName === 'height') {\n setHeight(isOpen ? 'auto' : 0)\n if (!isOpen) {\n setOver(true)\n }\n }\n },\n [isOpen],\n )\n\n useEffect(() => {\n if (!isLoaded) {\n return\n }\n\n setHeight(getDivHeight())\n setOver(false)\n\n if (!isOpen) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setHeight(0))\n })\n }\n }, [getDivHeight, isOpen])\n\n useEffect(() => {\n setIsLoaded(true)\n setOver(true)\n }, [])\n\n const className = 'Layer__expanded-bank-transaction-row'\n const shouldHide = !isOpen && isOver\n\n return (\n <span\n className={`${className} ${className}--${\n isOpen ? 'expanded' : 'collapsed'\n }`}\n style={{ height }}\n onTransitionEnd={handleTransitionEnd}\n >\n {shouldHide ? null : (\n <span className={`${className}__wrapper`} ref={bodyRef}>\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 },\n {\n value: 'match',\n label: 'Match',\n disabled: !hasMatch(bankTransaction),\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}__content-panels`}>\n <div\n className={classNames(\n `${className}__match`,\n `${className}__content-panel`,\n purpose === Purpose.match\n ? `${className}__content-panel--active`\n : '',\n )}\n >\n <div className={`${className}__content-panel-container`}>\n <MatchForm\n classNamePrefix={className}\n bankTransaction={bankTransaction}\n selectedMatchId={selectedMatchId}\n setSelectedMatchId={id => {\n setMatchFormError(undefined)\n setSelectedMatchId(id)\n }}\n matchFormError={matchFormError}\n />\n </div>\n </div>\n\n <div\n className={classNames(\n `${className}__splits`,\n `${className}__content-panel`,\n purpose === Purpose.categorize\n ? `${className}__content-panel--active`\n : '',\n )}\n >\n <div className={`${className}__content-panel-container`}>\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 <Input\n type='text'\n name={`split-${index}${asListItem ? '-li' : ''}`}\n disabled={index === 0}\n onChange={updateAmounts(index)}\n value={split.inputValue}\n onBlur={onBlur}\n isInvalid={split.amount < 0}\n errorMessage='Negative values are not allowed'\n />\n <div\n className={`${className}__table-cell--split-entry__right-col`}\n >\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={split.category}\n onChange={value => changeCategory(index, value)}\n className='Layer__category-menu--full'\n disabled={bankTransaction.processing}\n />\n {index > 0 && (\n <Button\n className={`${className}__table-cell--split-entry__merge-btn`}\n onClick={() => removeSplit(index)}\n rightIcon={<Trash size={18} />}\n variant={ButtonVariant.secondary}\n iconOnly={true}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n {splitFormError && <ErrorText>{splitFormError}</ErrorText>}\n <div className={`${className}__total-and-btns`}>\n {rowState.splits.length > 1 && (\n <Input\n disabled={true}\n leftText='Total'\n value={`$${formatMoney(\n rowState.splits.reduce(\n (x, { amount }) => x + amount,\n 0,\n ),\n )}`}\n />\n )}\n <div className={`${className}__splits-buttons`}>\n {rowState.splits.length > 1 ? (\n <TextButton\n onClick={addSplit}\n disabled={rowState.splits.length > 5}\n >\n Add new split\n </TextButton>\n ) : (\n <Button\n onClick={addSplit}\n rightIcon={<Scissors size={14} />}\n variant={ButtonVariant.secondary}\n disabled={rowState.splits.length > 5}\n >\n Split\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <InputGroup\n className={`${className}__description`}\n name='description'\n >\n <Textarea name='description' placeholder='Add 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 {bankTransaction.error ? (\n <Text\n as='span'\n size={TextSize.md}\n className='Layer__unsaved-info'\n >\n <span>Unsaved</span>\n <AlertCircle size={12} />\n </Text>\n ) : null}\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n active={true}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {submitBtnText}\n </SubmitButton>\n </div>\n ) : null}\n </div>\n <APIErrorNotifications\n bankTransaction={bankTransaction}\n containerWidth={containerWidth}\n />\n </span>\n )}\n </span>\n )\n },\n)\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 * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Trash = ({ 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='M2.25 4.5H3.75H15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M14.25 4.5V15C14.25 15.3978 14.092 15.7794 13.8107 16.0607C13.5294 16.342 13.1478 16.5 12.75 16.5H5.25C4.85218 16.5 4.47064 16.342 4.18934 16.0607C3.90804 15.7794 3.75 15.3978 3.75 15V4.5M6 4.5V3C6 2.60218 6.15804 2.22064 6.43934 1.93934C6.72064 1.65804 7.10218 1.5 7.5 1.5H10.5C10.8978 1.5 11.2794 1.65804 11.5607 1.93934C11.842 2.22064 12 2.60218 12 3V4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M7.5 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Trash\n", "import React, { HTMLProps } from 'react'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport interface InputProps extends HTMLProps<HTMLInputElement> {\n isInvalid?: boolean\n errorMessage?: string\n leftText?: string\n}\n\nexport const Input = ({\n className,\n isInvalid,\n errorMessage,\n leftText,\n ...props\n}: InputProps) => {\n const baseClassName = classNames(\n 'Layer__input',\n isInvalid ? 'Layer__input--error' : '',\n leftText ? 'Layer__input--with-left-text' : '',\n className,\n )\n\n return (\n <Tooltip disabled={!isInvalid || !errorMessage}>\n <TooltipTrigger className='Layer__input-tooltip'>\n <input {...props} className={baseClassName} />\n {leftText && <span className='Layer__input-left-text'>{leftText}</span>}\n </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{errorMessage}</TooltipContent>\n </Tooltip>\n )\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 inline?: boolean\n}\n\nexport const InputGroup = ({\n label,\n name,\n className,\n inline,\n children,\n}: InputGroupProps) => {\n const baseClassName = classNames(\n 'Layer__input-group',\n className,\n inline && 'Layer__input-group--inline',\n )\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 from 'react'\nimport { TextProps, Text } from './Text'\nimport classNames from 'classnames'\n\nexport type ErrorTextProps = TextProps\n\nexport const ErrorText = ({ className, ...props }: ErrorTextProps) => {\n const baseClassName = classNames('Layer__text--error', className)\n return <Text {...props} className={baseClassName} />\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 rightIcon={<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 from 'react'\nimport ReactSelect, {\n DropdownIndicatorProps,\n GroupBase,\n OptionsOrGroups,\n components,\n} from 'react-select'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\n\nexport interface SelectProps<T> {\n name?: string\n options?: OptionsOrGroups<T, GroupBase<T>>\n className?: string\n classNamePrefix?: string\n value?: T\n onChange: (selected: T) => void\n disabled?: boolean\n}\n\nconst DropdownIndicator:\n | React.ComponentType<DropdownIndicatorProps<any, false, GroupBase<any>>>\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDownFill />\n </components.DropdownIndicator>\n )\n}\n\nexport const Select = <T,>({\n name,\n options,\n className,\n classNamePrefix = 'Layer__select',\n value,\n onChange,\n disabled,\n}: SelectProps<T>) => {\n return (\n <ReactSelect<T>\n name={name}\n className={`Layer__select ${className ?? ''}`}\n classNamePrefix={classNamePrefix}\n options={options}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n menuPortalTarget={document.body}\n styles={{ menuPortal: base => ({ ...base, zIndex: 9999 }) }}\n components={{ DropdownIndicator }}\n isDisabled={disabled}\n />\n )\n}\n", "import React from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction } from '../../types'\nimport { MatchBadge } from '../BankTransactionRow/MatchBadge'\nimport { Text, TextUseTooltip, ErrorText } from '../Typography'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface MatchFormProps {\n classNamePrefix: string\n bankTransaction: BankTransaction\n selectedMatchId?: string\n setSelectedMatchId: (val?: string) => void\n matchFormError?: string\n}\n\nexport const MatchForm = ({\n classNamePrefix,\n bankTransaction,\n selectedMatchId,\n setSelectedMatchId,\n matchFormError,\n}: MatchFormProps) => {\n return (\n <div className={`${classNamePrefix}__match-table`}>\n <div className={`${classNamePrefix}__match-table__header`}>\n <div className={`${classNamePrefix}__match-table__date`}>Date</div>\n <div className={`${classNamePrefix}__match-table__desc`}>\n Description\n </div>\n <div className={`${classNamePrefix}__match-table__amount`}>Amount</div>\n\n <div\n className={`${classNamePrefix}__match-table__status ${\n bankTransaction.match ? '' : 'no-match'\n }`}\n ></div>\n </div>\n\n {bankTransaction.suggested_matches?.map((match, idx) => {\n return (\n <div\n key={idx}\n className={classNames(\n `${classNamePrefix}__match-row`,\n match.id === selectedMatchId\n ? `${classNamePrefix}__match-row--selected`\n : '',\n )}\n onClick={() => {\n if (selectedMatchId === match.id) {\n setSelectedMatchId(undefined)\n return\n }\n setSelectedMatchId(match.id)\n }}\n >\n <div\n className={`Layer__nowrap ${classNamePrefix}__match-table__date`}\n >\n <span>\n {formatTime(parseISO(match.details.date), DATE_FORMAT)}\n </span>\n <span className='amount-next-to-date'>\n ${formatMoney(match.details.amount)}\n </span>\n </div>\n <div className={`${classNamePrefix}__match-table__desc`}>\n <Text\n className={`${classNamePrefix}__match-table__desc-tooltip`}\n withTooltip={TextUseTooltip.whenTruncated}\n as='span'\n >\n {match.details.description}\n </Text>\n {match.details.id === bankTransaction.match?.details.id && (\n <span className='match-badge'>\n <MatchBadge\n classNamePrefix={classNamePrefix}\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n </span>\n )}\n </div>\n <div className={`${classNamePrefix}__match-table__amount`}>\n ${formatMoney(match.details.amount)}\n </div>\n\n <div\n className={`${classNamePrefix}__match-table__status ${\n bankTransaction.match ? '' : 'no-match'\n }`}\n >\n {match.details.id === bankTransaction.match?.details.id && (\n <MatchBadge\n classNamePrefix={classNamePrefix}\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n )}\n </div>\n </div>\n )\n })}\n {matchFormError && <ErrorText>{matchFormError}</ErrorText>}\n </div>\n )\n}\n", "import React from 'react'\nimport MinimizeTwo from '../../icons/MinimizeTwo'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { Badge } from '../Badge'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface MatchBadgeProps {\n bankTransaction: BankTransaction\n classNamePrefix: string\n dateFormat: string\n text?: string\n}\n\nexport const MatchBadge = ({\n bankTransaction,\n classNamePrefix,\n dateFormat,\n text = 'Match',\n}: MatchBadgeProps) => {\n if (\n bankTransaction.categorization_status === CategorizationStatus.MATCHED &&\n bankTransaction.match\n ) {\n const { date, amount } = bankTransaction.match.bank_transaction\n\n return (\n <Badge\n icon={<MinimizeTwo size={11} />}\n tooltip={\n <span className={`${classNamePrefix}__match-tooltip`}>\n <div className={`${classNamePrefix}__match-tooltip__date`}>\n {formatTime(parseISO(date), dateFormat)}\n </div>\n <div className={`${classNamePrefix}__match-tooltip__description`}>\n {bankTransaction.match?.details?.description ?? ''}\n </div>\n <div className={`${classNamePrefix}__match-tooltip__amount`}>\n ${formatMoney(amount)}\n </div>\n </span>\n }\n >\n {text}\n </Badge>\n )\n }\n\n return\n}\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 { Tooltip, TooltipContent, TooltipTrigger } from '../Tooltip'\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.5)\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 if (disabled) {\n return (\n <Tooltip>\n <TooltipTrigger>\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 <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 </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>\n We could not find matching transactions\n </TooltipContent>\n </Tooltip>\n )\n }\n\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 <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, { useEffect, useState } from 'react'\nimport AlertOctagon from '../../icons/AlertOctagon'\nimport { BankTransaction } from '../../types'\nimport { Text } from '../Typography'\n\ninterface APIErrorNotificationsProps {\n bankTransaction: BankTransaction\n containerWidth?: number\n}\n\ninterface Notification {\n bankTransactionId: string\n timestamp: number\n title: string\n message: string\n}\n\nconst ERROR_TITLE = 'Approval Failed'\nconst ERROR_MESSAGE = 'Something went wrong, try again later'\nconst NOTIFICATION_TIME = 4000\nconst FADE_OUT_TIME_WAIT = 1000\n\nlet notificationsCache: Notification[] = []\n\nexport const APIErrorNotifications = ({\n bankTransaction,\n containerWidth,\n}: APIErrorNotificationsProps) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const pushNotification = (title: string, message: string) => {\n const timestamp = new Date().valueOf()\n if (\n notificationsCache.find(\n n =>\n n.timestamp === timestamp &&\n n.bankTransactionId !== bankTransaction.id,\n )\n ) {\n return\n }\n notificationsCache = notificationsCache.concat({\n bankTransactionId: bankTransaction.id,\n timestamp,\n title,\n message,\n })\n const ids = notificationsCache.map(\n ({ bankTransactionId }) => bankTransactionId,\n )\n const timestamps = notificationsCache.map(({ timestamp }) => timestamp)\n notificationsCache = notificationsCache.filter(\n ({ bankTransactionId, timestamp }, index) =>\n !ids.includes(bankTransactionId, index + 1) &&\n !timestamps.includes(timestamp, index + 1),\n )\n setNotifications(notificationsCache.concat())\n }\n\n const deleteNotification = (timestamp: number) => {\n notificationsCache = notificationsCache.filter(\n n => n.timestamp !== timestamp,\n )\n setNotifications(notificationsCache.concat())\n }\n\n useEffect(() => {\n if (bankTransaction.error) {\n pushNotification(ERROR_TITLE, ERROR_MESSAGE)\n }\n }, [bankTransaction.error])\n\n return (\n <div\n className='Layer__bank-transactions__notifications'\n style={containerWidth ? { left: containerWidth - 324 } : {}}\n >\n {notifications\n .filter(n => n.bankTransactionId === bankTransaction.id)\n .map(notification => (\n <Notification\n key={notification.timestamp}\n notification={notification}\n deleteNotification={deleteNotification}\n />\n ))}\n </div>\n )\n}\n\nconst Notification = ({\n notification,\n deleteNotification,\n}: {\n notification: Notification\n deleteNotification: (timestamp: number) => void\n}) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n setVisible(true)\n\n const timer = setTimeout(() => {\n hideNotification()\n }, NOTIFICATION_TIME)\n\n return () => clearTimeout(timer)\n }, [])\n\n const hideNotification = () => {\n setVisible(false)\n setTimeout(() => {\n deleteNotification(notification.timestamp)\n }, FADE_OUT_TIME_WAIT)\n }\n\n return (\n <div\n className={`Layer__bank-transactions__notification ${\n visible ? 'notification-enter' : 'notification-exit'\n }`}\n onClick={hideNotification}\n >\n <div className='Layer__bank-transactions__notification-content'>\n <div className='Layer__bank-transactions__notification-icon'>\n <AlertOctagon size={14} />\n </div>\n <div className='Layer__bank-transactions__notification-text'>\n <Text\n as='span'\n className='Layer__bank-transactions__notification-title'\n >\n {notification.title}\n </Text>\n <Text\n as='span'\n className='Layer__bank-transactions__notification-message'\n >\n {notification.message}\n </Text>\n </div>\n </div>\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 from 'react'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { Category } from '../../types'\n\nexport const SplitTooltipDetails = ({\n classNamePrefix,\n category,\n}: {\n classNamePrefix: string\n category: Category\n}) => {\n if (!category.entries) {\n return\n }\n\n return (\n <span className={`${classNamePrefix}__split-tooltip`}>\n <ul>\n {category.entries.map((entry, idx) => (\n <li key={idx}>\n <span className={`${classNamePrefix}__split-tooltip__label`}>\n {entry.category.display_name}\n </span>\n <span className={`${classNamePrefix}__split-tooltip__value`}>\n ${formatMoney(entry.amount)}\n </span>\n </li>\n ))}\n </ul>\n </span>\n )\n}\n", "import React from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport Scissors from '../../icons/Scissors'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { Badge } from '../Badge'\nimport { extractDescriptionForSplit } from '../BankTransactionRow/BankTransactionRow'\nimport { MatchBadge } from '../BankTransactionRow/MatchBadge'\nimport { SplitTooltipDetails } from '../BankTransactionRow/SplitTooltipDetails'\nimport { Text } from '../Typography'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface AssignmentProps {\n bankTransaction: BankTransaction\n}\n\nexport const Assignment = ({ bankTransaction }: AssignmentProps) => {\n if (\n bankTransaction.match &&\n bankTransaction.categorization_status === CategorizationStatus.MATCHED\n ) {\n return (\n <>\n <MatchBadge\n classNamePrefix='Layer__bank-transaction-list-item'\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n <Text className='Layer__bank-transaction-list-item__category-text__text'>\n {`${formatTime(\n parseISO(bankTransaction.match.bank_transaction.date),\n DATE_FORMAT,\n )}, ${bankTransaction.match.bank_transaction.description}`}\n </Text>\n </>\n )\n }\n\n if (bankTransaction.categorization_status === CategorizationStatus.SPLIT) {\n return (\n <>\n <Badge\n icon={<Scissors size={11} />}\n tooltip={\n <SplitTooltipDetails\n classNamePrefix='Layer__bank-transaction-list-item'\n category={bankTransaction.category}\n />\n }\n >\n Split\n </Badge>\n <Text className='Layer__bank-transaction-list-item__category-text__text'>\n {extractDescriptionForSplit(bankTransaction.category)}\n </Text>\n </>\n )\n }\n\n return <Text>{bankTransaction?.category?.display_name}</Text>\n}\n", "import React, { ReactNode, forwardRef } 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 = forwardRef<HTMLDivElement, ContainerProps>(\n ({ name, className, children, asWidget }, ref) => {\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 ref={ref} className={baseClassName} style={{ ...styles }}>\n {children}\n </div>\n )\n },\n)\n", "export const SHADES = {\n 50: { s: 1, l: 98 },\n 100: { s: 1, l: 96 },\n 200: { s: 1, l: 94 },\n 300: { s: 2, l: 92 },\n 500: { s: 5, l: 53 },\n 600: { s: 7, l: 40 },\n 700: { s: 9, l: 27 },\n 800: { s: 12, l: 20 },\n 1000: { s: 20, l: 7 },\n}\n\nexport const COLORS = {\n dark: {\n h: 0,\n s: 0,\n l: 7,\n },\n light: {\n h: 0,\n s: 0,\n l: 100,\n },\n}\n", "import { COLORS, SHADES } from '../config/theme'\nimport {\n LayerThemeConfig,\n ColorConfig,\n ColorRGBConfig,\n ColorRGBNumberConfig,\n ColorHSLNumberConfig,\n ColorsPalette,\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 * Parse the color from theme config into a CSS variables.\n * @param {string} colorName\n * @param {ColorConfig} color\n */\nconst parseColorFromThemeToHsl = (\n color?: ColorConfig,\n): ColorHSLNumberConfig | undefined => {\n if (!color) {\n return\n }\n\n try {\n if ('h' in color && 's' in color && 'l' in color) {\n return {\n h: Number(color.h),\n s: Number(color.s),\n l: Number(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 h: h,\n s: s,\n l: l,\n }\n }\n\n if ('hex' in color) {\n const rgb = hexToRgb(color.hex)\n if (!rgb) {\n return undefined\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 h: h,\n s: s,\n 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\n/**\n * Build same color palette in RGB, HSL and HEX as CSS variables.\n */\nexport const buildColorsPalette = (theme?: LayerThemeConfig): ColorsPalette => {\n const darkColor = parseColorFromThemeToHsl(theme?.colors?.dark) ?? COLORS.dark\n const lightColor =\n parseColorFromThemeToHsl(theme?.colors?.light) ?? COLORS.light\n\n return {\n 50: buildColorShade(50, darkColor),\n 100: buildColorShade(100, darkColor),\n 200: buildColorShade(200, darkColor),\n 300: buildColorShade(300, darkColor),\n 400: {\n hsl: lightColor,\n rgb: hslToRgb(lightColor),\n hex: hslToHex(lightColor),\n },\n 500: buildColorShade(500, darkColor),\n 600: buildColorShade(600, darkColor),\n 700: buildColorShade(700, darkColor),\n 800: buildColorShade(800, darkColor),\n 900: {\n hsl: darkColor,\n rgb: hslToRgb(darkColor),\n hex: hslToHex(darkColor),\n },\n 1000: buildColorShade(1000, darkColor),\n }\n}\n\n/**\n * Build color shade based on the dark color (HSL)\n * and config values for S and L.\n */\nconst buildColorShade = (\n shade: keyof typeof SHADES,\n darkColorHsl: ColorHSLNumberConfig,\n) => {\n const hsl = { h: darkColorHsl.h, ...SHADES[shade] }\n const rgb = hslToRgb(hsl)\n const hex = hslToHex(hsl)\n\n return { hsl, rgb, hex }\n}\n/**\n * Convert Hue into RGB\n */\nconst hueToRgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1.0 / 6.0) return p + (q - p) * 6 * t\n if (t < 1.0 / 2.0) return q\n if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6\n return p\n}\n\n/**\n * Convert HSL to RGB\n */\nconst hslToRgb = (hsl: ColorHSLNumberConfig): ColorRGBNumberConfig => {\n let r, g, b\n let l = hsl.l / 100\n let s = hsl.s / 100\n\n if (hsl.s === 0) {\n r = g = b = l\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n r = hueToRgb(p, q, hsl.h + 1.0 / 3.0)\n g = hueToRgb(p, q, hsl.h)\n b = hueToRgb(p, q, hsl.h - 1.0 / 3.0)\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n }\n}\n\n/**\n * Convert HSL to HEX\n */\nconst hslToHex = (hsl: ColorHSLNumberConfig): string => {\n const l = hsl.l / 100\n const s = hsl.s\n const a = (s * Math.min(l, 1 - l)) / 100\n const f = (n: number) => {\n const k = (n + hsl.h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0')\n }\n return `#${f(0)}${f(8)}${f(4)}`\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 info = 'info',\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 case DataStateStatus.info:\n return (\n <span className='Layer__data-state__icon Layer__data-state__icon--neutral'>\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 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 { usePagination, DOTS } from '../../hooks/usePagination'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport classnames from 'classnames'\n\nexport interface PaginationProps {\n currentPage: number\n pageSize: number\n onPageChange: (page: number) => void\n totalCount: number\n siblingCount?: number\n}\n\nexport const Pagination = ({\n onPageChange,\n totalCount,\n siblingCount = 1,\n currentPage,\n pageSize,\n}: PaginationProps) => {\n const paginationRange = usePagination({\n currentPage,\n totalCount,\n siblingCount,\n pageSize,\n })\n\n if (!paginationRange) {\n return\n }\n\n if (currentPage === 0 || paginationRange.length < 2) {\n return\n }\n\n let lastPage = paginationRange[paginationRange.length - 1]\n\n return (\n <ul className='Layer__pagination'>\n <li\n key={`page-prev`}\n className={classnames(\n 'Layer__pagination-item Layer__pagination-arrow Layer__pagination-arrow--previous',\n {\n disabled: currentPage === 1,\n },\n )}\n onClick={() => onPageChange(currentPage - 1)}\n >\n <ChevronLeft size={12} />\n </li>\n {paginationRange.map(pageNumber => {\n if (pageNumber === DOTS) {\n return (\n <li\n key={`page-${pageNumber}`}\n className='Layer__pagination-item Layer__pagination-dots'\n >\n &#8230;\n </li>\n )\n }\n\n return (\n <li\n key={`page-${pageNumber}`}\n className={classnames('Layer__pagination-item', {\n selected: pageNumber === currentPage,\n })}\n onClick={() => {\n if (typeof pageNumber === 'number') {\n onPageChange(pageNumber)\n }\n }}\n >\n {pageNumber}\n </li>\n )\n })}\n <li\n key={`page-last`}\n className={classnames(\n 'Layer__pagination-item Layer__pagination-arrow Layer__pagination-arrow--next',\n {\n disabled: currentPage === lastPage,\n },\n )}\n onClick={() => onPageChange(currentPage + 1)}\n >\n <ChevronRight size={12} />\n </li>\n </ul>\n )\n}\n", "import { useMemo } from 'react'\nimport { range } from '../../utils/helpers'\n\nexport const DOTS = '...'\n\nexport interface UsePaginationProps {\n totalCount: number\n pageSize: number\n siblingCount?: number\n currentPage: number\n}\n\nexport type UsePaginationReturn = (string | number)[] | undefined\n\nexport const usePagination = ({\n totalCount,\n pageSize,\n siblingCount = 1,\n currentPage,\n}: UsePaginationProps): UsePaginationReturn => {\n const paginationRange = useMemo(() => {\n const totalPageCount = Math.ceil(totalCount / pageSize)\n const totalPageNumbers = siblingCount + 5\n\n if (totalPageNumbers >= totalPageCount) {\n return range(1, totalPageCount)\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(\n currentPage + siblingCount,\n totalPageCount,\n )\n const shouldShowLeftDots = leftSiblingIndex > 2\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2\n\n const firstPageIndex = 1\n const lastPageIndex = totalPageCount\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n let leftItemCount = 3 + 2 * siblingCount\n let leftRange = range(1, leftItemCount)\n\n return [...leftRange, DOTS, totalPageCount]\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n let rightItemCount = 3 + 2 * siblingCount\n let rightRange = range(\n totalPageCount - rightItemCount + 1,\n totalPageCount,\n )\n return [firstPageIndex, DOTS, ...rightRange]\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n let middleRange = range(leftSiblingIndex, rightSiblingIndex)\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex]\n }\n }, [totalCount, pageSize, siblingCount, currentPage])\n\n return paginationRange\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronLeft = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='18'\n height='18'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n >\n <path\n d='M11.25 13.5L6.75 9L11.25 4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default ChevronLeft\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChavronRight = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='18'\n height='18'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n >\n <path\n d='M6.75 13.5L11.25 9L6.75 4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default ChavronRight\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 from 'react'\nimport { useLinkedAccounts } from '../../hooks/useLinkedAccounts'\nimport PlusIcon from '../../icons/PlusIcon'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { LinkedAccountOptions } from '../LinkedAccountOptions'\nimport { LinkedAccountThumb } from '../LinkedAccountThumb'\nimport { Loader } from '../Loader'\nimport { Heading, HeadingSize, Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nconst COMPONENT_NAME = 'linked-accounts'\n\nexport const LinkedAccounts = ({ asWidget }: { asWidget?: boolean }) => {\n const {\n data,\n isLoading,\n error,\n isValidating,\n refetch,\n addAccount,\n unlinkAccount,\n renewLinkAccount,\n } = useLinkedAccounts()\n\n const linkedAccountOptionsConfig = [\n { name: 'Renew link', action: renewLinkAccount },\n { name: 'Unlink', action: unlinkAccount },\n ]\n\n const linkedAccountsNewAccountClassName = classNames(\n 'Layer__linked-accounts__new-account',\n asWidget && '--as-widget',\n )\n\n return (\n <Container name={COMPONENT_NAME}>\n <Header className='Layer__linked-accounts__header'>\n <Heading\n className='Layer__linked-accounts__title'\n size={HeadingSize.secondary}\n >\n Linked Accounts\n </Heading>\n </Header>\n {isLoading && (\n <div className='Layer__linked-accounts__loader-container'>\n <Loader />\n </div>\n )}\n {error && !isLoading ? (\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 ) : null}\n {!error && !isLoading ? (\n <div className='Layer__linked-accounts__list'>\n {data?.map((account, index) => (\n <LinkedAccountOptions\n key={`linked-acc-${index}`}\n config={linkedAccountOptionsConfig}\n >\n <LinkedAccountThumb account={account} asWidget={asWidget} />\n </LinkedAccountOptions>\n ))}\n <div\n role='button'\n tabIndex={0}\n aria-label='new-account'\n onClick={() => addAccount()}\n className={linkedAccountsNewAccountClassName}\n >\n <div className='Layer__linked-accounts__new-account-label'>\n <PlusIcon size={15} />\n <Text as='span' size={'sm' as TextSize}>\n New account\n </Text>\n </div>\n </div>\n </div>\n ) : null}\n </Container>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { LinkedAccount } from '../../types/linked_accounts'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\nconst MOCK_DATA: LinkedAccount[] = [\n {\n id: '1',\n external_account_name: 'Citi Double Cash\u00AE Card',\n external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: 'Chase',\n institutionLogo: '',\n },\n {\n id: '2',\n external_account_name: 'Citi Double Cash\u00AE Card',\n external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: 'Chase',\n institutionLogo: '',\n },\n {\n id: '3',\n external_account_name: 'Citi Double Cash\u00AE Card',\n external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: 'Chase',\n institutionLogo: '',\n },\n {\n id: '4',\n external_account_name: 'Citi Double Cash\u00AE Card',\n external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: 'Chase',\n institutionLogo: '',\n },\n]\n\ntype UseLinkedAccounts = () => {\n data?: LinkedAccount[]\n isLoading: boolean\n isValidating: boolean\n error: unknown\n refetch: () => void\n addAccount: () => void\n unlinkAccount: () => void\n renewLinkAccount: () => void\n}\n\nexport const useLinkedAccounts: UseLinkedAccounts = () => {\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 && `linked-accounts-${businessId}`,\n Layer.getLinkedAccounts(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const responseData = { data: MOCK_DATA, meta: {}, error: undefined }\n // const isValidating = false\n\n const addAccount = () => {\n console.log('add account...')\n }\n\n const unlinkAccount = () => {\n console.log('unlink account...')\n }\n\n const renewLinkAccount = () => {\n console.log('relink account...')\n }\n\n const refetch = () => {\n console.log('refetch...')\n }\n\n return {\n // data: responseData?.data.external_accounts,\n data: responseData.data,\n isLoading,\n isValidating,\n error: responseError,\n refetch,\n addAccount,\n unlinkAccount,\n renewLinkAccount,\n }\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst PlusIcon = ({ size = 14, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 16 16'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M14.6667 8.49996C14.6667 4.81806 11.6819 1.83329 8.00004 1.83329C4.31814 1.83329 1.33337 4.81806 1.33337 8.49996C1.33337 12.1819 4.31814 15.1666 8.00004 15.1666C11.6819 15.1666 14.6667 12.1819 14.6667 8.49996Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M5.33337 8.5L10.6667 8.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8 11.1666L8 5.83329'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default PlusIcon\n", "import React from 'react'\nimport MoreVertical from '../../icons/MoreVertical'\nimport { HoverMenu, HoverMenuProps } from '../HoverMenu'\n\ninterface LinkedAccountOptionsProps extends HoverMenuProps {}\n\nexport const LinkedAccountOptions = ({\n children,\n config,\n}: LinkedAccountOptionsProps) => {\n return (\n <div className='Layer__linked-accounts__options'>\n <div className='Layer__linked-accounts__options-overlay'>\n <div className='Layer__linked-accounts__options-overlay-button'>\n <HoverMenu config={config}>\n <MoreVertical size={16} />\n </HoverMenu>\n </div>\n </div>\n {children}\n </div>\n )\n}\n", "import React from 'react'\nimport { IconSvgProps } from './types'\n\nconst MoreVertical = ({ size = 18, ...props }: IconSvgProps) => {\n return (\n <svg\n viewBox='0 0 16 14'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M8.66659 8C8.66659 7.63181 8.36811 7.33333 7.99992 7.33333C7.63173 7.33333 7.33325 7.63181 7.33325 8C7.33325 8.36819 7.63173 8.66667 7.99992 8.66667C8.36811 8.66667 8.66659 8.36819 8.66659 8Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8.66659 3.33333C8.66659 2.96514 8.36811 2.66667 7.99992 2.66667C7.63173 2.66667 7.33325 2.96514 7.33325 3.33333C7.33325 3.70152 7.63173 4 7.99992 4C8.36811 4 8.66659 3.70152 8.66659 3.33333Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8.66659 12.6667C8.66659 12.2985 8.36811 12 7.99992 12C7.63173 12 7.33325 12.2985 7.33325 12.6667C7.33325 13.0349 7.63173 13.3333 7.99992 13.3333C8.36811 13.3333 8.66659 13.0349 8.66659 12.6667Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n )\n}\n\nexport default MoreVertical\n", "import React, { ReactNode, useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\n\nexport interface HoverMenuProps {\n children: ReactNode\n config: { name: string; action: () => void }[]\n}\n\nexport const HoverMenu = ({ children, config }: HoverMenuProps) => {\n const [openMenu, setOpenMenu] = useState(false)\n const hoverMenuRef = useRef<HTMLDivElement>(null)\n\n const hoverMenuClassName = classNames(\n 'Layer__hover-menu',\n openMenu && '--open',\n )\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n hoverMenuRef.current &&\n !hoverMenuRef.current.contains(event.target as Node)\n ) {\n setOpenMenu(false)\n }\n }\n\n document.addEventListener('click', handleClickOutside)\n return () => {\n document.removeEventListener('click', handleClickOutside)\n }\n }, [])\n\n return (\n <div\n className={hoverMenuClassName}\n ref={hoverMenuRef}\n onMouseLeave={() => setOpenMenu(false)}\n >\n <div\n className='Layer__hover-menu__children'\n role='button'\n onMouseEnter={() => setOpenMenu(true)}\n onClick={() => setOpenMenu(true)}\n >\n {children}\n </div>\n <div className='Layer__hover-menu__list-wrapper'>\n <ul className='Layer__hover-menu__list'>\n {config &&\n config.length > 0 &&\n config.map(item => (\n <li\n key={`hover-menu-${item.name}`}\n className='Layer__hover-menu__list-item'\n >\n <button\n className='Layer__hover-menu__list-item-button'\n onClick={() => item.action()}\n >\n {item.name}\n </button>\n </li>\n ))}\n </ul>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport InstitutionIcon from '../../icons/InstitutionIcon'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { LinkedAccount } from '../../types/linked_accounts'\nimport { Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nexport interface LinkedAccountThumbProps {\n account: LinkedAccount\n asWidget?: boolean\n}\n\nconst AccountNumber = ({ accountNumber }: { accountNumber: string }) => (\n <div className='account-number'>\n <Text size={'sm' as TextSize}>\u2022\u2022\u2022{accountNumber}</Text>\n </div>\n)\n\nexport const LinkedAccountThumb = ({\n account,\n asWidget,\n}: LinkedAccountThumbProps) => {\n const linkedAccountThumbClassName = classNames(\n 'Layer__linked-account-thumb',\n asWidget && '--as-widget',\n )\n\n return (\n <div className={linkedAccountThumbClassName}>\n <div className='topbar'>\n <div className='topbar-details'>\n <Text as='span' className='account-name'>\n {account.external_account_name}\n </Text>\n {!asWidget && (\n <AccountNumber accountNumber={account.external_account_number} />\n )}\n <Text\n as='span'\n className='account-institution'\n size={'sm' as TextSize}\n >\n {account.institution}\n </Text>\n </div>\n <div className='topbar-logo'>\n {!account.institutionLogo && <InstitutionIcon />}\n </div>\n </div>\n {!asWidget && (\n <div className='middlebar'>\n <Text\n as='span'\n className='account-balance-text'\n size={'sm' as TextSize}\n >\n Bank balance\n </Text>\n <Text as='span' className='account-balance'>\n ${formatMoney(account.latest_balance_timestamp.balance)}\n </Text>\n </div>\n )}\n <div className='bottombar'>\n {asWidget ? (\n <AccountNumber accountNumber={account.external_account_number} />\n ) : (\n <Text\n as='span'\n className='account-balance-text'\n size={'sm' as TextSize}\n >\n General ledger balance\n </Text>\n )}\n <Text as='span' className='account-balance'>\n ${formatMoney(account.current_ledger_balance)}\n </Text>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst InstitutionIcon = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 27 28'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <g filter='url(#filter0_i_2320_122784)'>\n <path\n d='M0 8.50225C0 8.13268 0.20383 7.79324 0.530047 7.61956L13.03 0.964441C13.3238 0.80803 13.6762 0.808029 13.97 0.964441L26.47 7.61956C26.7962 7.79324 27 8.13268 27 8.50225V9.71423C27 10.2665 26.5523 10.7142 26 10.7142H0.999999C0.447715 10.7142 0 10.2665 0 9.71423V8.50225Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter1_i_2320_122784)'>\n <path\n d='M3 13C3 12.4477 3.44772 12 4 12H7C7.55228 12 8 12.4477 8 13V20C8 20.5523 7.55228 21 7 21H4C3.44772 21 3 20.5523 3 20L3 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter2_i_2320_122784)'>\n <path\n d='M11 13C11 12.4477 11.4477 12 12 12H15C15.5523 12 16 12.4477 16 13V20C16 20.5523 15.5523 21 15 21H12C11.4477 21 11 20.5523 11 20L11 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter3_i_2320_122784)'>\n <path\n d='M19 13C19 12.4477 19.4477 12 20 12H23C23.5523 12 24 12.4477 24 13V20C24 20.5523 23.5523 21 23 21H20C19.4477 21 19 20.5523 19 20L19 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter4_i_2320_122784)'>\n <path\n d='M1 23.2856C1 22.7334 1.44772 22.2856 2 22.2856H25C25.5523 22.2856 26 22.7334 26 23.2856V26.2856C26 26.8379 25.5523 27.2856 25 27.2856H2C1.44772 27.2856 1 26.8379 1 26.2856L1 23.2856Z'\n fill='currentColor'\n />\n </g>\n <defs>\n <filter\n id='filter0_i_2320_122784'\n x='0'\n y='0.847168'\n width='27'\n height='9.86707'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter1_i_2320_122784'\n x='3'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter2_i_2320_122784'\n x='11'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter3_i_2320_122784'\n x='19'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter4_i_2320_122784'\n x='1'\n y='22.2856'\n width='25'\n height='5'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n </defs>\n </svg>\n)\n\nexport default InstitutionIcon\n", "import React, { PropsWithChildren, createContext } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ReportingBasis } from '../../types'\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 filteredData: [],\n filteredTotal: undefined,\n isLoading: true,\n isValidating: false,\n error: undefined,\n dateRange: {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n changeDateRange: () => {},\n refetch: () => {},\n sidebarScope: undefined,\n setSidebarScope: () => {},\n sortBy: () => {},\n setFilterTypes: () => {},\n filters: {\n expenses: undefined,\n revenue: undefined,\n },\n})\n\ntype Props = PropsWithChildren & {\n tagFilter?: {\n key: string\n values: string[]\n }\n reportingBasis?: ReportingBasis\n}\n\nconst ProfitAndLoss = ({ children, tagFilter, reportingBasis }: Props) => {\n const contextData = useProfitAndLoss({ tagFilter, reportingBasis })\n return (\n <PNLContext.Provider value={contextData}>\n <div className='Layer__component Layer__profit-and-loss'>{children}</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 { useMemo, useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport {\n ProfitAndLoss,\n DateRange,\n ReportingBasis,\n SortDirection,\n} from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport {\n collectExpensesItems,\n collectRevenueItems,\n applyShare,\n} from '../../utils/profitAndLossUtils'\nimport { useLayerContext } from '../useLayerContext'\nimport { startOfMonth, endOfMonth, formatISO } from 'date-fns'\nimport useSWR from 'swr'\n\nexport type Scope = 'expenses' | 'revenue'\n\nexport type SidebarScope = Scope | undefined\n\ntype Props = {\n startDate?: Date\n endDate?: Date\n tagFilter?: {\n key: string\n values: string[]\n }\n reportingBasis?: ReportingBasis\n}\n\ntype ProfitAndLossFilter = {\n sortBy?: string\n sortDirection?: SortDirection\n types?: string[]\n}\n\nexport type ProfitAndLossFilters = Record<\n Scope,\n ProfitAndLossFilter | undefined\n>\n\ntype UseProfitAndLoss = (props?: Props) => {\n data: ProfitAndLoss | undefined\n filteredData: LineBaseItem[]\n filteredTotal?: number\n isLoading: boolean\n isValidating: boolean\n error: unknown\n dateRange: DateRange\n changeDateRange: (dateRange: Partial<DateRange>) => void\n refetch: () => void\n sidebarScope: SidebarScope\n setSidebarScope: (view: SidebarScope) => void\n filters: ProfitAndLossFilters\n sortBy: (scope: Scope, field: string, direction?: SortDirection) => void\n setFilterTypes: (scope: Scope, types: string[]) => void\n}\n\nexport const useProfitAndLoss: UseProfitAndLoss = (\n {\n startDate: initialStartDate,\n endDate: initialEndDate,\n tagFilter,\n reportingBasis,\n }: 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 const [filters, setFilters] = useState<ProfitAndLossFilters>({\n expenses: undefined,\n revenue: undefined,\n })\n\n const [sidebarScope, setSidebarScope] = useState<SidebarScope>(undefined)\n\n const {\n data: rawData,\n isLoading,\n isValidating,\n error: rawError,\n mutate,\n } = useSWR(\n businessId &&\n startDate &&\n endDate &&\n auth?.access_token &&\n `profit-and-loss-${businessId}-${startDate.valueOf()}-${endDate.valueOf()}-${tagFilter?.key}-${tagFilter?.values?.join(\n ',',\n )}-${reportingBasis}`,\n Layer.getProfitAndLoss(apiUrl, auth?.access_token, {\n params: {\n businessId,\n startDate: formatISO(startDate),\n endDate: formatISO(endDate),\n tagKey: tagFilter?.key,\n tagValues: tagFilter?.values?.join(','),\n reportingBasis,\n },\n }),\n )\n const { data, error } = rawData || {}\n\n const { filteredData, filteredTotal } = useMemo(() => {\n if (!data) {\n return { filteredData: [], filteredTotal: undefined }\n }\n const items =\n sidebarScope === 'revenue'\n ? collectRevenueItems(data)\n : collectExpensesItems(data)\n const filtered = items.map(x => {\n if (\n sidebarScope &&\n filters[sidebarScope]?.types &&\n filters[sidebarScope]!.types!.length > 0 &&\n !filters[sidebarScope]?.types?.includes(x.type)\n ) {\n return {\n ...x,\n hidden: true,\n }\n }\n\n return x\n })\n const sorted = filtered.sort((a, b) => {\n switch (filters[sidebarScope ?? 'expenses']?.sortBy) {\n case 'category':\n if (filters[sidebarScope ?? 'expenses']?.sortDirection === 'asc') {\n return a.display_name.localeCompare(b.display_name)\n }\n return b.display_name.localeCompare(a.display_name)\n\n case 'type':\n if (filters[sidebarScope ?? 'expenses']?.sortDirection === 'asc') {\n return a.type.localeCompare(b.type)\n }\n return b.type.localeCompare(a.type)\n\n default:\n if (filters[sidebarScope ?? 'expenses']?.sortDirection === 'asc') {\n return a.value - b.value\n }\n return b.value - a.value\n }\n })\n const total = sorted\n .filter(x => !x.hidden)\n .reduce((x, { value }) => x + value, 0)\n const withShare = applyShare(sorted, total)\n\n return { filteredData: withShare, filteredTotal: total }\n }, [data, startDate, filters, sidebarScope])\n\n const changeDateRange = ({\n startDate: newStartDate,\n endDate: newEndDate,\n }: Partial<DateRange>) => {\n newStartDate && setStartDate(newStartDate)\n newEndDate && setEndDate(newEndDate)\n }\n\n const refetch = () => {\n mutate()\n }\n\n const sortBy = (scope: Scope, field: string, direction?: SortDirection) => {\n setFilters({\n ...filters,\n [scope]: {\n ...filters[scope],\n sortBy: field,\n sortDirection:\n direction ?? filters[scope]?.sortDirection === 'desc'\n ? 'asc'\n : 'desc',\n },\n })\n }\n\n const setFilterTypes = (scope: Scope, types: string[]) => {\n setFilters({\n ...filters,\n [scope]: {\n ...filters[scope],\n types,\n },\n })\n }\n\n return {\n data,\n filteredData,\n filteredTotal,\n isLoading,\n isValidating,\n error: error || rawError,\n dateRange: { startDate, endDate },\n refetch,\n changeDateRange,\n sidebarScope,\n setSidebarScope,\n sortBy,\n filters,\n setFilterTypes,\n }\n}\n", "import { SidebarScope } from '../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { LineItem, LineBaseItem } from '../types/line_item'\nimport { ProfitAndLoss } from '../types/profit_and_loss'\n\nconst doesLineItemQualifies = (item: LineItem) => {\n return !(\n item.is_contra ||\n item.value === undefined ||\n item.value === null ||\n isNaN(item.value) ||\n item.value === -Infinity ||\n item.value === Infinity ||\n item.value < 0\n )\n}\n\nconst collectSubItems = (type: string, item?: LineItem | null) => {\n if (!item) {\n return []\n }\n\n const items: LineBaseItem[] = []\n\n item?.line_items?.forEach(item => {\n if (doesLineItemQualifies(item)) {\n items.push({\n name: item.name,\n display_name: item.display_name,\n value: item.value || 0,\n type,\n })\n }\n })\n\n return items\n}\n\nexport const collectExpensesItems = (data: ProfitAndLoss) => {\n const cogs = collectSubItems('Cost of Goods Sold', data.cost_of_goods_sold)\n const expenses = collectSubItems('Operating Expenses', data.expenses)\n const taxes = collectSubItems('Taxes & Licenses', data.taxes)\n\n return ([] as LineBaseItem[]).concat(cogs).concat(expenses).concat(taxes)\n}\n\nexport const collectRevenueItems = (data: ProfitAndLoss) => {\n const income = collectSubItems('Income', data.income)\n\n return ([] as LineBaseItem[]).concat(income)\n}\n\nexport const humanizeTitle = (sidebarView: SidebarScope) => {\n switch (sidebarView) {\n case 'expenses':\n return 'Expenses'\n case 'revenue':\n return 'Revenue'\n default:\n return 'Profit & Loss'\n }\n}\n\nexport const applyShare = (\n items: LineBaseItem[],\n total: number,\n): LineBaseItem[] => {\n return items.map(item => {\n if (total === 0) {\n return item\n }\n\n return {\n ...item,\n share: item.value / total,\n }\n })\n}\n", "import React, { useContext, useMemo, useState } from 'react'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { centsToDollars } from '../../models/Money'\nimport { ProfitAndLoss } from '../../types'\nimport { capitalizeFirstLetter } from '../../utils/format'\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 Tooltip,\n TooltipProps,\n Rectangle,\n} from 'recharts'\nimport { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart'\n\nconst barGap = 4\nconst barSize = 20\n\nexport const ProfitAndLossChart = () => {\n const { getColor } = useLayerContext()\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: Math.abs((pnl?.income.value || 0) - (pnl?.net_profit || 0)),\n netProfit: 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 const CustomTooltip = ({\n active,\n payload,\n label,\n }: TooltipProps<number, string>) => {\n if (active && payload && payload.length) {\n const netProfit = payload[0].payload.netProfit ?? 0\n const netProfitClass =\n netProfit > 0 ? 'positive' : netProfit < 0 ? 'negative' : ''\n return (\n <div className='Layer__chart__tooltip'>\n <ul className='Layer__chart__tooltip-list'>\n <li>\n <label className='Layer__chart__tooltip-label'>\n {capitalizeFirstLetter(payload[0].name ?? '')}\n </label>\n <span className='Layer__chart__tooltip-value'>\n ${centsToDollars(Math.abs(payload[0].value ?? 0))}\n </span>\n </li>\n <li>\n <label className='Layer__chart__tooltip-label'>\n {capitalizeFirstLetter(payload[1].name ?? '')}\n </label>\n <span className='Layer__chart__tooltip-value'>\n ${centsToDollars(Math.abs(payload[1].value ?? 0))}\n </span>\n </li>\n <li>\n <label className='Layer__chart__tooltip-label'>Net Profit</label>\n <span className={`Layer__chart__tooltip-value ${netProfitClass}`}>\n ${centsToDollars(netProfit)}\n </span>\n </li>\n </ul>\n </div>\n )\n }\n\n return null\n }\n\n const CustomizedCursor = (props: any) => {\n const { x, width, height } = props\n\n return (\n <Rectangle\n fill={getColor(900)?.hex ?? '#333'}\n stroke='none'\n x={x + width / 2 - 11}\n y={height + 44}\n radius={2}\n width={22}\n height={2}\n className='Layer__chart__tooltip-cursor'\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\n className='Layer__chart-container'\n width='100%'\n height='100%'\n minHeight={200}\n >\n <BarChart\n margin={{ left: 12, right: 12, bottom: 12 }}\n data={data}\n onClick={onClick}\n barGap={barGap}\n className='Layer__profit-and-loss-chart'\n >\n <Tooltip\n wrapperClassName='Layer__chart__tooltip-wrapper'\n content={<CustomTooltip />}\n cursor={<CustomizedCursor />}\n animationDuration={100}\n animationEasing='ease-out'\n />\n <CartesianGrid\n vertical={false}\n stroke={getColor(200)?.hex ?? '#fff'}\n strokeDasharray='5 5'\n />\n <Legend\n verticalAlign='top'\n align='left'\n wrapperStyle={{ top: -24 }}\n payload={[\n {\n value: 'Revenue',\n type: 'circle',\n id: 'IncomeLegend',\n },\n {\n value: 'Expenses',\n type: 'circle',\n id: 'ExpensesLegend',\n },\n ]}\n />\n <XAxis dataKey='name' tickLine={false} />\n <Bar\n dataKey='revenue'\n barSize={barSize}\n isAnimationActive={false}\n radius={[2, 2, 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={[2, 2, 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", "/**\n * Capitalize first letter of the given text.\n */\nexport const capitalizeFirstLetter = (text: string) =>\n text.charAt(0).toUpperCase() + text.slice(1)\n\n/**\n * Convert number into percentage.\n *\n * @example\n * 0.112 -> 11%\n * 0.09843 -> 9.8%\n * 0.00123 -> 0.12%\n */\nexport const formatPercent = (\n value?: number,\n options?: Intl.NumberFormatOptions,\n) => {\n if (!value && value !== 0) {\n return\n }\n\n const val = value * 100\n\n let defaultOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }\n\n if (Math.abs(val) < 10) {\n defaultOptions = {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }\n }\n\n if (Math.abs(val) < 1) {\n defaultOptions = {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }\n }\n\n if (val === 0) {\n defaultOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }\n }\n\n return val.toLocaleString('en-US', {\n ...defaultOptions,\n ...options,\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 { x: animateTo = 0, width = 0 } =\n 'x' in viewBox ? viewBox : emptyViewBox\n const margin = width > 12 ? 4 : 1\n const boxWidth = width * 2 + margin\n const multiplier = width > 12 ? 1.2 : 1\n const xOffset = (boxWidth * multiplier - boxWidth) / 2\n const borderRadius = width > 16 ? 8 : width / 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 rx={borderRadius}\n ry={borderRadius}\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: 22,\n height: 'calc(100% - 38px)',\n }}\n />\n )\n}\n", "import React, { useContext, useState, useEffect } from 'react'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { add, endOfMonth, format, startOfMonth } from 'date-fns'\n\nexport const ProfitAndLossDatePicker = () => {\n const { changeDateRange, dateRange } = useContext(ProfitAndLoss.Context)\n const [isAnimating, setIsAnimating] = useState(false)\n\n const [localDate, setLocalDate] = useState(dateRange.startDate)\n const [nextOpacity, setNextOpacity] = useState(0) \n const [currentOpacity, setCurrentOpacity] = useState(1) \n\n const [transformStyle, setTransformStyle] = useState({\n transform: 'translateX(33%)',\n transition: 'ease',\n })\n\n useEffect(() => {\n if (dateRange.startDate !== localDate && !isAnimating) {\n setLocalDate(dateRange.startDate)\n setTransformStyle({ transform: 'translateX(33%)', transition: 'none' })\n }\n }, [dateRange.startDate, localDate, isAnimating])\n\n const change = (monthsToAdd: number) => {\n if (isAnimating) return\n setIsAnimating(true)\n setNextOpacity(1) \n\n const newDate = add(localDate, { months: monthsToAdd })\n if (monthsToAdd === -1) {\n setCurrentOpacity(0) \n }\n\n changeDateRange({\n startDate: startOfMonth(newDate),\n endDate: endOfMonth(newDate),\n })\n\n const translateXValue = monthsToAdd > 0 ? '0%' : '66%'\n setTransformStyle({\n transform: `translateX(${translateXValue})`,\n transition: 'transform 0.4s ease',\n })\n\n setTimeout(() => {\n setCurrentOpacity(1)\n }, 300)\n\n setTimeout(() => {\n setLocalDate(newDate)\n setTransformStyle({ transform: 'translateX(33%)', transition: 'none' })\n setIsAnimating(false)\n setNextOpacity(0) \n setCurrentOpacity(1)\n }, 300)\n }\n\n const currentLabel = format(localDate, 'LLLL, y')\n const prevLabel = format(add(localDate, { months: -1 }), 'LLLL, y')\n const nextLabel = format(add(localDate, { months: 1 }), 'LLLL, y')\n\n return (\n <div\n className='Layer__profit-and-loss-date-picker'\n >\n <div className='Layer__profit-and-loss-date-picker__labels-container' style={transformStyle}>\n <span className='Layer__profit-and-loss-date-picker__label'>\n {prevLabel}\n </span>\n <span\n className='Layer__profit-and-loss-date-picker__label'\n style={{ opacity: currentOpacity }}\n >\n {currentLabel}\n </span>\n <span\n className='Layer__profit-and-loss-date-picker__label'\n style={{ opacity: nextOpacity }}\n >\n {nextLabel}\n </span>\n </div>\n <button\n aria-label='View Previous Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={() => change(-1)}\n disabled={isAnimating}\n >\n <ChevronLeft\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={16}\n />\n </button>\n <button\n aria-label='View Next Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={() => change(1)}\n disabled={isAnimating}\n >\n <ChevronRight\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={16}\n />\n </button>\n <div className='Layer__profit-and-loss-date-picker__effect-blur'></div>\n </div>\n )\n}\n", "import React, { useContext, useMemo } from 'react'\nimport { Scope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { ProfitAndLoss } from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport {\n collectExpensesItems,\n collectRevenueItems,\n} from '../../utils/profitAndLossUtils'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { SkeletonLoader } from '../SkeletonLoader'\nimport { MiniChart } from './MiniChart'\nimport classNames from 'classnames'\n\ntype Props = {\n revenueLabel?: string\n vertical?: boolean\n}\n\nconst CHART_PLACEHOLDER = [\n {\n name: 'placeholder',\n display_name: 'placeholder',\n value: 1,\n type: 'placeholder',\n share: 1,\n },\n]\n\nconst buildMiniChartData = (scope: Scope, data?: ProfitAndLoss) => {\n if (!data) {\n return CHART_PLACEHOLDER\n }\n\n let items: LineBaseItem[] = []\n\n switch (scope) {\n case 'revenue':\n items = collectRevenueItems(data)\n break\n default:\n items = collectExpensesItems(data)\n }\n\n if (\n !items ||\n items.length === 0 ||\n !items.find(x => Math.abs(x.value) !== 0)\n ) {\n return CHART_PLACEHOLDER\n }\n\n return items.slice()\n}\n\nexport const ProfitAndLossSummaries = ({\n vertical,\n revenueLabel = 'Revenue',\n}: Props) => {\n const {\n data: storedData,\n isLoading,\n setSidebarScope,\n sidebarScope,\n } = useContext(PNL.Context)\n\n const expensesChartData = useMemo(() => {\n return buildMiniChartData('expenses', storedData)\n }, [storedData])\n\n const revenueChartData = useMemo(() => {\n return buildMiniChartData('revenue', storedData)\n }, [storedData])\n\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--positive'\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--positive'\n\n const netProfitDirectionClass =\n data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--positive'\n\n return (\n <div\n className={`Layer__profit-and-loss-summaries ${\n vertical ? 'flex-col' : ''\n }`}\n >\n <div\n className={classNames(\n 'Layer__profit-and-loss-summaries__summary Layer__actionable',\n 'Layer__profit-and-loss-summaries__summary--income',\n sidebarScope === 'revenue' ? 'active' : '',\n )}\n onClick={() => setSidebarScope('revenue')}\n >\n <MiniChart data={revenueChartData} />\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n {revenueLabel}\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${incomeDirectionClass}`}\n >\n {formatMoney(Math.abs(data?.income?.value ?? NaN))}\n </span>\n )}\n </div>\n </div>\n <div\n className={classNames(\n 'Layer__profit-and-loss-summaries__summary Layer__actionable',\n 'Layer__profit-and-loss-summaries__summary--expenses',\n sidebarScope === 'expenses' ? 'active' : '',\n )}\n onClick={() => setSidebarScope('expenses')}\n >\n <MiniChart data={expensesChartData} />\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Expenses\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader className='Layer__profit-and-loss-summaries__loader' />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${expensesDirectionClass}`}\n >\n {formatMoney(\n Math.abs((data.income.value ?? 0) - data.net_profit),\n )}\n </span>\n )}\n </div>\n </div>\n <div className='Layer__profit-and-loss-summaries__summary net-profit Layer__profit-and-loss-summaries__summary--net-profit'>\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Net Profit\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader className='Layer__profit-and-loss-summaries__loader' />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${netProfitDirectionClass}`}\n >\n {formatMoney(Math.abs(data.net_profit))}\n </span>\n )}\n </div>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport classNames from 'classnames'\n\nexport interface SkeletonLoaderProps {\n width?: string\n height?: string\n className?: string\n}\n\nexport const SkeletonLoader = ({\n height,\n width,\n className,\n}: SkeletonLoaderProps) => {\n const baseClassName = classNames(\n 'Layer__skeleton-loader Layer__anim--skeleton-loading',\n className,\n )\n return <div className={baseClassName} style={{ width, height }} />\n}\n", "import React from 'react'\nimport { DEFAULT_CHART_COLORS } from '../../config/charts'\nimport { LineBaseItem } from '../../types/line_item'\nimport { PieChart, Pie, Cell } from 'recharts'\n\nexport interface MiniChartProps {\n data: LineBaseItem[]\n}\n\nexport const MiniChart = ({ data }: MiniChartProps) => {\n return (\n <PieChart width={48} height={48} className='mini-chart'>\n <Pie\n data={data}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={10}\n outerRadius={16}\n paddingAngle={0.2}\n fill='#8884d8'\n width={24}\n height={24}\n animationDuration={250}\n animationEasing='ease-in-out'\n >\n {data.map((entry, index) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[index % DEFAULT_CHART_COLORS.length]\n\n return (\n <Cell\n key={`cell-${index}`}\n className={`Layer__profit-and-loss-detailed-charts__pie`}\n fill={\n entry.name === 'placeholder' ? '#e6e6e6' : colorConfig.color\n }\n opacity={colorConfig.opacity}\n />\n )\n })}\n </Pie>\n </PieChart>\n )\n}\n", "export const INACTIVE_OPACITY_LEVELS = [\n 0.85, 0.7, 0.66, 0.55, 0.4, 0.33, 0.25, 0.15,\n]\n\nexport const DEFAULT_CHART_COLORS = [\n {\n color: '#7417B3',\n opacity: 1,\n },\n {\n color: '#7417B3',\n opacity: 0.8,\n },\n {\n color: '#7417B3',\n opacity: 0.6,\n },\n {\n color: '#7417B3',\n opacity: 0.4,\n },\n {\n color: '#7417B3',\n opacity: 0.2,\n },\n {\n color: '#7417B3',\n opacity: 0.1,\n },\n {\n color: '#006A80',\n opacity: 1,\n },\n {\n color: '#006A80',\n opacity: 0.8,\n },\n {\n color: '#006A80',\n opacity: 0.6,\n },\n {\n color: '#006A80',\n opacity: 0.4,\n },\n {\n color: '#006A80',\n opacity: 0.2,\n },\n {\n color: '#006A80',\n opacity: 0.1,\n },\n {\n color: '#009930',\n opacity: 1,\n },\n {\n color: '#009930',\n opacity: 0.8,\n },\n {\n color: '#009930',\n opacity: 0.6,\n },\n {\n color: '#009930',\n opacity: 0.4,\n },\n {\n color: '#009930',\n opacity: 0.2,\n },\n {\n color: '#009930',\n opacity: 0.1,\n },\n]\n", "import React, { useContext } from 'react'\nimport { Direction } from '../../types'\nimport { Loader } from '../Loader'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossRow } from '../ProfitAndLossRow'\nimport emptyPNL from './empty_profit_and_loss_report'\n\ntype Props = {\n lockExpanded?: boolean\n}\n\nexport const ProfitAndLossTable = ({ lockExpanded }: Props) => {\n const {\n data: actualData,\n isLoading,\n setSidebarScope,\n } = useContext(ProfitAndLoss.Context)\n const data = !actualData || isLoading ? emptyPNL : actualData\n\n if (isLoading || actualData === undefined) {\n return (\n <div className='Layer__profit-and-loss-table__loader-container'>\n <Loader />\n </div>\n )\n }\n\n return (\n <>\n <div className='Layer__profit-and-loss-table Layer__profit-and-loss-table--main'>\n <ProfitAndLossRow\n lineItem={data.income}\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.cost_of_goods_sold}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.gross_profit,\n display_name: 'Gross Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.expenses}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\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 lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.taxes}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.net_profit,\n display_name: 'Net Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n />\n </div>\n {data.other_outflows || data.personal_expenses ? (\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 lockExpanded={lockExpanded}\n />\n <ProfitAndLossRow\n lineItem={data.personal_expenses}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n />\n </div>\n ) : null}\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport { SidebarScope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport PieChart from '../../icons/PieChart'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LineItem } from '../../types'\nimport { Text } from '../Typography'\n\ntype Props = {\n variant?: string\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n direction?: Direction\n scope?: SidebarScope\n setSidebarScope?: (name: SidebarScope) => void\n\n /* This removes the expand toggle and leaves everything in the expanded state */\n lockExpanded?: boolean\n}\n\nexport const ProfitAndLossRow = ({\n variant,\n lineItem,\n depth = 0,\n maxDepth = 1,\n direction = Direction.DEBIT,\n lockExpanded = false,\n scope,\n setSidebarScope,\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\n className={labelClasses.join(' ')}\n onClick={() => !lockExpanded && toggleExpanded()}\n >\n <span className='Layer__profit-and-loss-row__label__title'>\n {!lockExpanded && variant !== 'summation' ? (\n <ChevronDownFill\n size={16}\n className='Layer__profit-and-loss-row__label__chevron'\n />\n ) : null}\n <Text>{display_name}</Text>\n </span>\n {setSidebarScope && (\n <span\n className='Layer__profit-and-loss-row__detailed-chart-btn'\n onClick={e => {\n e.stopPropagation()\n setSidebarScope && setSidebarScope(scope ?? 'expenses')\n }}\n >\n <PieChart />\n </span>\n )}\n </div>\n <div className={valueClasses.join(' ')}>\n <Text>{amountString}</Text>\n </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__profit-and-loss-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 </div>\n </div>\n )}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst PieChart = ({ size = 12, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 12 12'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <g>\n <path\n d='M10.2213 7.78271C9.92969 8.47226 9.47363 9.07989 8.89297 9.55247C8.3123 10.0251 7.62471 10.3482 6.89031 10.4936C6.1559 10.6391 5.39705 10.6024 4.68009 10.3869C3.96313 10.1713 3.30989 9.78337 2.77749 9.25701C2.24509 8.73065 1.84973 8.08189 1.62598 7.36744C1.40223 6.65298 1.3569 5.8946 1.49396 5.15858C1.63102 4.42257 1.94629 3.73133 2.41221 3.14531C2.87813 2.55928 3.48051 2.09631 4.16669 1.79688'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5833 6.00033C10.5833 5.39843 10.4648 4.80244 10.2344 4.24636C10.0041 3.69028 9.66651 3.18502 9.24091 2.75942C8.8153 2.33382 8.31004 1.99621 7.75397 1.76588C7.19789 1.53554 6.60189 1.41699 6 1.41699V6.00033H10.5833Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </g>\n </svg>\n)\n\nexport default PieChart\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, { useContext } from 'react'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossDetailedCharts } from '../ProfitAndLossDetailedCharts'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'profit-and-loss'\n\nexport interface ProfitAndLossViewProps {\n hideTable?: boolean\n hideChart?: boolean\n showDetailedCharts?: boolean\n}\n\nexport const ProfitAndLossView = (props: ProfitAndLossViewProps) => {\n return (\n <Container name={COMPONENT_NAME}>\n <ProfitAndLoss>\n <div className={`Layer__${COMPONENT_NAME}__main-panel`}>\n <Header className={`Layer__${COMPONENT_NAME}__header`}>\n <Heading className='Layer__bank-transactions__title'>\n Profit & Loss\n </Heading>\n </Header>\n\n <Components {...props} />\n </div>\n\n {props.showDetailedCharts !== false && <ProfitAndLossDetailedCharts />}\n </ProfitAndLoss>\n </Container>\n )\n}\n\nconst Components = ({\n hideChart = false,\n hideTable = false,\n}: ProfitAndLossViewProps) => {\n const { error, isLoading, isValidating, refetch } = useContext(\n ProfitAndLoss.Context,\n )\n\n if (!isLoading && error) {\n return (\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 )\n }\n\n return (\n <>\n {!hideChart && (\n <div className={`Layer__${COMPONENT_NAME}__chart_with_summaries`}>\n <div\n className={`Layer__${COMPONENT_NAME}__chart_with_summaries__summary-col`}\n >\n <ProfitAndLoss.DatePicker />\n <ProfitAndLoss.Summaries vertical={true} />\n </div>\n <div\n className={`Layer__${COMPONENT_NAME}__chart_with_summaries__chart-col`}\n >\n <ProfitAndLoss.Chart />\n </div>\n </div>\n )}\n {!hideTable && <ProfitAndLoss.Table />}\n </>\n )\n}\n", "import React, { useContext, useState } from 'react'\nimport XIcon from '../../icons/X'\nimport { humanizeTitle } from '../../utils/profitAndLossUtils'\nimport { Button, BackButton, ButtonVariant } from '../Button'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { DetailedChart } from './DetailedChart'\nimport { DetailedTable } from './DetailedTable'\nimport { Filters } from './Filters'\nimport classNames from 'classnames'\nimport { format } from 'date-fns'\n\nexport const ProfitAndLossDetailedCharts = () => {\n const {\n filteredData,\n filteredTotal,\n sortBy,\n filters,\n isLoading,\n dateRange,\n sidebarScope,\n setSidebarScope,\n setFilterTypes,\n } = useContext(PNL.Context)\n\n const [hoveredItem, setHoveredItem] = useState<string | undefined>()\n\n return (\n <div\n className={classNames(\n 'Layer__profit-and-loss__side-panel',\n sidebarScope && 'open',\n )}\n >\n <div className='Layer__profit-and-loss-detailed-charts'>\n <header className='Layer__profit-and-loss-detailed-charts__header'>\n <div className='Layer__profit-and-loss-detailed-charts__head'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {humanizeTitle(sidebarScope)}\n </Text>\n <Text size={TextSize.sm} className='date'>\n {format(dateRange.startDate, 'LLLL, y')}\n </Text>\n <ProfitAndLossDatePicker />\n </div>\n <Button\n rightIcon={<XIcon />}\n iconOnly={true}\n onClick={() => setSidebarScope(undefined)}\n variant={ButtonVariant.secondary}\n />\n </header>\n\n <header className='Layer__profit-and-loss-detailed-charts__header--tablet'>\n <BackButton onClick={() => setSidebarScope(undefined)} />\n </header>\n\n <div className='Layer__profit-and-loss-detailed-charts__content'>\n <DetailedChart\n filteredData={filteredData}\n filteredTotal={filteredTotal}\n hoveredItem={hoveredItem}\n setHoveredItem={setHoveredItem}\n sidebarScope={sidebarScope}\n date={dateRange.startDate}\n />\n\n <div className='Layer__profit-and-loss-detailed-charts__table-wrapper'>\n <Filters\n filteredData={filteredData}\n sidebarScope={sidebarScope}\n filters={filters}\n setFilterTypes={setFilterTypes}\n />\n\n <DetailedTable\n filteredData={filteredData}\n sidebarScope={sidebarScope}\n filters={filters}\n sortBy={sortBy}\n hoveredItem={hoveredItem}\n setHoveredItem={setHoveredItem}\n />\n </div>\n </div>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst X = ({ 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='M13.5 4.5L4.5 13.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M4.5 4.5L13.5 13.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default X\n", "import React, { useMemo } from 'react'\nimport {\n INACTIVE_OPACITY_LEVELS,\n DEFAULT_CHART_COLORS,\n} from '../../config/charts'\nimport { SidebarScope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { LineBaseItem } from '../../types/line_item'\nimport { formatPercent } from '../../utils/format'\nimport { humanizeTitle } from '../../utils/profitAndLossUtils'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { format } from 'date-fns'\nimport {\n PieChart,\n Pie,\n Cell,\n ResponsiveContainer,\n Label,\n Text as ChartText,\n} from 'recharts'\nimport { PolarViewBox } from 'recharts/types/util/types'\n\ninterface DetailedChartProps {\n filteredData: LineBaseItem[]\n filteredTotal?: number\n hoveredItem?: string\n setHoveredItem: (name?: string) => void\n sidebarScope?: SidebarScope\n date: number | Date\n}\n\nexport const DetailedChart = ({\n filteredData,\n filteredTotal,\n hoveredItem,\n setHoveredItem,\n sidebarScope,\n date,\n}: DetailedChartProps) => {\n const chartData = useMemo(() => {\n if (!filteredData) {\n return []\n }\n return filteredData.map(x => {\n if (x.hidden) {\n return {\n name: x.display_name,\n value: 0,\n }\n }\n return {\n name: x.display_name,\n value: x.value,\n }\n })\n }, [filteredData])\n\n return (\n <div className='chart-field'>\n <div className='header--tablet'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {humanizeTitle(sidebarScope)}\n </Text>\n\n <ProfitAndLossDatePicker />\n </div>\n\n <div className='chart-container'>\n <ResponsiveContainer>\n <PieChart>\n <Pie\n data={chartData}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={105}\n outerRadius={120}\n paddingAngle={0.5}\n fill='#8884d8'\n animationDuration={200}\n animationEasing='ease-in-out'\n >\n {chartData.map((entry, index) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[index % DEFAULT_CHART_COLORS.length]\n let fill: string | undefined = colorConfig.color\n let opacity = colorConfig.opacity\n let active = true\n if (hoveredItem && entry.name !== hoveredItem) {\n active = false\n fill = undefined\n opacity =\n INACTIVE_OPACITY_LEVELS[\n index % INACTIVE_OPACITY_LEVELS.length\n ]\n }\n\n return (\n <Cell\n key={`cell-${index}`}\n className={`Layer__profit-and-loss-detailed-charts__pie ${\n hoveredItem && active ? 'active' : 'inactive'\n }`}\n style={{ fill }}\n opacity={opacity}\n onMouseEnter={() => setHoveredItem(entry.name)}\n onMouseLeave={() => setHoveredItem(undefined)}\n />\n )\n })}\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) - 15,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let text = 'Total'\n\n if (hoveredItem) {\n text = hoveredItem\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__title'\n >\n {text}\n </ChartText>\n )\n }}\n />\n\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) + 5,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let value = filteredTotal\n if (hoveredItem) {\n value = filteredData.find(\n x => x.display_name === hoveredItem,\n )?.value\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__value'\n >\n {`$${formatMoney(value)}`}\n </ChartText>\n )\n }}\n />\n\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) + 25,\n height: 20,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n if (hoveredItem) {\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__share'\n >\n {`${formatPercent(\n filteredData.find(x => x.display_name === hoveredItem)\n ?.share,\n )}%`}\n </ChartText>\n )\n }\n\n return\n }}\n />\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport { DEFAULT_CHART_COLORS } from '../../config/charts'\nimport {\n Scope,\n SidebarScope,\n ProfitAndLossFilters,\n} from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport SortArrows from '../../icons/SortArrows'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { SortDirection } from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport { formatPercent } from '../../utils/format'\nimport classNames from 'classnames'\n\nexport interface DetailedTableProps {\n filteredData: LineBaseItem[]\n hoveredItem?: string\n setHoveredItem: (name?: string) => void\n sidebarScope: SidebarScope\n filters: ProfitAndLossFilters\n sortBy: (scope: Scope, field: string, direction?: SortDirection) => void\n}\n\nexport const DetailedTable = ({\n filteredData,\n sidebarScope,\n filters,\n sortBy,\n hoveredItem,\n setHoveredItem,\n}: DetailedTableProps) => {\n const buildColClass = (column: string) => {\n return classNames(\n 'Layer__sortable-col',\n sidebarScope && filters[sidebarScope]?.sortBy === column\n ? `sort--${\n (sidebarScope && filters[sidebarScope]?.sortDirection) ?? 'desc'\n }`\n : '',\n )\n }\n\n return (\n <div className='details-container'>\n <div className='table'>\n <table>\n <thead>\n <tr>\n <th\n className={buildColClass('category')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'category')}\n >\n Expense/Sale <SortArrows className='Layer__sort-arrows' />\n </th>\n <th\n className={buildColClass('type')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'type')}\n >\n Type <SortArrows className='Layer__sort-arrows' />\n </th>\n <th></th>\n <th\n className={buildColClass('value')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'value')}\n >\n Value <SortArrows className='Layer__sort-arrows' />\n </th>\n </tr>\n </thead>\n <tbody>\n {filteredData\n .filter(x => !x.hidden)\n .map((item, idx) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[idx % DEFAULT_CHART_COLORS.length]\n return (\n <tr\n key={`pl-side-table-item-${idx}`}\n className={classNames(\n 'Layer__profit-and-loss-detailed-table__row',\n hoveredItem && hoveredItem === item.display_name\n ? 'active'\n : '',\n )}\n onMouseEnter={() => setHoveredItem(item.display_name)}\n onMouseLeave={() => setHoveredItem(undefined)}\n >\n <td className='category-col'>{item.display_name}</td>\n <td className='type-col'>{item.type}</td>\n <td className='value-col'>${formatMoney(item.value)}</td>\n <td className='share-col'>\n <span className='share-cell-content'>\n {formatPercent(item.share)}%\n <div\n className='share-icon'\n style={{\n background: colorConfig.color,\n opacity: colorConfig.opacity,\n }}\n />\n </span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst SortArrows = ({ size = 13, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 12 13'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <g clip-path='url(#clip0_1758_75388)'>\n <path\n d='M1.33325 8.5L3.99992 11.1667L6.66659 8.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='desc-arrow'\n />\n <path\n d='M4 2.5L4 11.1667'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='desc-arrow'\n />\n <path\n d='M5.99988 5.16602L8.66654 2.49935L11.3332 5.16602'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='asc-arrow'\n />\n <path\n d='M8.66663 11.166L8.66663 2.49935'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='asc-arrow'\n />\n </g>\n <defs>\n <clipPath id='clip0_1758_75388'>\n <rect\n width='12'\n height='12'\n fill='white'\n transform='translate(0 0.5)'\n />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SortArrows\n", "import React from 'react'\nimport Select, { components } from 'react-select'\nimport {\n Scope,\n SidebarScope,\n ProfitAndLossFilters,\n} from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { LineBaseItem } from '../../types/line_item'\nimport { CategoryOption } from '../CategorySelect/CategorySelect'\nimport { Text, TextSize } from '../Typography'\n\nexport interface FiltersProps {\n filteredData: LineBaseItem[]\n sidebarScope: SidebarScope\n filters: ProfitAndLossFilters\n setFilterTypes: (scope: Scope, types: string[]) => void\n}\n\nexport const Filters = ({\n filteredData,\n sidebarScope,\n filters,\n setFilterTypes,\n}: FiltersProps) => {\n return (\n <div className='filters'>\n <Text size={TextSize.sm} className='Layer__label'>\n Filters\n </Text>\n <Select\n className='Layer__select type-select'\n classNamePrefix='Layer__select'\n value={\n sidebarScope && filters[sidebarScope]?.types\n ? sidebarScope &&\n filters[sidebarScope]?.types?.map(x => ({\n value: x,\n label: x,\n }))\n : []\n }\n isMulti\n isClearable={false}\n options={\n [...new Set(filteredData?.map(x => x.type))].map(x => ({\n label: x,\n value: x,\n })) as unknown as readonly { value: string; label: string }[]\n }\n onChange={selected => {\n setFilterTypes(\n sidebarScope ?? 'expenses',\n selected.map(x => x.value),\n )\n }}\n components={{\n DropdownIndicator: props => (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n ),\n Placeholder: props => (\n <components.Placeholder {...props}>\n <div className='Layer__select__multi-all-placeholder-badge'>\n All\n </div>\n </components.Placeholder>\n ),\n }}\n />\n </div>\n )\n}\n", "import React, { createContext, useContext } from 'react'\nimport { useLedgerAccounts } from '../../hooks/useLedgerAccounts'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { AccountsReceivable } from '../AccountsReceivable'\nimport { Button, ButtonVariant } from '../Button'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { LedgerAccountsRow } from '../LedgerAccountsRow'\nimport { LedgerAccountsSidebar } from '../LedgerAccountsSidebar'\nimport { Loader } from '../Loader'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'ledger-accounts'\n\nexport type LedgerAccountsContextType = ReturnType<typeof useLedgerAccounts>\nexport const LedgerAccountsContext = createContext<LedgerAccountsContextType>({\n data: undefined,\n isLoading: false,\n isValidating: false,\n error: undefined,\n refetch: () => {},\n create: () => {},\n form: undefined,\n sendingForm: false,\n apiError: undefined,\n addAccount: () => {},\n editAccount: () => {},\n cancelForm: () => {},\n changeFormData: () => {},\n submitForm: () => {},\n showARForAccountId: undefined,\n setShowARForAccountId: () => {},\n})\n\nexport const LedgerAccounts = () => {\n const contextData = useLedgerAccounts()\n return (\n <LedgerAccountsContext.Provider value={contextData}>\n <LedgerAccountsContent />\n </LedgerAccountsContext.Provider>\n )\n}\n\nconst LedgerAccountsContent = () => {\n const { data, isLoading, addAccount, error, isValidating, refetch } =\n useContext(LedgerAccountsContext)\n\n let cumulativeIndex = 0\n\n const accountsLength = data?.accounts.length ?? 0\n\n return (\n <Container name={COMPONENT_NAME}>\n <div className={`Layer__${COMPONENT_NAME}__main-panel`}>\n <Header className={`Layer__${COMPONENT_NAME}__header`}>\n <Heading className={`Layer__${COMPONENT_NAME}__title`}>\n Chart of Accounts\n </Heading>\n <div className={`Layer__${COMPONENT_NAME}__actions`}>\n <Button\n variant={ButtonVariant.secondary}\n disabled={isLoading}\n rightIcon={<DownloadCloud size={12} />}\n >\n Download\n </Button>\n <Button onClick={() => addAccount()} disabled={isLoading}>\n Add Account\n </Button>\n </div>\n </Header>\n\n <table className={`Layer__${COMPONENT_NAME}__table`}>\n <thead>\n <tr className='Layer__table-row--header'>\n <th className='Layer__table-header Layer__coa__name'>Name</th>\n <th className='Layer__table-header Layer__coa__type'>Type</th>\n <th className='Layer__table-header Layer__coa__subtype'>\n Sub-Type\n </th>\n <th className='Layer__table-header Layer__coa__balance'>\n Balance\n </th>\n <th className='Layer__table-header Layer__coa__actions' />\n </tr>\n </thead>\n\n <tbody>\n {!error &&\n data?.accounts.map((account, idx) => {\n const currentCumulativeIndex = cumulativeIndex\n cumulativeIndex =\n (account.sub_accounts?.length || 0) + cumulativeIndex + 1\n\n return (\n <LedgerAccountsRow\n key={account.id}\n account={account}\n depth={0}\n index={idx}\n cumulativeIndex={currentCumulativeIndex}\n expanded={true}\n defaultOpen={true}\n acountsLength={accountsLength}\n />\n )\n })}\n </tbody>\n </table>\n\n {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 || isLoading}\n />\n </div>\n ) : null}\n\n {(!data || isLoading) && !error ? (\n <div className={`Layer__${COMPONENT_NAME}__loader-container`}>\n <Loader />\n </div>\n ) : null}\n\n {!isLoading && !error && data?.accounts.length === 0 ? (\n <div className='Layer__table-state-container'>\n <DataState\n status={DataStateStatus.info}\n title='Accounts were not found'\n description='New account can be created with \"Add Account\".'\n onRefresh={() => refetch()}\n isLoading={isValidating}\n />\n </div>\n ) : null}\n </div>\n <LedgerAccountsSidebar />\n\n <AccountsReceivable />\n </Container>\n )\n}\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { Account, Direction, LedgerAccounts, NewAccount } from '../../types'\nimport { BaseSelectOption } from '../../types/general'\nimport { convertToStableName } from '../../utils/helpers'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ninterface FormError {\n field: string\n message: string\n}\n\nconst validate = (formData?: LedgerAccountsForm) => {\n const errors: FormError[] = []\n\n const nameError = validateName(formData)\n if (nameError) {\n errors.push(nameError)\n }\n\n return errors\n}\n\nconst revalidateField = (fieldName: string, formData?: LedgerAccountsForm) => {\n switch (fieldName) {\n case 'name':\n const nameError = validateName(formData)\n if (nameError) {\n return (formData?.errors || [])\n .filter(x => x.field !== fieldName)\n .concat([nameError])\n }\n\n return (formData?.errors || []).filter(x => x.field !== fieldName)\n default:\n return formData?.errors\n }\n}\n\nconst validateName = (formData?: LedgerAccountsForm) => {\n if (!formData?.data.name?.trim()) {\n return {\n field: 'name',\n message: 'Cannot be blank',\n }\n }\n\n return\n}\n\nexport interface LedgerAccountsForm {\n action: 'new' | 'edit'\n accountId?: string\n data: {\n parent?: BaseSelectOption\n name?: string\n type?: BaseSelectOption\n subType?: BaseSelectOption\n category?: BaseSelectOption\n }\n errors?: FormError[]\n}\n\ntype UseLedgerAccounts = () => {\n data: LedgerAccounts | undefined\n isLoading?: boolean\n isValidating?: boolean\n error?: unknown\n refetch: () => void\n create: (newAccount: NewAccount) => void\n form?: LedgerAccountsForm\n sendingForm?: boolean\n apiError?: string\n addAccount: () => void\n editAccount: (id: string) => void\n cancelForm: () => void\n changeFormData: (\n name: string,\n value: string | BaseSelectOption | undefined,\n ) => void\n submitForm: () => void\n showARForAccountId?: string\n setShowARForAccountId: (id?: string) => void\n}\n\nexport const flattenAccounts = (accounts: Account[]): Account[] =>\n accounts\n .flatMap(a => [a, flattenAccounts(a.sub_accounts || [])])\n .flat()\n .filter(id => id)\n\nexport const useLedgerAccounts: UseLedgerAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const [form, setForm] = useState<LedgerAccountsForm | undefined>()\n const [sendingForm, setSendingForm] = useState(false)\n const [apiError, setApiError] = useState<string | undefined>(undefined)\n const [showARForAccountId, setShowARForAccountId] = useState<\n string | undefined\n >()\n\n const { data, isLoading, isValidating, error, mutate } = useSWR(\n businessId && auth?.access_token && `ledger-accounts-${businessId}`,\n Layer.getLedgerAccounts(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n const create = async (newAccount: NewAccount) => {\n setSendingForm(true)\n setApiError(undefined)\n\n try {\n await Layer.createAccount(apiUrl, auth?.access_token, {\n params: { businessId },\n body: newAccount,\n })\n await refetch()\n setForm(undefined)\n } catch (_err) {\n setApiError('Submit failed. Please, check your connection and try again.')\n } finally {\n setSendingForm(false)\n }\n }\n\n const update = async (accountData: NewAccount, accountId: string) => {\n setSendingForm(true)\n setApiError(undefined)\n\n const stable_name = convertToStableName(accountData.name)\n\n /** @TODO some fields will be deprecated soon */\n const newAccountData = {\n ...accountData,\n stable_name: stable_name,\n pnl_category: 'INCOME', //this field will be deprecated soon, but is still required\n always_show_in_pnl: false, //this field will be deprecated soon, but is still required\n }\n\n try {\n await Layer.updateAccount(apiUrl, auth?.access_token, {\n params: { businessId, accountId },\n body: newAccountData,\n })\n await refetch()\n setForm(undefined)\n } catch (_err) {\n setApiError('Submit failed. Please, check your connection and try again.')\n } finally {\n setSendingForm(false)\n }\n }\n\n const submitForm = () => {\n if (!form || !form.action) {\n return\n }\n\n const errors = validate(form)\n\n if (errors.length > 0) {\n setForm({\n ...form,\n errors,\n })\n\n return\n }\n\n const data = {\n name: form.data.name || 'Test name',\n normality: form.data.subType?.value as Direction,\n parent_id: form.data.parent\n ? {\n type: 'AccountId' as 'AccountId',\n id: form.data.parent.value as string,\n }\n : undefined,\n description: form.data.type?.value.toString() || 'Test description',\n }\n\n if (form.action === 'new') {\n create(data)\n return\n }\n\n if (form.action === 'edit' && form.accountId) {\n update(data, form.accountId)\n return\n }\n }\n\n const addAccount = () =>\n setForm({\n action: 'new',\n accountId: undefined,\n data: {\n parent: undefined,\n name: undefined,\n type: {\n value: 'assets',\n label: 'Assets',\n },\n subType: undefined,\n category: undefined,\n },\n })\n\n const editAccount = (id: string) => {\n const allAccounts = flattenAccounts(data?.data?.accounts || [])\n const found = allAccounts?.find(x => x.id === id)\n\n if (!found) {\n return\n }\n\n const parent = allAccounts.find(\n x => x.sub_accounts?.find(el => el.id === found.id),\n )\n\n setForm({\n action: 'edit',\n accountId: id,\n data: {\n parent: parent\n ? {\n value: parent.id,\n label: parent.name,\n }\n : undefined,\n name: found.name,\n type: {\n value: 'assets',\n label: 'Assets',\n },\n subType: undefined,\n category: undefined,\n },\n })\n }\n\n const cancelForm = () => setForm(undefined)\n\n const changeFormData = (\n fieldName: string,\n value: string | BaseSelectOption | undefined,\n ) => {\n if (!form) {\n return\n }\n\n const newFormData = {\n ...form,\n data: {\n ...form.data,\n [fieldName]: value,\n },\n }\n\n const errors = revalidateField(fieldName, newFormData)\n\n setForm({\n ...newFormData,\n errors,\n })\n }\n\n const refetch = () => mutate()\n\n return {\n data: data?.data,\n isLoading,\n isValidating,\n error,\n refetch,\n create,\n form,\n sendingForm,\n apiError,\n addAccount,\n editAccount,\n cancelForm,\n changeFormData,\n submitForm,\n showARForAccountId,\n setShowARForAccountId,\n }\n}\n", "import React, { useContext, useMemo } from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { flattenAccounts } from '../../hooks/useLedgerAccounts/useLedgerAccounts'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { centsToDollars } from '../../models/Money'\nimport { Button, BackButton, ButtonVariant } from '../Button'\nimport { LedgerAccountsContext } from '../LedgerAccounts/LedgerAccounts'\nimport { Text, TextWeight } from '../Typography'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport const AccountsReceivable = () => {\n const { data, showARForAccountId, setShowARForAccountId } = useContext(\n LedgerAccountsContext,\n )\n\n const entry = useMemo(() => {\n return flattenAccounts(data?.accounts || []).find(\n x => x.id === showARForAccountId,\n )\n }, [showARForAccountId])\n\n const baseClassName = classNames(\n 'Layer__accounts-receivable__index',\n showARForAccountId && 'open',\n )\n\n const close = () => setShowARForAccountId(undefined)\n\n return (\n <div className={baseClassName}>\n <div className='Layer__accounts-receivable__header'>\n <BackButton onClick={close} />\n <div className='Layer__accounts-receivable__title-container'>\n <Text\n weight={TextWeight.bold}\n className='Layer__accounts-receivable__title'\n >\n {entry?.name || ''}\n </Text>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={<DownloadCloud size={12} />}\n >\n Download\n </Button>\n </div>\n <div className='Layer__accounts-receivable__balance-container'>\n <Text\n weight={TextWeight.bold}\n className='Layer__accounts-receivable__balance-label'\n >\n Current balance\n </Text>\n <Text\n weight={TextWeight.bold}\n className='Layer__accounts-receivable__balance-value'\n >\n ${centsToDollars(entry?.balance || 0)}\n </Text>\n </div>\n </div>\n <table className='Layer__table Layer__accounts-receivable-table'>\n <thead>\n <tr>\n <th className='Layer__table-header'>Date</th>\n <th className='Layer__table-header'>Journal id #</th>\n <th className='Layer__table-header'>Source</th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Debit\n </th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Credit\n </th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Running balance\n </th>\n </tr>\n </thead>\n <tbody>\n {entry?.entries?.map(x => {\n return (\n <tr key={x.id}>\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>\n {x.createdAt &&\n formatTime(parseISO(x.createdAt), DATE_FORMAT)}\n </span>\n </td>\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>#123</span>\n </td>\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>Invoice</span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n <span className='Layer__table-cell-content'>\n {x.direction} $X,XXX.XX\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n <span className='Layer__table-cell-content'>$X,XXX.XX</span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n <span className='Layer__table-cell-content'>$X,XXX.XX</span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n}\n", "import React, { useContext, useEffect, useState } from 'react'\nimport ArrowRightCircle from '../../icons/ArrowRightCircle'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport Edit2 from '../../icons/Edit2'\nimport { centsToDollars } from '../../models/Money'\nimport { Account } from '../../types'\nimport { Button, ButtonVariant } from '../Button'\nimport { LedgerAccountsContext } from '../LedgerAccounts/LedgerAccounts'\nimport classNames from 'classnames'\n\ntype LedgerAccountsRowProps = {\n account: Account\n depth?: number\n index: number\n cumulativeIndex?: number\n expanded: boolean\n acountsLength: number\n defaultOpen?: boolean\n}\n\nconst INDENTATION = 12\n\nconst EXPANDED_STYLE = {\n height: 52,\n paddingTop: 12,\n paddingBottom: 12,\n opacity: 1,\n}\n\nconst COLLAPSED_STYLE = {\n height: 0,\n paddingTop: 0,\n paddingBottom: 0,\n opacity: 0.5,\n}\n\nexport const LedgerAccountsRow = ({\n account,\n depth = 0,\n index,\n cumulativeIndex = 0,\n expanded = false,\n defaultOpen = false,\n acountsLength,\n}: LedgerAccountsRowProps) => {\n const { form, editAccount, setShowARForAccountId } = useContext(\n LedgerAccountsContext,\n )\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const style = expanded\n ? {\n ...EXPANDED_STYLE,\n transitionDelay: `${15 * index}ms`,\n }\n : {\n ...COLLAPSED_STYLE,\n transitionDelay: `${acountsLength - 15 * index}ms`,\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, cumulativeIndex * 50)\n\n return () => clearTimeout(timeoutId)\n }, [])\n\n const baseClass = classNames(\n 'Layer__table-row',\n isOpen ? 'Layer__table-row--expanded' : 'Layer__table-row--collapsed',\n !expanded && 'Layer__table-row--hidden',\n `Layer__table-row--depth-${depth}`,\n form?.accountId === account.id && 'Layer__table-row--active',\n !showComponent && 'Layer__table-row--anim-starting-state',\n )\n\n return (\n <>\n <tr className={baseClass} onClick={() => setIsOpen(!isOpen)}>\n <td className='Layer__table-cell Layer__coa__name'>\n <span className='Layer__table-cell-content' style={style}>\n <span\n className='Layer__table-cell-content-indentation'\n style={{\n paddingLeft: INDENTATION * depth + 16,\n }}\n >\n {account.sub_accounts && account.sub_accounts.length > 0 && (\n <ChevronDownFill\n size={16}\n className='Layer__table__expand-icon'\n />\n )}\n <span className='Layer__coa__name__text'>{account.name}</span>\n </span>\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__type'>\n {/* @TODO what is type and subtype*/}\n <span className='Layer__table-cell-content' style={style}>\n {account.normality}\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__subtype'>\n <span className='Layer__table-cell-content' style={style}>\n Sub-Type\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__balance'>\n <span\n className='Layer__table-cell-content Layer__table-cell--amount'\n style={style}\n >\n ${centsToDollars(Math.abs(account.balance || 0))}\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__actions'>\n <span className='Layer__table-cell-content' style={style}>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={<Edit2 size={12} />}\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n editAccount(account.id)\n }}\n >\n Edit\n </Button>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={<ArrowRightCircle size={12} />}\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n setShowARForAccountId(account.id)\n }}\n >\n Open\n </Button>\n </span>\n </td>\n </tr>\n\n {(account.sub_accounts || []).map((subAccount, idx) => (\n <LedgerAccountsRow\n key={subAccount.id}\n account={subAccount}\n depth={depth + 1}\n index={idx}\n expanded={isOpen && expanded}\n cumulativeIndex={cumulativeIndex + idx + 1}\n acountsLength={(account.sub_accounts ?? []).length}\n />\n ))}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ArrowRightCircle = ({ 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='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 12L12 9L9 6'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M6 9H12'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default ArrowRightCircle\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Edit2 = ({ 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='M12.75 2.25C12.947 2.05301 13.1808 1.89676 13.4382 1.79015C13.6956 1.68355 13.9714 1.62868 14.25 1.62868C14.5286 1.62868 14.8044 1.68355 15.0618 1.79015C15.3192 1.89676 15.553 2.05301 15.75 2.25C15.947 2.44698 16.1032 2.68083 16.2098 2.9382C16.3165 3.19557 16.3713 3.47142 16.3713 3.75C16.3713 4.02857 16.3165 4.30442 16.2098 4.56179C16.1032 4.81916 15.947 5.05302 15.75 5.25L5.625 15.375L1.5 16.5L2.625 12.375L12.75 2.25Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default Edit2\n", "import React, { useContext } from 'react'\nimport { LedgerAccountsContext } from '../LedgerAccounts/LedgerAccounts'\nimport { LedgerAccountsForm } from '../LedgerAccountsForm'\nimport classNames from 'classnames'\n\nexport const LedgerAccountsSidebar = () => {\n const { form } = useContext(LedgerAccountsContext)\n\n return (\n <div\n className={classNames(\n 'Layer__ledger-accounts__sidebar',\n form ? 'open' : '',\n )}\n >\n <div className='Layer__ledger-accounts__sidebar-content'>\n <LedgerAccountsForm />\n </div>\n </div>\n )\n}\n", "import React, { useContext, useMemo } from 'react'\nimport { flattenAccounts } from '../../hooks/useLedgerAccounts/useLedgerAccounts'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction } from '../../types'\nimport { BaseSelectOption } from '../../types/general'\nimport { Button, ButtonVariant, RetryButton, SubmitButton } from '../Button'\nimport { Input, InputGroup, Select } from '../Input'\nimport { LedgerAccountsContext } from '../LedgerAccounts/LedgerAccounts'\nimport { Text, TextSize, TextWeight } from '../Typography'\n\nconst SUB_TYPE_OPTIONS: BaseSelectOption[] = [\n {\n value: Direction.DEBIT,\n label: 'Debit',\n },\n {\n value: Direction.CREDIT,\n label: 'Credit',\n },\n]\n\nexport const LedgerAccountsForm = () => {\n const {\n form,\n data,\n changeFormData,\n cancelForm,\n submitForm,\n sendingForm,\n apiError,\n } = useContext(LedgerAccountsContext)\n\n const parentOptions: BaseSelectOption[] = useMemo(\n () =>\n flattenAccounts(data?.accounts || [])\n .sort((a, b) => (a?.name && b?.name ? a.name.localeCompare(b.name) : 0))\n .map(x => {\n return {\n label: x.name,\n value: x.id,\n }\n }),\n [data?.accounts?.length],\n )\n\n const entry = useMemo(() => {\n if (form?.action === 'edit' && form.accountId) {\n return flattenAccounts(data?.accounts || []).find(\n x => x.id === form.accountId,\n )\n }\n\n return\n }, [data, form?.accountId])\n\n if (!form) {\n return\n }\n\n return (\n <form\n className='Layer__form'\n onSubmit={e => {\n e.preventDefault()\n submitForm()\n }}\n >\n <div className='Layer__ledger-accounts__sidebar__header'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {form?.action === 'edit' ? 'Edit' : 'Add New'} Account\n </Text>\n <div className='actions'>\n <Button\n type='button'\n onClick={cancelForm}\n variant={ButtonVariant.secondary}\n disabled={sendingForm}\n >\n Cancel\n </Button>\n {apiError && (\n <RetryButton\n type='submit'\n processing={sendingForm}\n error={'Check connection and retry in few seconds.'}\n disabled={sendingForm}\n >\n Retry\n </RetryButton>\n )}\n {!apiError && (\n <SubmitButton\n type='submit'\n noIcon={true}\n active={true}\n disabled={sendingForm}\n >\n Save\n </SubmitButton>\n )}\n </div>\n </div>\n\n {apiError && (\n <Text\n size={TextSize.sm}\n className='Layer__ledger-accounts__form__error-message'\n >\n {apiError}\n </Text>\n )}\n\n {entry && (\n <div className='Layer__ledger-accounts__form-edit-entry'>\n <Text weight={TextWeight.bold}>{entry.name}</Text>\n <Text weight={TextWeight.bold}>\n ${centsToDollars(entry.balance || 0)}\n </Text>\n </div>\n )}\n\n <div className='Layer__ledger-accounts__form'>\n <InputGroup name='parent' label='Parent' inline={true}>\n <Select\n options={parentOptions}\n value={form?.data.parent}\n onChange={sel => changeFormData('parent', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n <InputGroup name='name' label='Name' inline={true}>\n <Input\n name='name'\n placeholder='Enter name...'\n value={form?.data.name}\n isInvalid={Boolean(form?.errors?.find(x => x.field === 'name'))}\n errorMessage={form?.errors?.find(x => x.field === 'name')?.message}\n disabled={sendingForm}\n onChange={e =>\n changeFormData('name', (e.target as HTMLInputElement).value)\n }\n />\n </InputGroup>\n <InputGroup name='type' label='Type' inline={true}>\n <Select\n options={[]}\n disabled\n value={form?.data.type}\n onChange={sel => changeFormData('type', sel)}\n />\n </InputGroup>\n <InputGroup name='subType' label='Sub-Type' inline={true}>\n <Select\n options={SUB_TYPE_OPTIONS}\n value={form?.data.subType}\n onChange={sel => changeFormData('subType', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n <InputGroup name='category' label='Category' inline={true}>\n <Select\n options={[]}\n value={form?.data.category}\n onChange={sel => changeFormData('category', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n </div>\n </form>\n )\n}\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 {\n ColorsPaletteOption,\n LayerThemeConfig,\n} from '../../types/layer_context'\nimport { buildColorsPalette } from '../../utils/colors'\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 colors = buildColorsPalette(theme)\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 colors,\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 useSWR(\n businessId && auth?.access_token && `categories-${businessId}`,\n Layer.getCategories(apiUrl, auth?.access_token, { params: { businessId } }),\n {\n ...defaultSWRConfig,\n onSuccess: response => {\n if (response?.data?.categories?.length) {\n dispatch({\n type: Action.setCategories,\n payload: { categories: response.data.categories || [] },\n })\n }\n },\n },\n )\n\n const setTheme = (theme: LayerThemeConfig) =>\n dispatch({\n type: Action.setTheme,\n payload: { theme },\n })\n\n const getColor = (shade: number): ColorsPaletteOption | undefined => {\n if (colors && shade in colors) {\n return colors[shade]\n }\n\n return\n }\n\n return (\n <SWRConfig value={defaultSWRConfig}>\n <LayerContext.Provider value={{ ...state, setTheme, getColor }}>\n {children}\n </LayerContext.Provider>\n </SWRConfig>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_react", "useSWR", "import_react", "React", "import_date_fns", "React", "import_react", "React", "React", "import_react", "React", "import_date_fns", "React", "import_react", "import_swr", "useSWR", "import_react", "import_react", "React", "import_react", "React", "React", "import_react", "import_react", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "React", "import_react", "import_react", "React", "import_react", "React", "TooltipTrigger", "TooltipContent", "import_classnames", "React", "classNames", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_classnames", "classNames", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "import_classnames", "import_date_fns", "React", "classNames", "formatTime", "Select", "import_react", "React", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "import_react", "import_react_select", "DropdownIndicator", "React", "Select", "ReactSelect", "import_react", "import_react", "import_date_fns", "React", "formatTime", "import_classnames", "import_date_fns", "React", "classNames", "formatTime", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "shift", "React", "import_react", "React", "timestamp", "React", "import_classnames", "categorizeBankTransaction", "matchBankTransaction", "index", "height", "React", "classNames", "import_react", "React", "import_classnames", "import_date_fns", "categorizeBankTransaction", "matchBankTransaction", "classNames", "React", "formatTime", "import_react", "import_date_fns", "React", "formatTime", "import_classnames", "import_date_fns", "isCredit", "categorizeBankTransaction", "matchBankTransaction", "classNames", "React", "formatTime", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_react", "Loader", "React", "import_react", "import_react", "React", "React", "import_classnames", "React", "classnames", "React", "Loader", "import_react", "import_swr", "useSWR", "React", "import_react", "import_swr", "useSWR", "React", "import_react", "import_react", "React", "import_react", "import_classnames", "classNames", "React", "React", "import_react", "React", "import_classnames", "React", "classNames", "import_classnames", "COMPONENT_NAME", "classNames", "React", "Loader", "import_react", "import_react", "item", "import_date_fns", "import_swr", "useSWR", "import_react", "import_react", "React", "import_date_fns", "React", "import_react", "import_date_fns", "React", "import_react", "import_react", "import_classnames", "classNames", "React", "import_react", "import_recharts", "React", "import_classnames", "React", "classNames", "import_react", "import_react", "React", "PieChart", "React", "React", "Loader", "import_date_fns", "React", "import_react", "import_react", "React", "import_react", "import_recharts", "React", "ChartText", "import_react", "React", "import_classnames", "classNames", "React", "import_react", "import_react_select", "React", "Select", "import_classnames", "import_date_fns", "React", "classNames", "COMPONENT_NAME", "React", "import_react", "import_react", "import_swr", "useSWR", "data", "import_react", "import_classnames", "import_date_fns", "classNames", "React", "formatTime", "import_react", "React", "React", "import_classnames", "classNames", "React", "import_react", "import_react", "React", "Select", "import_classnames", "React", "classNames", "COMPONENT_NAME", "React", "Loader", "import_react", "import_date_fns", "import_swr", "useSWR", "theme", "React"]
3
+ "sources": ["../src/index.tsx", "../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/linked_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/config/general.ts", "../src/hooks/useBankTransactions/useBankTransactions.tsx", "../src/hooks/useElementSize/useElementSize.ts", "../src/types/categories.ts", "../src/utils/helpers.ts", "../src/components/BankTransactionListItem/BankTransactionListItem.tsx", "../src/icons/ChevronDownFill.tsx", "../src/components/BankTransactionRow/BankTransactionRow.tsx", "../src/icons/AlertCircle.tsx", "../src/icons/Scissors.tsx", "../src/components/Badge/Badge.tsx", "../src/components/Button/Button.tsx", "../src/components/Button/IconButton.tsx", "../src/components/Button/RetryButton.tsx", "../src/icons/RefreshCcw.tsx", "../src/components/Button/SubmitButton.tsx", "../src/icons/CheckCircle.tsx", "../src/icons/Loader.tsx", "../src/icons/Save.tsx", "../src/components/Tooltip/Tooltip.tsx", "../src/components/Tooltip/useTooltip.ts", "../src/components/Button/TextButton.tsx", "../src/components/Button/BackButton.tsx", "../src/icons/BackArrow.tsx", "../src/components/CategorySelect/CategorySelect.tsx", "../src/icons/Check.tsx", "../src/icons/MinimizeTwo.tsx", "../src/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow.tsx", "../src/icons/ScissorsFullOpen.tsx", "../src/icons/Trash.tsx", "../src/components/Input/Input.tsx", "../src/components/Input/InputGroup.tsx", "../src/components/Typography/Text.tsx", "../src/components/Typography/Heading.tsx", "../src/components/Typography/ErrorText.tsx", "../src/components/Input/FileInput.tsx", "../src/icons/UploadCloud.tsx", "../src/components/Input/Select.tsx", "../src/components/MatchForm/MatchForm.tsx", "../src/components/BankTransactionRow/MatchBadge.tsx", "../src/components/Textarea/Textarea.tsx", "../src/components/Toggle/Toggle.tsx", "../src/components/ExpandedBankTransactionRow/APIErrorNotifications.tsx", "../src/icons/AlertOctagon.tsx", "../src/components/BankTransactionRow/SplitTooltipDetails.tsx", "../src/components/BankTransactionListItem/Assignment.tsx", "../src/components/Container/Container.tsx", "../src/config/theme.ts", "../src/utils/colors.ts", "../src/components/Container/Header.tsx", "../src/components/DataState/DataState.tsx", "../src/components/Loader/Loader.tsx", "../src/components/Pagination/Pagination.tsx", "../src/hooks/usePagination/usePagination.ts", "../src/icons/ChevronLeft.tsx", "../src/icons/ChevronRight.tsx", "../src/components/Hello/Hello.tsx", "../src/components/LinkedAccounts/LinkedAccounts.tsx", "../src/hooks/useLinkedAccounts/useLinkedAccounts.ts", "../src/hooks/useLinkedAccounts/mockData.ts", "../src/icons/PlusIcon.tsx", "../src/components/LinkedAccountOptions/LinkedAccountOptions.tsx", "../src/icons/MoreVertical.tsx", "../src/components/HoverMenu/HoverMenu.tsx", "../src/components/LinkedAccountThumb/LinkedAccountThumb.tsx", "../src/icons/InstitutionIcon.tsx", "../src/components/ProfitAndLoss/ProfitAndLoss.tsx", "../src/hooks/useProfitAndLoss/useProfitAndLoss.tsx", "../src/utils/profitAndLossUtils.ts", "../src/components/ProfitAndLossChart/ProfitAndLossChart.tsx", "../src/utils/format.ts", "../src/components/ProfitAndLossChart/Indicator.tsx", "../src/components/ProfitAndLossDatePicker/ProfitAndLossDatePicker.tsx", "../src/components/ProfitAndLossDetailedCharts/ProfitAndLossDetailedCharts.tsx", "../src/icons/X.tsx", "../src/components/ProfitAndLossDetailedCharts/DetailedChart.tsx", "../src/config/charts.ts", "../src/components/ProfitAndLossDetailedCharts/DetailedTable.tsx", "../src/icons/SortArrows.tsx", "../src/components/ProfitAndLossDetailedCharts/Filters.tsx", "../src/components/ProfitAndLossSummaries/ProfitAndLossSummaries.tsx", "../src/components/SkeletonLoader/SkeletonLoader.tsx", "../src/components/ProfitAndLossSummaries/MiniChart.tsx", "../src/components/ProfitAndLossTable/ProfitAndLossTable.tsx", "../src/components/ProfitAndLossRow/ProfitAndLossRow.tsx", "../src/icons/PieChart.tsx", "../src/components/ProfitAndLossTable/empty_profit_and_loss_report.ts", "../src/components/ProfitAndLossView/ProfitAndLossView.tsx", "../src/components/Panel/Panel.tsx", "../src/components/ChartOfAccounts/ChartOfAccounts.tsx", "../src/hooks/useChartOfAccounts/useChartOfAccounts.tsx", "../src/hooks/useLedgerAccounts/useLedgerAccounts.tsx", "../src/components/ChartOfAccountsTable/ChartOfAccountsTable.tsx", "../src/components/ChartOfAccountsRow/ChartOfAccountsRow.tsx", "../src/icons/Edit2.tsx", "../src/components/ChartOfAccountsSidebar/ChartOfAccountsSidebar.tsx", "../src/components/ChartOfAccountsForm/ChartOfAccountsForm.tsx", "../src/components/ChartOfAccountsForm/constants.ts", "../src/components/ChartOfAccountsForm/useParentOptions.ts", "../src/components/LedgerAccount/LedgerAccountIndex.tsx", "../src/components/LedgerAccountEntryDetails/LedgerAccountEntryDetails.tsx", "../src/components/Card/Card.tsx", "../src/components/DateTime/DateTime.tsx", "../src/components/DetailsList/DetailsList.tsx", "../src/components/DetailsList/DetailsListItem.tsx", "../src/components/LedgerAccount/LedgerAccountRow.tsx", "../src/providers/LayerProvider/LayerProvider.tsx", "../src/views/AccountingOverview/AccountingOverview.tsx", "../src/components/View/View.tsx", "../src/components/ViewHeader/ViewHeader.tsx", "../src/views/BankTransactionsWithLinkedAccounts/BankTransactionsWithLinkedAccounts.tsx", "../src/views/Reports/Reports.tsx"],
4
+ "sourcesContent": ["export { BalanceSheet } from './components/BalanceSheet'\nexport { BankTransactions } from './components/BankTransactions'\nexport { Hello } from './components/Hello'\nexport { LinkedAccounts } from './components/LinkedAccounts'\nexport { ProfitAndLoss } from './components/ProfitAndLoss'\nexport { ProfitAndLossView } from './components/ProfitAndLossView'\nexport { ChartOfAccounts } from './components/ChartOfAccounts'\nexport { LayerProvider } from './providers/LayerProvider'\nexport { useLayerContext } from './hooks/useLayerContext'\n\n// Views:\nexport { AccountingOverview } from './views/AccountingOverview'\nexport { BankTransactionsWithLinkedAccounts } from './views/BankTransactionsWithLinkedAccounts'\nexport { Reports } from './views/Reports'\n", "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')\nexport const deleteRequest = request('delete')\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 {\n BankTransactionMatch,\n BankTransactionMatchType,\n} from '../../types/bank_transactions'\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}&limit=200`,\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\nexport const matchBankTransaction = put<\n { data: BankTransactionMatch; errors: unknown },\n { match_id: string; type: BankTransactionMatchType }\n>(\n ({ businessId, bankTransactionId }) =>\n `/v1/businesses/${businessId}/bank-transactions/${bankTransactionId}/match`,\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 {\n Account,\n ChartOfAccounts,\n NewAccount,\n EditAccount,\n LedgerAccounts,\n LedgerAccountsEntry,\n} from '../../types'\nimport { get, post, put } from './authenticated_http'\n\nexport const getChartOfAccounts = get<{ data: ChartOfAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const createAccount = post<{ data: Account }, NewAccount>(\n ({ businessId }) => `/v1/businesses/${businessId}/ledger/accounts`,\n)\n\nexport const updateAccount = put<{ data: Account }, EditAccount>(\n ({ businessId, accountId }) =>\n `/v1/businesses/${businessId}/ledger/accounts/${accountId}`,\n)\n\nexport const getLedgerAccountsLines = get<{ data: LedgerAccounts }>(\n ({ businessId, accountId }) =>\n `/v1/businesses/${businessId}/ledger/accounts/${accountId}/lines`,\n)\n\nexport const getLedgerAccountsEntry = get<{ data: LedgerAccountsEntry }>(\n ({ businessId, entryId }) =>\n `/v1/businesses/${businessId}/ledger/entries/${entryId}`,\n)\n", "import { LinkedAccounts, PublicToken } from '../../types/linked_accounts'\nimport { get, post, deleteRequest } from './authenticated_http'\n\nexport const getLinkedAccounts = get<{ data: LinkedAccounts }>(\n ({ businessId }) => `/v1/businesses/${businessId}/external-accounts`,\n)\n\nexport const getPlaidLinkToken = post<{\n data: {\n type: 'Link_Token'\n link_token: string\n }\n}>(({ businessId }) => `/v1/businesses/${businessId}/plaid/link`)\n\nexport const exchangePlaidPublicToken = post<\n Record<string, unknown>,\n PublicToken\n>(({ businessId }) => `/v1/businesses/${businessId}/plaid/link/exchange`)\n\n/**\n * This is named per plaid terminology. It means unlinking an institution\n */\nexport const unlinkPlaidItem = deleteRequest<\n Record<string, unknown>,\n Record<string, unknown>,\n {\n businessId: string\n plaidItemId: string\n }\n>(\n ({ businessId, plaidItemId }) =>\n `/v1/businesses/${businessId}/plaid/items/${plaidItemId}`,\n)\n\nexport const unlinkPlaidAccount = post<\n Record<string, unknown>,\n Record<string, unknown>,\n { businessId: string; accountId: string }\n>(\n ({ businessId, accountId }) =>\n `/v1/businesses/${businessId}/plaid/accounts/${accountId}/archive`,\n)\n\n// export const createAccount = post<{ data: LinkedAccount }, NewAccount>(\n// ({ businessId }) => `/v1/businesses/${businessId}/external-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, tagKey, tagValues, reportingBasis }) =>\n `/v1/businesses/${businessId}/reports/profit-and-loss?start_date=${\n startDate ? encodeURIComponent(startDate) : ''\n }&end_date=${endDate ? encodeURIComponent(endDate) : ''}${\n reportingBasis ? `&reporting_basis=${reportingBasis}` : ''\n }${tagKey ? `&tag_key=${tagKey}` : ''}${\n tagValues ? `&tag_values=${tagValues}` : ''\n }`,\n)\n", "import { authenticate } from './layer/authenticate'\nimport { getBalanceSheet } from './layer/balance_sheet'\nimport {\n getBankTransactions,\n categorizeBankTransaction,\n matchBankTransaction,\n} from './layer/bankTransactions'\nimport { getCategories } from './layer/categories'\nimport {\n getChartOfAccounts,\n createAccount,\n updateAccount,\n getLedgerAccountsLines,\n getLedgerAccountsEntry,\n} from './layer/chart_of_accounts'\nimport {\n getLinkedAccounts,\n getPlaidLinkToken,\n exchangePlaidPublicToken,\n unlinkPlaidItem,\n unlinkPlaidAccount,\n} from './layer/linked_accounts'\nimport { getProfitAndLoss } from './layer/profit_and_loss'\n\nexport const Layer = {\n authenticate,\n categorizeBankTransaction,\n matchBankTransaction,\n createAccount,\n updateAccount,\n getBalanceSheet,\n getBankTransactions,\n getCategories,\n getChartOfAccounts,\n getLedgerAccountsLines,\n getLedgerAccountsEntry,\n getProfitAndLoss,\n getLinkedAccounts,\n getPlaidLinkToken,\n exchangePlaidPublicToken,\n unlinkPlaidAccount,\n unlinkPlaidItem,\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 {\n LayerContextHelpers,\n LayerThemeConfig,\n} from '../../types/layer_context'\n\nexport const LayerContext = createContext<\n LayerContextValues &\n LayerContextHelpers & { 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 colors: {},\n setTheme: () => undefined,\n getColor: _shade => undefined,\n setLightColor: () => undefined,\n setDarkColor: () => undefined,\n setColors: () => 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 { IconSvgProps } from './types'\n\nconst DownloadCloud = ({ 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='M6 12.75L9 15.75L12 12.75'\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.66 13.5675C16.3121 13.109 16.801 12.4546 17.056 11.6994C17.3109 10.9441 17.3186 10.1273 17.0778 9.36737C16.837 8.60748 16.3604 7.94407 15.7171 7.47342C15.0737 7.00278 14.2971 6.74938 13.5 6.75H12.555C12.3294 5.87091 11.9074 5.05444 11.3206 4.36206C10.7338 3.66969 9.99762 3.11945 9.16742 2.75277C8.33721 2.38609 7.43464 2.21252 6.52766 2.24514C5.62067 2.27776 4.7329 2.51571 3.93118 2.94107C3.12946 3.36644 2.43468 3.96814 1.89915 4.70087C1.36362 5.43361 1.0013 6.27829 0.839456 7.17132C0.677613 8.06434 0.720468 8.98245 0.964796 9.85652C1.20912 10.7306 1.64856 11.5378 2.25001 12.2175'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\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, useMemo, useEffect } from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { debounce } from '../../utils/helpers'\nimport { BankTransactionListItem } from '../BankTransactionListItem'\nimport { BankTransactionRow } from '../BankTransactionRow'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { Loader } from '../Loader'\nimport { Pagination } from '../Pagination'\nimport { Toggle } from '../Toggle'\nimport { Heading, HeadingSize } from '../Typography'\n\nconst COMPONENT_NAME = 'bank-transactions'\n\nenum DisplayState {\n review = 'review',\n categorized = 'categorized',\n}\n\nconst CategorizedCategories = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n CategorizationStatus.MATCHED,\n]\nconst ReviewCategories = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n]\n\nexport interface BankTransactionsProps {\n asWidget?: boolean\n pageSize?: number\n categorizedOnly?: boolean\n}\n\nconst filterVisibility = (\n display: DisplayState,\n bankTransaction: BankTransaction,\n) => {\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 pageSize = 15,\n categorizedOnly = false,\n}: BankTransactionsProps) => {\n const [display, setDisplay] = useState<DisplayState>(\n categorizedOnly ? DisplayState.categorized : DisplayState.review,\n )\n const [currentPage, setCurrentPage] = useState(1)\n const [removedTxs, setRemovedTxs] = useState<string[]>([])\n const [initialLoad, setInitialLoad] = useState(true)\n const { data, isLoading, error, isValidating, refetch } =\n useBankTransactions()\n\n const bankTransactionsByFilter = data?.filter(\n tx => !removedTxs.includes(tx.id) && filterVisibility(display, tx),\n )\n\n useEffect(() => {\n if (!isLoading) {\n const timeoutLoad = setTimeout(() => {\n setInitialLoad(false)\n }, 1000)\n return () => clearTimeout(timeoutLoad)\n }\n }, [isLoading])\n\n const bankTransactions = useMemo(() => {\n const firstPageIndex = (currentPage - 1) * pageSize\n const lastPageIndex = firstPageIndex + pageSize\n return bankTransactionsByFilter?.slice(firstPageIndex, lastPageIndex)\n }, [currentPage, bankTransactionsByFilter, removedTxs])\n\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 setCurrentPage(1)\n }\n\n const [shiftStickyHeader, setShiftStickyHeader] = useState(0)\n const debounceShiftStickyHeader = debounce(setShiftStickyHeader, 500)\n const [listView, setListView] = useState(false)\n const [containerWidth, setContainerWidth] = useState(0)\n const debounceContainerWidth = debounce(setContainerWidth, 500)\n\n const removeTransaction = (id: string) => {\n const newTxs = removedTxs.slice()\n newTxs.push(id)\n setRemovedTxs(newTxs)\n }\n\n const containerRef = useElementSize<HTMLDivElement>((_el, _en, size) => {\n if (size?.height && size?.height >= 90) {\n const newShift = -Math.floor(size.height / 2) + 6\n if (newShift !== shiftStickyHeader) {\n debounceShiftStickyHeader(newShift)\n }\n } else if (size?.height > 0 && shiftStickyHeader !== 0) {\n debounceShiftStickyHeader(0)\n }\n\n if (size.width > 700 && listView) {\n setListView(false)\n } else if (size.width <= 700 && !listView) {\n setListView(true)\n }\n\n debounceContainerWidth(size?.width)\n })\n\n const editable = display === DisplayState.review\n return (\n <Container\n className={\n editable\n ? 'Layer__bank-transactions--to-review'\n : 'Layer__bank-transactions--categorized'\n }\n name={COMPONENT_NAME}\n asWidget={asWidget}\n ref={containerRef}\n >\n <Header\n className='Layer__bank-transactions__header'\n style={{ top: shiftStickyHeader }}\n >\n <Heading\n className='Layer__bank-transactions__title'\n size={asWidget ? HeadingSize.secondary : HeadingSize.secondary}\n >\n Transactions\n </Heading>\n {!categorizedOnly && (\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 )}\n </Header>\n {!listView && (\n <table\n width='100%'\n className='Layer__table Layer__bank-transactions__table with-cell-separators'\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(\n (bankTransaction: BankTransaction, index: number) => (\n <BankTransactionRow\n initialLoad={initialLoad}\n index={index}\n key={bankTransaction.id}\n dateFormat={DATE_FORMAT}\n bankTransaction={bankTransaction}\n editable={editable}\n removeTransaction={removeTransaction}\n containerWidth={containerWidth}\n />\n ),\n )}\n </tbody>\n </table>\n )}\n\n {isLoading && !bankTransactions ? (\n <div className='Layer__bank-transactions__loader-container'>\n <Loader />\n </div>\n ) : null}\n\n {!isLoading && listView ? (\n <ul className='Layer__bank-transactions__list'>\n {bankTransactions?.map(\n (bankTransaction: BankTransaction, index: number) => (\n <BankTransactionListItem\n index={index}\n key={bankTransaction.id}\n dateFormat={DATE_FORMAT}\n bankTransaction={bankTransaction}\n editable={editable}\n removeTransaction={removeTransaction}\n containerWidth={containerWidth}\n />\n ),\n )}\n </ul>\n ) : null}\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\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\n <div className='Layer__bank-transactions__pagination'>\n <Pagination\n currentPage={currentPage}\n totalCount={bankTransactionsByFilter?.length || 0}\n pageSize={pageSize}\n onPageChange={page => setCurrentPage(page)}\n />\n </div>\n </Container>\n )\n}\n", "export const DATE_FORMAT = 'LLL d, yyyy'\nexport const TIME_FORMAT = 'p'\n\nexport const BREAKPOINTS = {\n TABLET: 760,\n MOBILE: 500,\n}\n", "import { Layer } from '../../api/layer'\nimport { BankTransaction, CategoryUpdate, Metadata } from '../../types'\nimport { BankTransactionMatchType } from '../../types/bank_transactions'\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 match: (\n id: BankTransaction['id'],\n matchId: BankTransaction['id'],\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 match = (id: BankTransaction['id'], matchId: BankTransaction['id']) => {\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.matchBankTransaction(apiUrl, auth.access_token, {\n params: { businessId, bankTransactionId: id },\n body: { match_id: matchId, type: BankTransactionMatchType.CONFIRM_MATCH },\n })\n .then(({ data: bt, errors }) => {\n const newBT = data?.find(\n x => x.business_id === businessId && x.id === id,\n )\n\n if (newBT) {\n newBT.recently_categorized = true\n newBT.match = bt\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 match,\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: {\n width: number\n height: number\n clientWidth: number\n clientHeight: number\n },\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 clientWidth: element.clientWidth,\n clientHeight: element.clientHeight,\n })\n })\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [callback, ref])\n\n return ref\n}\n", "export enum CategorizationStatus {\n PENDING = 'PENDING',\n READY_FOR_INPUT = 'READY_FOR_INPUT',\n LAYER_REVIEW = 'LAYER_REVIEW',\n CATEGORIZED = 'CATEGORIZED',\n SPLIT = 'SPLIT',\n JOURNALING = 'JOURNALING',\n MATCHED = 'MATCHED',\n}\n\nexport interface CategoryEntry {\n amount?: number\n category: Category\n}\n\nexport interface Category {\n id: string\n type: string\n display_name: string\n category: string\n stable_name?: string\n subCategories?: Category[]\n entries?: CategoryEntry[]\n}\n\nexport enum CategorizationType {\n AUTO = 'AUTO',\n ASK_FROM_SUGGESTIONS = 'ASK_FROM_SUGGESTIONS',\n MEALS = 'MEALS',\n BUSINESS_TRAVEL_TRANSPORTATION = 'BUSINESS_TRAVEL_TRANSPORTATION',\n}\n\nexport interface AutoCategorization {\n type: CategorizationType.AUTO\n category: Category\n}\nexport interface SuggestedCategorization {\n type: CategorizationType\n suggestions: Category[]\n}\nexport type Categorization = AutoCategorization | SuggestedCategorization\n\nexport type SingleCategoryUpdate = {\n type: 'Category'\n category: {\n type: 'StableName'\n stable_name: string\n }\n}\nexport type SplitCategoryUpdate = {\n type: 'Split'\n entries: {\n category: string\n amount: number\n }[]\n}\nexport type CategoryUpdate = SingleCategoryUpdate | SplitCategoryUpdate\n\nexport function hasSuggestions(\n categorization: Categorization,\n): categorization is SuggestedCategorization {\n return (categorization as SuggestedCategorization).suggestions !== undefined\n}\n", "export const range = (start: number, end: number) => {\n let length = end - start + 1\n return Array.from({ length }, (_, idx) => idx + start)\n}\n\nexport const debounce = <F extends (...args: Parameters<F>) => ReturnType<F>>(\n fnc: F,\n timeout = 300,\n) => {\n let timer: ReturnType<typeof setTimeout>\n return (...args: Parameters<F>) => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n fnc.apply(this, args)\n }, timeout)\n }\n}\n\nexport const sleep = (time: number) => {\n return new Promise(resolve => setTimeout(resolve, time))\n}\n\n/**\n * Convert the account name into stable_name\n */\nexport const convertToStableName = (name: string): string =>\n name\n .replace(/[`~!@#$%^&*()_|+\\-=?;:'\",.<>\\{\\}\\[\\]\\\\\\/]/gi, '')\n .replace(/\\W+/g, ' ')\n .split(/ |\\B(?=[A-Z])/)\n .map(word => word.toLowerCase())\n .join('_')\n", "import React, { useEffect, useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, Direction } from '../../types'\nimport { getDefaultSelectedCategory } from '../BankTransactionRow/BankTransactionRow'\nimport { RetryButton, SubmitButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { ErrorText, Text } from '../Typography'\nimport { TextUseTooltip } from '../Typography/Text'\nimport { Assignment } from './Assignment'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n index: number\n dateFormat: string\n bankTransaction: BankTransaction\n editable: boolean\n removeTransaction: (id: string) => void\n containerWidth?: number\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionListItem = ({\n index = 0,\n dateFormat,\n bankTransaction,\n editable,\n containerWidth,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [showRetry, setShowRetry] = useState(false)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction, match: matchBankTransaction } =\n useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n getDefaultSelectedCategory(bankTransaction),\n )\n\n const [open, setOpen] = useState(false)\n const toggleOpen = () => {\n setShowRetry(false)\n setOpen(!open)\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, index * 80)\n\n return () => clearTimeout(timeoutId)\n }, [])\n\n useEffect(() => {\n if (bankTransaction.error) {\n setShowRetry(true)\n }\n }, [bankTransaction.error])\n\n const save = () => {\n // Save using form from expanded row when row is open:\n if (open && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n return\n }\n\n if (!selectedCategory) {\n return\n }\n\n if (selectedCategory.type === 'match') {\n matchBankTransaction(bankTransaction.id, selectedCategory.payload.id)\n return\n }\n\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: selectedCategory?.payload.stable_name || '',\n },\n })\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-list-item'\n const openClassName = open ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized\n ? 'Layer__bank-transaction-row--removing'\n : '',\n open ? openClassName : '',\n showComponent ? 'show' : '',\n )\n\n return (\n <li className={rowClassName}>\n <span className={`${className}__heading`}>\n <div className={`${className}__heading__main`}>\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 </div>\n <div\n onClick={toggleOpen}\n className='Layer__bank-transaction-row__expand-button'\n >\n <ChevronDownFill\n className={`Layer__chevron ${\n open ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n </div>\n </span>\n <span className={`${className}__body`}>\n <span className={`${className}__body__name`}>\n <Text as='span' withTooltip={TextUseTooltip.whenTruncated}>\n {bankTransaction.counterparty_name ?? bankTransaction.description}\n </Text>\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 </span>\n <span className={`${className}__expanded-row`}>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n isOpen={open}\n close={() => setOpen(false)}\n editable={editable}\n asListItem={true}\n submitBtnText={editable ? 'Approve' : 'Update'}\n containerWidth={containerWidth}\n />\n </span>\n <span className={`${className}__base-row`}>\n {editable ? (\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={category => {\n setShowRetry(false)\n setSelectedCategory(category)\n }}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable ? <Assignment bankTransaction={bankTransaction} /> : null}\n {editable && !showRetry ? (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {editable ? 'Approve' : 'Update'}\n </SubmitButton>\n ) : null}\n {editable && showRetry ? (\n <RetryButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__retry-btn'\n processing={bankTransaction.processing}\n error={\n 'Approval failed. Check connection and retry in few seconds.'\n }\n >\n Retry\n </RetryButton>\n ) : null}\n </span>\n {bankTransaction.error && showRetry ? (\n <ErrorText>\n Approval failed. Check connection and retry in few seconds.\n </ErrorText>\n ) : null}\n </li>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronDownFill = ({ 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 d='M4.5 6.75L9 11.25L13.5 6.75' fill='currentColor' />\n <path\n d='M4.5 6.75L9 11.25L13.5 6.75H4.5Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default ChevronDownFill\n", "import React, { useEffect, useRef, useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport AlertCircle from '../../icons/AlertCircle'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport Scissors from '../../icons/Scissors'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport {\n BankTransaction,\n CategorizationStatus,\n Category,\n Direction,\n} from '../../types'\nimport { hasSuggestions } from '../../types/categories'\nimport { Badge } from '../Badge'\nimport { SubmitButton, IconButton, RetryButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport {\n mapCategoryToOption,\n mapSuggestedMatchToOption,\n} from '../CategorySelect/CategorySelect'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { SaveHandle } from '../ExpandedBankTransactionRow/ExpandedBankTransactionRow'\nimport { Text } from '../Typography'\nimport { TextSize, TextUseTooltip } from '../Typography/Text'\nimport { MatchBadge } from './MatchBadge'\nimport { SplitTooltipDetails } from './SplitTooltipDetails'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n index: number\n dateFormat: string\n bankTransaction: BankTransaction\n editable: boolean\n removeTransaction: (id: string) => void\n containerWidth?: number\n initialLoad?: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport type LastSubmittedForm = 'simple' | 'match' | 'split' | undefined\n\nexport const extractDescriptionForSplit = (category: Category) => {\n if (!category.entries) {\n return ''\n }\n\n return category.entries.map(c => c.category.display_name).join(', ')\n}\n\nexport const getDefaultSelectedCategory = (\n bankTransaction: BankTransaction,\n) => {\n return hasSuggestions(bankTransaction.categorization_flow)\n ? mapCategoryToOption(bankTransaction.categorization_flow.suggestions[0])\n : bankTransaction.suggested_matches?.length === 1\n ? mapSuggestedMatchToOption(bankTransaction.suggested_matches[0])\n : undefined\n}\n\nlet clickTimer = Date.now()\n\nexport const BankTransactionRow = ({\n index = 0,\n dateFormat,\n bankTransaction,\n editable,\n removeTransaction,\n containerWidth,\n initialLoad,\n}: Props) => {\n const expandedRowRef = useRef<SaveHandle>(null)\n const [showRetry, setShowRetry] = useState(false)\n const [removed, setRemoved] = useState(false)\n const { categorize: categorizeBankTransaction, match: matchBankTransaction } =\n useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n getDefaultSelectedCategory(bankTransaction),\n )\n const [open, setOpen] = useState(false)\n const toggleOpen = () => {\n setShowRetry(false)\n setOpen(!open)\n }\n\n const openRow = {\n onMouseDown: () => {\n clickTimer = Date.now()\n },\n onMouseUp: () => {\n if (Date.now() - clickTimer < 100 && !open) {\n setShowRetry(false)\n setOpen(true)\n }\n },\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n if (initialLoad) {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, index * 10)\n\n return () => clearTimeout(timeoutId)\n } else {\n setShowComponent(true)\n }\n }, [])\n\n useEffect(() => {\n if (bankTransaction.error) {\n setShowRetry(true)\n }\n }, [bankTransaction.error])\n\n const save = async () => {\n // Save using form from expanded row when row is open:\n if (open && expandedRowRef?.current) {\n expandedRowRef?.current?.save()\n return\n }\n\n if (!selectedCategory) {\n return\n }\n\n if (selectedCategory.type === 'match') {\n await matchBankTransaction(\n bankTransaction.id,\n selectedCategory.payload.id,\n )\n setOpen(false)\n return\n }\n\n await categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: selectedCategory?.payload.stable_name || '',\n },\n })\n setOpen(false)\n }\n\n if (removed) {\n return null\n }\n\n const className = 'Layer__bank-transaction-row'\n const openClassName = open ? `${className}--expanded` : ''\n const rowClassName = classNames(\n className,\n bankTransaction.recently_categorized && editable\n ? 'Layer__bank-transaction-row--removing'\n : '',\n open ? openClassName : '',\n initialLoad ? 'initial-load' : '',\n showComponent ? 'show' : '',\n )\n\n return (\n <>\n <tr\n className={rowClassName}\n onTransitionEnd={({ propertyName }) => {\n if (propertyName === 'top') {\n setRemoved(true)\n if (editable) {\n removeTransaction(bankTransaction.id)\n }\n }\n }}\n >\n <td\n className='Layer__table-cell Layer__bank-transaction-table__date-col'\n {...openRow}\n >\n <span className='Layer__table-cell-content'>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </span>\n </td>\n <td\n className='Layer__table-cell Layer__bank-transactions__tx-col'\n {...openRow}\n >\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 ?? bankTransaction.description}\n </Text>\n </span>\n </td>\n <td\n className='Layer__table-cell Layer__bank-transactions__account-col'\n {...openRow}\n >\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__bank-transactions__amount-col Layer__table-cell--amount ${className}__table-cell--amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n {...openRow}\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--${open ? 'open' : 'close'}`,\n )}\n >\n <span\n className={`${className}__actions-container Layer__table-cell-content`}\n >\n {editable && !open ? (\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={category => {\n setSelectedCategory(category)\n setShowRetry(false)\n }}\n disabled={bankTransaction.processing}\n />\n ) : null}\n {!editable && !open ? (\n <Text as='span' className={`${className}__category-text`}>\n {bankTransaction.categorization_status ===\n CategorizationStatus.SPLIT && (\n <>\n <Badge\n icon={<Scissors size={11} />}\n tooltip={\n <SplitTooltipDetails\n classNamePrefix={className}\n category={bankTransaction.category}\n />\n }\n >\n Split\n </Badge>\n <span className={`${className}__category-text__text`}>\n {extractDescriptionForSplit(bankTransaction.category)}\n </span>\n </>\n )}\n {bankTransaction?.categorization_status ===\n CategorizationStatus.MATCHED &&\n bankTransaction?.match && (\n <>\n <MatchBadge\n classNamePrefix={className}\n bankTransaction={bankTransaction}\n dateFormat={dateFormat}\n />\n <span className={`${className}__category-text__text`}>\n {`${formatTime(\n parseISO(bankTransaction.match.bank_transaction.date),\n dateFormat,\n )}, ${bankTransaction.match?.details?.description}`}\n </span>\n </>\n )}\n {bankTransaction?.categorization_status !==\n CategorizationStatus.MATCHED &&\n bankTransaction?.categorization_status !==\n CategorizationStatus.SPLIT && (\n <span className={`${className}__category-text__text`}>\n {bankTransaction?.category?.display_name}\n </span>\n )}\n </Text>\n ) : null}\n {editable && !open && showRetry ? (\n <RetryButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__retry-btn'\n processing={bankTransaction.processing}\n error={\n 'Approval failed. Check connection and retry in few seconds.'\n }\n >\n Retry\n </RetryButton>\n ) : null}\n {open && bankTransaction.error ? (\n <Text\n as='span'\n size={TextSize.md}\n className='Layer__unsaved-info'\n >\n <span>Unsaved</span>\n <AlertCircle size={12} />\n </Text>\n ) : null}\n {(editable && (open || (!open && !showRetry))) ||\n (!editable && open) ? (\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n active={open}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {editable ? 'Approve' : 'Update'}\n </SubmitButton>\n ) : null}\n <IconButton\n onClick={toggleOpen}\n className='Layer__bank-transaction-row__expand-button'\n active={open}\n icon={\n <ChevronDownFill\n className={`Layer__chevron ${\n open ? 'Layer__chevron__up' : 'Layer__chevron__down'\n }`}\n />\n }\n />\n </span>\n </td>\n </tr>\n <tr>\n <td colSpan={5} className='Layer__bank-transaction-row__expanded-td'>\n <ExpandedBankTransactionRow\n ref={expandedRowRef}\n bankTransaction={bankTransaction}\n isOpen={open}\n close={() => setOpen(false)}\n containerWidth={containerWidth}\n editable={editable}\n />\n </td>\n </tr>\n </>\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 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, { ReactNode, MouseEvent } from 'react'\nimport { Button } from '../Button'\nimport { ButtonProps } from '../Button/Button'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport enum BadgeSize {\n SMALL = 'small',\n MEDIUM = 'medium',\n}\n\nexport enum BadgeVariant {\n DEFAULT = 'default',\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\nexport interface BadgeProps {\n children: ReactNode\n icon?: ReactNode\n onClick?: ButtonProps['onClick']\n tooltip?: ReactNode\n size?: BadgeSize\n variant?: BadgeVariant\n hoverable?: boolean\n}\n\nexport const Badge = ({\n icon,\n onClick,\n children,\n tooltip,\n size = BadgeSize.MEDIUM,\n variant = BadgeVariant.DEFAULT,\n hoverable = false,\n}: BadgeProps) => {\n const baseProps = {\n className: classNames(\n 'Layer__badge',\n hoverable && !tooltip ? 'Layer__badge--with-hover' : '',\n onClick || tooltip ? 'Layer__badge--clickable' : '',\n `Layer__badge--${size}`,\n `Layer__badge--${variant}`,\n ),\n onClick,\n children,\n }\n\n let content = (\n <>\n {icon && <span className='Layer__badge__icon'>{icon}</span>}\n {children}\n </>\n )\n\n content = onClick ? (\n <Button {...baseProps}>{content}</Button>\n ) : (\n <span {...baseProps}>{content}</span>\n )\n\n if (tooltip) {\n return (\n <Tooltip offset={12}>\n <TooltipTrigger>{content}</TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{tooltip}</TooltipContent>\n </Tooltip>\n )\n }\n\n return content\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 type ButtonJustify = 'center' | 'space-between' | 'start'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n iconOnly?: ReactNode\n iconAsPrimary?: boolean\n justify?: ButtonJustify\n}\n\nexport const Button = ({\n className,\n children,\n variant = ButtonVariant.primary,\n leftIcon,\n rightIcon,\n iconOnly,\n iconAsPrimary = false,\n justify = 'center',\n ...props\n}: ButtonProps) => {\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n let justifyContent = 'center'\n if (justify) {\n justifyContent = justify\n } else if (leftIcon && rightIcon) {\n justifyContent = 'space-between'\n } else if (rightIcon) {\n justifyContent = 'space-between'\n } else if (leftIcon) {\n justifyContent = 'start'\n }\n\n const baseClassName = classNames(\n 'Layer__btn',\n `Layer__btn--${variant}`,\n iconOnly ? 'Layer__btn--icon-only' : '',\n iconAsPrimary && 'Layer__btn--with-primary-icon',\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--${justifyContent}`}>\n {leftIcon && (\n <span\n className={classNames(\n 'Layer__btn-icon Layer__btn-icon--left',\n iconAsPrimary && 'Layer__btn-icon--primary',\n )}\n >\n {leftIcon}\n </span>\n )}\n {!iconOnly && <span className='Layer__btn-text'>{children}</span>}\n {rightIcon && (\n <span\n className={classNames(\n 'Layer__btn-icon Layer__btn-icon--right',\n iconAsPrimary && 'Layer__btn-icon--primary',\n )}\n >\n {rightIcon}\n </span>\n )}\n </span>\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode, useRef } from 'react'\nimport classNames from 'classnames'\n\nexport interface IconButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode\n active?: boolean\n}\n\nexport const IconButton = ({\n className,\n children,\n icon,\n active,\n ...props\n}: IconButtonProps) => {\n const baseClassName = classNames(\n 'Layer__icon-btn',\n `Layer__icon-btn--${active ? 'active' : 'inactive'}`,\n className,\n )\n\n return (\n <button {...props} className={baseClassName}>\n {icon}\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes } from 'react'\nimport RefreshCcw from '../../icons/RefreshCcw'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport { Button, ButtonVariant } from './Button'\nimport classNames from 'classnames'\n\nexport interface RetryButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n processing?: boolean\n disabled?: boolean\n error: string\n}\n\nexport const RetryButton = ({\n className,\n processing,\n disabled,\n error,\n children,\n ...props\n}: RetryButtonProps) => {\n const baseClassName = classNames(\n 'Layer__retry-btn',\n processing ? 'Layer__btn--processing' : '',\n className,\n )\n\n return (\n <Button\n {...props}\n className={baseClassName}\n variant={ButtonVariant.secondary}\n disabled={processing || disabled}\n rightIcon={<RefreshCcw size={12} />}\n justify='center'\n >\n {children}\n </Button>\n )\n}\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 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 Save from '../../icons/Save'\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 action?: SubmitAction\n noIcon?: boolean\n}\n\nexport enum SubmitAction {\n SAVE = 'save',\n UPDATE = 'update',\n}\n\nconst buildRightIcon = ({\n processing,\n error,\n action,\n noIcon,\n}: {\n processing?: boolean\n error?: boolean | string\n action: SubmitAction\n noIcon?: boolean\n}) => {\n if (noIcon) {\n return\n }\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 if (action === SubmitAction.UPDATE) {\n return (\n <span className='Layer__pt-2'>\n <Save size={14} />\n </span>\n )\n }\n\n return (\n <span>\n <CheckCircle size={14} style={{ paddingTop: 4 }} />\n </span>\n )\n}\n\nexport const SubmitButton = ({\n active,\n className,\n processing,\n disabled,\n error,\n children,\n action = SubmitAction.SAVE,\n noIcon,\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, action, noIcon })}\n iconAsPrimary={true}\n >\n {children}\n </Button>\n )\n}\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 * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Save = ({ 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='M14.25 15.75H3.75C3.35218 15.75 2.97064 15.592 2.68934 15.3107C2.40804 15.0294 2.25 14.6478 2.25 14.25V3.75C2.25 3.35218 2.40804 2.97064 2.68934 2.68934C2.97064 2.40804 3.35218 2.25 3.75 2.25H12L15.75 6V14.25C15.75 14.6478 15.592 15.0294 15.3107 15.3107C15.0294 15.592 14.6478 15.75 14.25 15.75Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M12.75 15.75V9.75H5.25V15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M5.25 2.25V6H11.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Save\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.floatingStyles,\n }}\n {...context.getFloatingProps(props)}\n >\n <div className='Layer__tooltip-content ' style={{ ...context.styles }}>\n {props.children}\n </div>\n </div>\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 transform: 'scale(0.7)',\n color: 'transparent',\n },\n duration: 300,\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, { ButtonHTMLAttributes, ReactNode, useRef } from 'react'\nimport classNames from 'classnames'\n\nexport type TextButtonProps = ButtonHTMLAttributes<HTMLButtonElement>\n\nexport const TextButton = ({\n className,\n children,\n ...props\n}: TextButtonProps) => {\n const baseClassName = classNames('Layer__text-btn', className)\n\n return (\n <button {...props} className={baseClassName}>\n {children}\n </button>\n )\n}\n", "import React, { ButtonHTMLAttributes, ReactNode } from 'react'\nimport BackArrow from '../../icons/BackArrow'\nimport classNames from 'classnames'\n\nexport interface BackButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n textOnly?: boolean\n}\n\nexport const BackButton = ({\n className,\n children,\n textOnly = false,\n ...props\n}: BackButtonProps) => {\n const baseClassName = classNames('Layer__btn', 'Layer__back-btn', className)\n\n return (\n <button {...props} className={baseClassName}>\n {textOnly ? 'Back' : <BackArrow size={16} />}\n </button>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst BackArrow = ({ size = 18, ...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 <path\n d='M7.375 8.75L4.625 6L7.375 3.25'\n stroke='#1A130D'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default BackArrow\n", "import React from 'react'\nimport Select, {\n DropdownIndicatorProps,\n GroupHeadingProps,\n GroupBase,\n OptionProps,\n components,\n} from 'react-select'\nimport { DATE_FORMAT } from '../../config/general'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport Check from '../../icons/Check'\nimport ChevronDown from '../../icons/ChevronDown'\nimport MinimizeTwo from '../../icons/MinimizeTwo'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Category } from '../../types'\nimport { SuggestedMatch } from '../../types/bank_transactions'\nimport { CategoryEntry } from '../../types/categories'\nimport { Badge } from '../Badge'\nimport { BadgeSize } from '../Badge/Badge'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n name?: string\n bankTransaction: BankTransaction\n value: CategoryOption | undefined\n onChange: (newValue: CategoryOption) => void\n disabled?: boolean\n className?: string\n}\n\nexport enum OptionActionType {\n CATEGORY = 'category',\n MATCH = 'match',\n HIDDEN = 'hidden',\n}\n\nexport interface CategoryOptionPayload {\n id: string\n option_type: OptionActionType\n display_name: string\n date?: string\n amount?: number\n type?: string\n stable_name?: string\n entries?: CategoryEntry[]\n subCategories?: Category[]\n}\n\nexport interface CategoryOption {\n type: string\n disabled?: boolean\n payload: CategoryOptionPayload\n}\n\nexport const mapCategoryToOption = (category: Category): CategoryOption => {\n return {\n type: OptionActionType.CATEGORY,\n payload: {\n id: category.id,\n option_type: OptionActionType.CATEGORY,\n display_name: category.display_name,\n type: category.type,\n stable_name: category.stable_name,\n entries: category.entries,\n subCategories: category.subCategories,\n },\n }\n}\n\nexport const mapSuggestedMatchToOption = (\n record: SuggestedMatch,\n): CategoryOption => {\n return {\n type: OptionActionType.MATCH,\n payload: {\n id: record.id,\n option_type: OptionActionType.MATCH,\n display_name: record.details.description,\n amount: record.details.amount,\n },\n }\n}\n\nconst DropdownIndicator:\n | React.ComponentType<\n DropdownIndicatorProps<CategoryOption, false, GroupBase<CategoryOption>>\n >\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n )\n}\n\nconst GroupHeading = (\n props: GroupHeadingProps<CategoryOption, false, GroupBase<CategoryOption>>,\n) => {\n return (\n <components.GroupHeading\n className={classNames(\n props.className,\n props.children === 'Match' || props.children === 'All categories'\n ? 'Layer__select__group-heading--main'\n : '',\n )}\n {...props}\n />\n )\n}\n\nconst Option = (\n props: OptionProps<CategoryOption, false, GroupBase<CategoryOption>>,\n) => {\n if (props.data.payload.option_type === 'hidden') {\n return\n }\n\n if (props.data.type === 'match') {\n return (\n <components.Option\n {...props}\n className={`${props.className} Layer__select__option-content__match`}\n >\n <div className='Layer__select__option-content__match__main-row'>\n <span className='Layer__select__option-content__match__date'>\n {props.data.payload.date &&\n formatTime(parseISO(props.data.payload.date), DATE_FORMAT)}\n </span>\n <span className='Layer__select__option-content__match__description'>\n {props.data.payload.display_name}\n </span>\n </div>\n <div className='Layer__select__option-content__match__amount-row'>\n <span className='Layer__select__option-content__match__amount'>\n ${formatMoney(props.data.payload.amount)}\n </span>\n </div>\n </components.Option>\n )\n }\n\n return (\n <components.Option\n {...props}\n className={`Layer__select__option-menu-content ${props.className}`}\n >\n <div>{props.data.payload.display_name}</div>\n {props.isSelected ? (\n <span className='Layer__select__option-menu-content-check'>\n <Check size={16} />\n </span>\n ) : null}\n </components.Option>\n )\n}\n\nconst allCategoriesDivider: GroupBase<CategoryOption>[] = [\n {\n label: 'All categories',\n options: [\n {\n type: 'All categories',\n disabled: true,\n payload: {\n id: 'all_categories',\n option_type: OptionActionType.HIDDEN,\n display_name: 'ALL CATEGORIES',\n },\n } satisfies CategoryOption,\n ],\n },\n]\n\nfunction flattenCategories(\n categories: Category[],\n): GroupBase<CategoryOption>[] {\n const categoryOptions = (categories || []).flatMap(category => {\n if (category?.subCategories && category?.subCategories?.length > 0) {\n if (category?.subCategories?.every(c => c.subCategories === undefined)) {\n return [\n {\n label: category.display_name,\n options: category.subCategories.map(x => mapCategoryToOption(x)),\n },\n ]\n }\n return flattenCategories(category.subCategories)\n }\n const resultOption = {\n label: category.display_name,\n options: [mapCategoryToOption(category)],\n } satisfies GroupBase<CategoryOption>\n return [resultOption]\n })\n return categoryOptions\n}\n\nexport const CategorySelect = ({\n bankTransaction,\n name,\n value,\n onChange,\n disabled,\n className,\n}: Props) => {\n const { categories } = useLayerContext()\n\n const matchOptions = bankTransaction?.suggested_matches\n ? [\n {\n label: 'Match',\n options: bankTransaction.suggested_matches.map(x => {\n return {\n type: OptionActionType.MATCH,\n payload: {\n id: x.id,\n option_type: OptionActionType.MATCH,\n display_name: x.details.description,\n date: x.details.date,\n amount: x.details.amount,\n },\n } satisfies CategoryOption\n }),\n } satisfies GroupBase<CategoryOption>,\n ]\n : []\n\n const suggestedOptions =\n bankTransaction?.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? [\n {\n label: 'Suggestions',\n options: bankTransaction.categorization_flow.suggestions.map(x =>\n mapCategoryToOption(x),\n ),\n } satisfies GroupBase<CategoryOption>,\n ]\n : []\n\n const categoryOptions = flattenCategories(categories)\n\n const options = [\n ...matchOptions,\n ...suggestedOptions,\n ...allCategoriesDivider,\n ...categoryOptions,\n ]\n\n const selected = value\n ? value\n : matchOptions?.length === 1 && matchOptions[0].options.length === 1\n ? matchOptions[0].options[0]\n : undefined\n\n // @TODO ^ do this same for suggested options so user can just click approve\n // However... parent component may handle this already - need some test data from API to verify\n\n const placeholder =\n matchOptions?.length === 1 && matchOptions[0].options.length > 1\n ? `${matchOptions[0].options.length} possible matches...`\n : 'Categorize or match...'\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<CategoryOption>\n name={name}\n className={`Layer__category-menu Layer__select ${className ?? ''}`}\n classNamePrefix='Layer__select'\n classNames={{\n menu: () => 'Layer__select__menu--lg',\n }}\n options={options}\n isSearchable={true}\n placeholder={placeholder}\n defaultValue={selected}\n formatOptionLabel={props => (\n <div className='Layer__select__option-label'>\n {props.type === 'match' && (\n <Badge size={BadgeSize.SMALL} icon={<MinimizeTwo size={11} />}>\n Match\n </Badge>\n )}\n <span>{props.payload.display_name}</span>\n </div>\n )}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n getOptionLabel={category => category.payload.display_name}\n getOptionValue={category => category.payload.id}\n menuPortalTarget={document.body}\n styles={{\n menuPortal: base => ({ ...base, zIndex: 9999 }),\n }}\n components={{ DropdownIndicator, GroupHeading, Option }}\n isDisabled={disabled}\n isOptionDisabled={option => option.disabled ?? false}\n />\n )\n}\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 MinimizeTwo = ({ 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='M3 10.5H7.5V15'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M15 7.5H10.5V3'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 7.5L15.75 2.25'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M2.25 15.75L7.5 10.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default MinimizeTwo\n", "import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useCallback,\n useEffect,\n useRef,\n TransitionEvent,\n} from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport AlertCircle from '../../icons/AlertCircle'\nimport Scissors from '../../icons/ScissorsFullOpen'\nimport Trash from '../../icons/Trash'\nimport {\n centsToDollars as formatMoney,\n dollarsToCents as parseMoney,\n} from '../../models/Money'\nimport {\n BankTransaction,\n SplitCategoryUpdate,\n SingleCategoryUpdate,\n Category,\n} from '../../types'\nimport { hasSuggestions } from '../../types/categories'\nimport { Button, SubmitButton, ButtonVariant, TextButton } from '../Button'\nimport { SubmitAction } from '../Button/SubmitButton'\nimport { CategorySelect } from '../CategorySelect'\nimport {\n CategoryOption,\n mapCategoryToOption,\n} from '../CategorySelect/CategorySelect'\nimport { InputGroup, Input, FileInput } from '../Input'\nimport { MatchForm } from '../MatchForm'\nimport { Textarea } from '../Textarea'\nimport { Toggle } from '../Toggle'\nimport { ToggleSize } from '../Toggle/Toggle'\nimport { Text, ErrorText, TextSize } from '../Typography'\nimport { APIErrorNotifications } from './APIErrorNotifications'\nimport classNames from 'classnames'\n\ntype Props = {\n bankTransaction: BankTransaction\n isOpen?: boolean\n close: () => void\n asListItem?: boolean\n submitBtnText?: string\n containerWidth?: number\n editable?: boolean\n}\n\ntype Split = {\n amount: number\n inputValue: string\n category: CategoryOption | 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\nconst hasMatch = (bankTransaction?: BankTransaction) => {\n return Boolean(\n (bankTransaction?.suggested_matches &&\n bankTransaction?.suggested_matches?.length > 0) ||\n bankTransaction?.match,\n )\n}\n\nconst isAlreadyMatched = (bankTransaction?: BankTransaction) => {\n if (bankTransaction?.match) {\n const foundMatch = bankTransaction.suggested_matches?.find(\n x => x.details.id === bankTransaction?.match?.details.id,\n )\n return foundMatch?.id\n }\n\n return undefined\n}\n\nconst validateSplit = (splitData: RowState) => {\n let valid = true\n\n splitData.splits.forEach(split => {\n if (split.amount <= 0) {\n valid = false\n } else if (!split.category) {\n valid = false\n }\n })\n\n return valid\n}\n\nexport const ExpandedBankTransactionRow = forwardRef<SaveHandle, Props>(\n (\n {\n bankTransaction,\n isOpen = false,\n close,\n editable,\n asListItem = false,\n submitBtnText = 'Save',\n containerWidth,\n },\n ref,\n ) => {\n const {\n categorize: categorizeBankTransaction,\n match: matchBankTransaction,\n } = useBankTransactions()\n const [purpose, setPurpose] = useState<Purpose>(\n bankTransaction.category\n ? Purpose.categorize\n : hasMatch(bankTransaction)\n ? Purpose.match\n : Purpose.categorize,\n )\n const [selectedMatchId, setSelectedMatchId] = useState<string | undefined>(\n isAlreadyMatched(bankTransaction),\n )\n const [matchFormError, setMatchFormError] = useState<string | undefined>()\n const [splitFormError, setSplitFormError] = useState<string | undefined>()\n const [height, setHeight] = useState<string | number>(0)\n const [isOver, setOver] = useState(false)\n const bodyRef = useRef<HTMLSpanElement>(null)\n const [isLoaded, setIsLoaded] = useState(false)\n\n const defaultCategory =\n bankTransaction.category ||\n (hasSuggestions(bankTransaction.categorization_flow) &&\n bankTransaction.categorization_flow?.suggestions?.[0])\n\n const [rowState, updateRowState] = useState<RowState>({\n splits: bankTransaction.category?.entries\n ? bankTransaction.category?.entries.map(c => {\n return {\n amount: c.amount || 0,\n inputValue: formatMoney(c.amount),\n category: mapCategoryToOption(c.category),\n }\n })\n : [\n {\n amount: bankTransaction.amount,\n inputValue: formatMoney(bankTransaction.amount),\n category: mapCategoryToOption(defaultCategory),\n },\n ],\n description: '',\n file: undefined,\n })\n\n const addSplit = () => {\n updateRowState({\n ...rowState,\n splits: [\n ...rowState.splits,\n {\n amount: 0,\n inputValue: '0.00',\n category: mapCategoryToOption(defaultCategory),\n },\n ],\n })\n setSplitFormError(undefined)\n }\n\n const removeSplit = (index: number) => {\n const newSplits = rowState.splits.filter((_v, idx) => idx !== index)\n const splitTotal = newSplits.reduce((sum, split, index) => {\n const amount = index === 0 ? 0 : split.amount\n return sum + amount\n }, 0)\n const remaining = bankTransaction.amount - splitTotal\n newSplits[0].amount = remaining\n newSplits[0].inputValue = formatMoney(remaining)\n\n updateRowState({\n ...rowState,\n splits: newSplits,\n })\n setSplitFormError(undefined)\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.reduce((sum, split, index) => {\n const amount =\n index === 0 ? 0 : 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[0].amount = remaining\n rowState.splits[0].inputValue = formatMoney(remaining)\n updateRowState({ ...rowState })\n setSplitFormError(undefined)\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 setSplitFormError(undefined)\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 setSplitFormError(undefined)\n setMatchFormError(undefined)\n }\n\n const changeCategory = (index: number, newValue: CategoryOption) => {\n rowState.splits[index].category = newValue\n updateRowState({ ...rowState })\n setSplitFormError(undefined)\n }\n\n const save = async () => {\n if (purpose === Purpose.match) {\n if (!selectedMatchId) {\n setMatchFormError('Select an option to match the transaction')\n } else if (\n selectedMatchId &&\n selectedMatchId !== isAlreadyMatched(bankTransaction)\n ) {\n onMatchSubmit(selectedMatchId)\n }\n return\n }\n\n if (!validateSplit(rowState)) {\n if (rowState.splits.length > 1) {\n setSplitFormError(\n 'Use only positive amounts and select category for each entry',\n )\n } else {\n setSplitFormError('Category is required')\n }\n return\n }\n\n await categorizeBankTransaction(\n bankTransaction.id,\n rowState.splits.length === 1\n ? ({\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name: rowState?.splits[0].category?.payload.stable_name,\n },\n } as SingleCategoryUpdate)\n : ({\n type: 'Split',\n entries: rowState.splits.map(split => ({\n category: split.category?.payload.stable_name,\n amount: split.amount,\n })),\n } as SplitCategoryUpdate),\n )\n\n close()\n }\n\n // Call this save action after clicking save in parent component:\n useImperativeHandle(ref, () => ({\n save,\n }))\n\n const onMatchSubmit = async (matchId: string) => {\n const foundMatch = bankTransaction.suggested_matches?.find(\n x => x.id === matchId,\n )\n if (!foundMatch) {\n return\n }\n\n await matchBankTransaction(bankTransaction.id, foundMatch.id)\n close()\n }\n\n const getDivHeight = useCallback(() => {\n const { height } = bodyRef.current\n ? bodyRef.current.getBoundingClientRect()\n : { height: undefined }\n\n return height || 0\n }, [])\n\n const handleTransitionEnd = useCallback(\n (e: TransitionEvent<HTMLSpanElement>) => {\n if (e.propertyName === 'height') {\n setHeight(isOpen ? 'auto' : 0)\n if (!isOpen) {\n setOver(true)\n }\n }\n },\n [isOpen],\n )\n\n useEffect(() => {\n if (!isLoaded) {\n return\n }\n\n setHeight(getDivHeight())\n setOver(false)\n\n if (!isOpen) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setHeight(0))\n })\n }\n }, [getDivHeight, isOpen])\n\n useEffect(() => {\n setIsLoaded(true)\n setOver(true)\n }, [])\n\n const className = 'Layer__expanded-bank-transaction-row'\n const shouldHide = !isOpen && isOver\n\n return (\n <span\n className={`${className} ${className}--${\n isOpen ? 'expanded' : 'collapsed'\n }`}\n style={{ height }}\n onTransitionEnd={handleTransitionEnd}\n >\n {shouldHide ? null : (\n <span className={`${className}__wrapper`} ref={bodyRef}>\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 },\n {\n value: 'match',\n label: 'Match',\n disabled: !hasMatch(bankTransaction),\n disabledMessage: 'We could not find matching transactions',\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}__content-panels`}>\n <div\n className={classNames(\n `${className}__match`,\n `${className}__content-panel`,\n purpose === Purpose.match\n ? `${className}__content-panel--active`\n : '',\n )}\n >\n <div className={`${className}__content-panel-container`}>\n <MatchForm\n classNamePrefix={className}\n bankTransaction={bankTransaction}\n selectedMatchId={selectedMatchId}\n setSelectedMatchId={id => {\n setMatchFormError(undefined)\n setSelectedMatchId(id)\n }}\n matchFormError={matchFormError}\n />\n </div>\n </div>\n\n <div\n className={classNames(\n `${className}__splits`,\n `${className}__content-panel`,\n purpose === Purpose.categorize\n ? `${className}__content-panel--active`\n : '',\n )}\n >\n <div className={`${className}__content-panel-container`}>\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 <Input\n type='text'\n name={`split-${index}${asListItem ? '-li' : ''}`}\n disabled={index === 0}\n onChange={updateAmounts(index)}\n value={split.inputValue}\n onBlur={onBlur}\n isInvalid={split.amount < 0}\n errorMessage='Negative values are not allowed'\n />\n <div\n className={`${className}__table-cell--split-entry__right-col`}\n >\n <CategorySelect\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={split.category}\n onChange={value => changeCategory(index, value)}\n className='Layer__category-menu--full'\n disabled={bankTransaction.processing}\n />\n {index > 0 && (\n <Button\n className={`${className}__table-cell--split-entry__merge-btn`}\n onClick={() => removeSplit(index)}\n rightIcon={<Trash size={18} />}\n variant={ButtonVariant.secondary}\n iconOnly={true}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n {splitFormError && <ErrorText>{splitFormError}</ErrorText>}\n <div className={`${className}__total-and-btns`}>\n {rowState.splits.length > 1 && (\n <Input\n disabled={true}\n leftText='Total'\n value={`$${formatMoney(\n rowState.splits.reduce(\n (x, { amount }) => x + amount,\n 0,\n ),\n )}`}\n />\n )}\n <div className={`${className}__splits-buttons`}>\n {rowState.splits.length > 1 ? (\n <TextButton\n onClick={addSplit}\n disabled={rowState.splits.length > 5}\n >\n Add new split\n </TextButton>\n ) : (\n <Button\n onClick={addSplit}\n rightIcon={<Scissors size={14} />}\n variant={ButtonVariant.secondary}\n disabled={rowState.splits.length > 5}\n >\n Split\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <InputGroup\n className={`${className}__description`}\n name='description'\n >\n <Textarea name='description' placeholder='Add 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 {bankTransaction.error ? (\n <Text\n as='span'\n size={TextSize.md}\n className='Layer__unsaved-info'\n >\n <span>Unsaved</span>\n <AlertCircle size={12} />\n </Text>\n ) : null}\n <SubmitButton\n onClick={() => {\n if (!bankTransaction.processing) {\n save()\n }\n }}\n className='Layer__bank-transaction__submit-btn'\n processing={bankTransaction.processing}\n active={true}\n action={editable ? SubmitAction.SAVE : SubmitAction.UPDATE}\n >\n {submitBtnText}\n </SubmitButton>\n </div>\n ) : null}\n </div>\n <APIErrorNotifications\n bankTransaction={bankTransaction}\n containerWidth={containerWidth}\n />\n </span>\n )}\n </span>\n )\n },\n)\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 * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Trash = ({ 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='M2.25 4.5H3.75H15.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M14.25 4.5V15C14.25 15.3978 14.092 15.7794 13.8107 16.0607C13.5294 16.342 13.1478 16.5 12.75 16.5H5.25C4.85218 16.5 4.47064 16.342 4.18934 16.0607C3.90804 15.7794 3.75 15.3978 3.75 15V4.5M6 4.5V3C6 2.60218 6.15804 2.22064 6.43934 1.93934C6.72064 1.65804 7.10218 1.5 7.5 1.5H10.5C10.8978 1.5 11.2794 1.65804 11.5607 1.93934C11.842 2.22064 12 2.60218 12 3V4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M7.5 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5 8.25V12.75'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default Trash\n", "import React, { HTMLProps } from 'react'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport interface InputProps extends HTMLProps<HTMLInputElement> {\n isInvalid?: boolean\n errorMessage?: string\n leftText?: string\n}\n\nexport const Input = ({\n className,\n isInvalid,\n errorMessage,\n leftText,\n ...props\n}: InputProps) => {\n const baseClassName = classNames(\n 'Layer__input',\n isInvalid ? 'Layer__input--error' : '',\n leftText ? 'Layer__input--with-left-text' : '',\n className,\n )\n\n return (\n <Tooltip disabled={!isInvalid || !errorMessage}>\n <TooltipTrigger className='Layer__input-tooltip'>\n <input {...props} className={baseClassName} />\n {leftText && <span className='Layer__input-left-text'>{leftText}</span>}\n </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>{errorMessage}</TooltipContent>\n </Tooltip>\n )\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 inline?: boolean\n}\n\nexport const InputGroup = ({\n label,\n name,\n className,\n inline,\n children,\n}: InputGroupProps) => {\n const baseClassName = classNames(\n 'Layer__input-group',\n className,\n inline && 'Layer__input-group--inline',\n )\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 from 'react'\nimport { TextProps, Text } from './Text'\nimport classNames from 'classnames'\n\nexport type ErrorTextProps = TextProps\n\nexport const ErrorText = ({ className, ...props }: ErrorTextProps) => {\n const baseClassName = classNames('Layer__text--error', className)\n return <Text {...props} className={baseClassName} />\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 rightIcon={<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 from 'react'\nimport ReactSelect, {\n DropdownIndicatorProps,\n GroupBase,\n OptionsOrGroups,\n components,\n} from 'react-select'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\n\nexport interface SelectProps<T> {\n name?: string\n options?: OptionsOrGroups<T, GroupBase<T>>\n className?: string\n classNamePrefix?: string\n value?: T\n onChange: (selected: T) => void\n disabled?: boolean\n placeholder?: string\n}\n\nconst DropdownIndicator:\n | React.ComponentType<DropdownIndicatorProps<any, false, GroupBase<any>>>\n | null\n | undefined = props => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDownFill />\n </components.DropdownIndicator>\n )\n}\n\nexport const Select = <T,>({\n name,\n options,\n className,\n classNamePrefix = 'Layer__select',\n value,\n onChange,\n disabled,\n placeholder,\n}: SelectProps<T>) => {\n return (\n <ReactSelect<T>\n name={name}\n className={`Layer__select ${className ?? ''}`}\n classNamePrefix={classNamePrefix}\n placeholder={placeholder ?? 'Select...'}\n options={options}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n menuPortalTarget={document.body}\n styles={{ menuPortal: base => ({ ...base, zIndex: 9999 }) }}\n components={{ DropdownIndicator }}\n isDisabled={disabled}\n />\n )\n}\n", "import React from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction } from '../../types'\nimport { MatchBadge } from '../BankTransactionRow/MatchBadge'\nimport { Text, TextUseTooltip, ErrorText } from '../Typography'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface MatchFormProps {\n classNamePrefix: string\n bankTransaction: BankTransaction\n selectedMatchId?: string\n setSelectedMatchId: (val?: string) => void\n matchFormError?: string\n}\n\nexport const MatchForm = ({\n classNamePrefix,\n bankTransaction,\n selectedMatchId,\n setSelectedMatchId,\n matchFormError,\n}: MatchFormProps) => {\n return (\n <div className={`${classNamePrefix}__match-table`}>\n <div className={`${classNamePrefix}__match-table__header`}>\n <div className={`${classNamePrefix}__match-table__date`}>Date</div>\n <div className={`${classNamePrefix}__match-table__desc`}>\n Description\n </div>\n <div className={`${classNamePrefix}__match-table__amount`}>Amount</div>\n\n <div\n className={`${classNamePrefix}__match-table__status ${\n bankTransaction.match ? '' : 'no-match'\n }`}\n ></div>\n </div>\n\n {bankTransaction.suggested_matches?.map((match, idx) => {\n return (\n <div\n key={idx}\n className={classNames(\n `${classNamePrefix}__match-row`,\n match.id === selectedMatchId\n ? `${classNamePrefix}__match-row--selected`\n : '',\n )}\n onClick={() => {\n if (selectedMatchId === match.id) {\n setSelectedMatchId(undefined)\n return\n }\n setSelectedMatchId(match.id)\n }}\n >\n <div\n className={`Layer__nowrap ${classNamePrefix}__match-table__date`}\n >\n <span>\n {formatTime(parseISO(match.details.date), DATE_FORMAT)}\n </span>\n <span className='amount-next-to-date'>\n ${formatMoney(match.details.amount)}\n </span>\n </div>\n <div className={`${classNamePrefix}__match-table__desc`}>\n <Text\n className={`${classNamePrefix}__match-table__desc-tooltip`}\n withTooltip={TextUseTooltip.whenTruncated}\n as='span'\n >\n {match.details.description}\n </Text>\n {match.details.id === bankTransaction.match?.details.id && (\n <span className='match-badge'>\n <MatchBadge\n classNamePrefix={classNamePrefix}\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n </span>\n )}\n </div>\n <div className={`${classNamePrefix}__match-table__amount`}>\n ${formatMoney(match.details.amount)}\n </div>\n\n <div\n className={`${classNamePrefix}__match-table__status ${\n bankTransaction.match ? '' : 'no-match'\n }`}\n >\n {match.details.id === bankTransaction.match?.details.id && (\n <MatchBadge\n classNamePrefix={classNamePrefix}\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n )}\n </div>\n </div>\n )\n })}\n {matchFormError && <ErrorText>{matchFormError}</ErrorText>}\n </div>\n )\n}\n", "import React from 'react'\nimport MinimizeTwo from '../../icons/MinimizeTwo'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { Badge } from '../Badge'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface MatchBadgeProps {\n bankTransaction: BankTransaction\n classNamePrefix: string\n dateFormat: string\n text?: string\n}\n\nexport const MatchBadge = ({\n bankTransaction,\n classNamePrefix,\n dateFormat,\n text = 'Match',\n}: MatchBadgeProps) => {\n if (\n bankTransaction.categorization_status === CategorizationStatus.MATCHED &&\n bankTransaction.match\n ) {\n const { date, amount } = bankTransaction.match.bank_transaction\n\n return (\n <Badge\n icon={<MinimizeTwo size={11} />}\n tooltip={\n <span className={`${classNamePrefix}__match-tooltip`}>\n <div className={`${classNamePrefix}__match-tooltip__date`}>\n {formatTime(parseISO(date), dateFormat)}\n </div>\n <div className={`${classNamePrefix}__match-tooltip__description`}>\n {bankTransaction.match?.details?.description ?? ''}\n </div>\n <div className={`${classNamePrefix}__match-tooltip__amount`}>\n ${formatMoney(amount)}\n </div>\n </span>\n }\n >\n {text}\n </Badge>\n )\n }\n\n return\n}\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 { Tooltip, TooltipContent, TooltipTrigger } from '../Tooltip'\nimport classNames from 'classnames'\n\nexport interface Option {\n label: string\n value: string\n disabled?: boolean\n disabledMessage?: string\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 disabledMessage?: string\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.5)\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 disabledMessage={option.disabledMessage}\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 disabledMessage = 'Disabled',\n index,\n}: ToggleOptionProps) => {\n if (disabled) {\n return (\n <Tooltip>\n <TooltipTrigger>\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 <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 </TooltipTrigger>\n <TooltipContent className='Layer__tooltip'>\n {disabledMessage}\n </TooltipContent>\n </Tooltip>\n )\n }\n\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 <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, { useEffect, useState } from 'react'\nimport AlertOctagon from '../../icons/AlertOctagon'\nimport { BankTransaction } from '../../types'\nimport { Text } from '../Typography'\n\ninterface APIErrorNotificationsProps {\n bankTransaction: BankTransaction\n containerWidth?: number\n}\n\ninterface Notification {\n bankTransactionId: string\n timestamp: number\n title: string\n message: string\n}\n\nconst ERROR_TITLE = 'Approval Failed'\nconst ERROR_MESSAGE = 'Something went wrong, try again later'\nconst NOTIFICATION_TIME = 4000\nconst FADE_OUT_TIME_WAIT = 1000\n\nlet notificationsCache: Notification[] = []\n\nexport const APIErrorNotifications = ({\n bankTransaction,\n containerWidth,\n}: APIErrorNotificationsProps) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const pushNotification = (title: string, message: string) => {\n const timestamp = new Date().valueOf()\n if (\n notificationsCache.find(\n n =>\n n.timestamp === timestamp &&\n n.bankTransactionId !== bankTransaction.id,\n )\n ) {\n return\n }\n notificationsCache = notificationsCache.concat({\n bankTransactionId: bankTransaction.id,\n timestamp,\n title,\n message,\n })\n const ids = notificationsCache.map(\n ({ bankTransactionId }) => bankTransactionId,\n )\n const timestamps = notificationsCache.map(({ timestamp }) => timestamp)\n notificationsCache = notificationsCache.filter(\n ({ bankTransactionId, timestamp }, index) =>\n !ids.includes(bankTransactionId, index + 1) &&\n !timestamps.includes(timestamp, index + 1),\n )\n setNotifications(notificationsCache.concat())\n }\n\n const deleteNotification = (timestamp: number) => {\n notificationsCache = notificationsCache.filter(\n n => n.timestamp !== timestamp,\n )\n setNotifications(notificationsCache.concat())\n }\n\n useEffect(() => {\n if (bankTransaction.error) {\n pushNotification(ERROR_TITLE, ERROR_MESSAGE)\n }\n }, [bankTransaction.error])\n\n return (\n <div\n className='Layer__bank-transactions__notifications'\n style={containerWidth ? { left: containerWidth - 324 } : {}}\n >\n {notifications\n .filter(n => n.bankTransactionId === bankTransaction.id)\n .map(notification => (\n <Notification\n key={notification.timestamp}\n notification={notification}\n deleteNotification={deleteNotification}\n />\n ))}\n </div>\n )\n}\n\nconst Notification = ({\n notification,\n deleteNotification,\n}: {\n notification: Notification\n deleteNotification: (timestamp: number) => void\n}) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n setVisible(true)\n\n const timer = setTimeout(() => {\n hideNotification()\n }, NOTIFICATION_TIME)\n\n return () => clearTimeout(timer)\n }, [])\n\n const hideNotification = () => {\n setVisible(false)\n setTimeout(() => {\n deleteNotification(notification.timestamp)\n }, FADE_OUT_TIME_WAIT)\n }\n\n return (\n <div\n className={`Layer__bank-transactions__notification ${\n visible ? 'notification-enter' : 'notification-exit'\n }`}\n onClick={hideNotification}\n >\n <div className='Layer__bank-transactions__notification-content'>\n <div className='Layer__bank-transactions__notification-icon'>\n <AlertOctagon size={14} />\n </div>\n <div className='Layer__bank-transactions__notification-text'>\n <Text\n as='span'\n className='Layer__bank-transactions__notification-title'\n >\n {notification.title}\n </Text>\n <Text\n as='span'\n className='Layer__bank-transactions__notification-message'\n >\n {notification.message}\n </Text>\n </div>\n </div>\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 from 'react'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { Category } from '../../types'\n\nexport const SplitTooltipDetails = ({\n classNamePrefix,\n category,\n}: {\n classNamePrefix: string\n category: Category\n}) => {\n if (!category.entries) {\n return\n }\n\n return (\n <span className={`${classNamePrefix}__split-tooltip`}>\n <ul>\n {category.entries.map((entry, idx) => (\n <li key={idx}>\n <span className={`${classNamePrefix}__split-tooltip__label`}>\n {entry.category.display_name}\n </span>\n <span className={`${classNamePrefix}__split-tooltip__value`}>\n ${formatMoney(entry.amount)}\n </span>\n </li>\n ))}\n </ul>\n </span>\n )\n}\n", "import React from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport Scissors from '../../icons/Scissors'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { Badge } from '../Badge'\nimport { extractDescriptionForSplit } from '../BankTransactionRow/BankTransactionRow'\nimport { MatchBadge } from '../BankTransactionRow/MatchBadge'\nimport { SplitTooltipDetails } from '../BankTransactionRow/SplitTooltipDetails'\nimport { Text } from '../Typography'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface AssignmentProps {\n bankTransaction: BankTransaction\n}\n\nexport const Assignment = ({ bankTransaction }: AssignmentProps) => {\n if (\n bankTransaction.match &&\n bankTransaction.categorization_status === CategorizationStatus.MATCHED\n ) {\n return (\n <>\n <MatchBadge\n classNamePrefix='Layer__bank-transaction-list-item'\n bankTransaction={bankTransaction}\n dateFormat={DATE_FORMAT}\n text='Matched'\n />\n <Text className='Layer__bank-transaction-list-item__category-text__text'>\n {`${formatTime(\n parseISO(bankTransaction.match.bank_transaction.date),\n DATE_FORMAT,\n )}, ${bankTransaction.match.bank_transaction.description}`}\n </Text>\n </>\n )\n }\n\n if (bankTransaction.categorization_status === CategorizationStatus.SPLIT) {\n return (\n <>\n <Badge\n icon={<Scissors size={11} />}\n tooltip={\n <SplitTooltipDetails\n classNamePrefix='Layer__bank-transaction-list-item'\n category={bankTransaction.category}\n />\n }\n >\n Split\n </Badge>\n <Text className='Layer__bank-transaction-list-item__category-text__text'>\n {extractDescriptionForSplit(bankTransaction.category)}\n </Text>\n </>\n )\n }\n\n return <Text>{bankTransaction?.category?.display_name}</Text>\n}\n", "import React, { ReactNode, forwardRef } 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 elevated?: boolean\n children: ReactNode\n}\n\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(\n ({ name, className, children, asWidget, elevated = false }, ref) => {\n const baseClassName = classNames(\n 'Layer__component Layer__component-container',\n `Layer__${name}`,\n elevated && 'Layer__component--elevated',\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 ref={ref} className={baseClassName} style={{ ...styles }}>\n {children}\n </div>\n )\n },\n)\n", "export const SHADES = {\n 50: { s: 1, l: 98 },\n 100: { s: 1, l: 96 },\n 200: { s: 1, l: 94 },\n 300: { s: 2, l: 92 },\n 500: { s: 5, l: 53 },\n 600: { s: 7, l: 40 },\n 700: { s: 9, l: 27 },\n 800: { s: 12, l: 20 },\n 1000: { s: 20, l: 7 },\n}\n\nexport const COLORS = {\n dark: {\n h: 0,\n s: 0,\n l: 7,\n },\n light: {\n h: 0,\n s: 0,\n l: 100,\n },\n}\n", "import { COLORS, SHADES } from '../config/theme'\nimport {\n LayerThemeConfig,\n ColorConfig,\n ColorRGBConfig,\n ColorRGBNumberConfig,\n ColorHSLNumberConfig,\n ColorsPalette,\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 * Parse the color from theme config into a CSS variables.\n * @param {string} colorName\n * @param {ColorConfig} color\n */\nconst parseColorFromThemeToHsl = (\n color?: ColorConfig,\n): ColorHSLNumberConfig | undefined => {\n if (!color) {\n return\n }\n\n try {\n if ('h' in color && 's' in color && 'l' in color) {\n return {\n h: Number(color.h),\n s: Number(color.s),\n l: Number(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 h: h,\n s: s,\n l: l,\n }\n }\n\n if ('hex' in color) {\n const rgb = hexToRgb(color.hex)\n if (!rgb) {\n return undefined\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 h: h,\n s: s,\n 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\n/**\n * Build same color palette in RGB, HSL and HEX as CSS variables.\n */\nexport const buildColorsPalette = (theme?: LayerThemeConfig): ColorsPalette => {\n const darkColor = parseColorFromThemeToHsl(theme?.colors?.dark) ?? COLORS.dark\n const lightColor =\n parseColorFromThemeToHsl(theme?.colors?.light) ?? COLORS.light\n\n return {\n 50: buildColorShade(50, darkColor),\n 100: buildColorShade(100, darkColor),\n 200: buildColorShade(200, darkColor),\n 300: buildColorShade(300, darkColor),\n 400: {\n hsl: lightColor,\n rgb: hslToRgb(lightColor),\n hex: hslToHex(lightColor),\n },\n 500: buildColorShade(500, darkColor),\n 600: buildColorShade(600, darkColor),\n 700: buildColorShade(700, darkColor),\n 800: buildColorShade(800, darkColor),\n 900: {\n hsl: darkColor,\n rgb: hslToRgb(darkColor),\n hex: hslToHex(darkColor),\n },\n 1000: buildColorShade(1000, darkColor),\n }\n}\n\n/**\n * Build color shade based on the dark color (HSL)\n * and config values for S and L.\n */\nconst buildColorShade = (\n shade: keyof typeof SHADES,\n darkColorHsl: ColorHSLNumberConfig,\n) => {\n const hsl = { h: darkColorHsl.h, ...SHADES[shade] }\n const rgb = hslToRgb(hsl)\n const hex = hslToHex(hsl)\n\n return { hsl, rgb, hex }\n}\n/**\n * Convert Hue into RGB\n */\nconst hueToRgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1.0 / 6.0) return p + (q - p) * 6 * t\n if (t < 1.0 / 2.0) return q\n if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6\n return p\n}\n\n/**\n * Convert HSL to RGB\n */\nconst hslToRgb = (hsl: ColorHSLNumberConfig): ColorRGBNumberConfig => {\n let r, g, b\n let l = hsl.l / 100\n let s = hsl.s / 100\n\n if (hsl.s === 0) {\n r = g = b = l\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n r = hueToRgb(p, q, hsl.h + 1.0 / 3.0)\n g = hueToRgb(p, q, hsl.h)\n b = hueToRgb(p, q, hsl.h - 1.0 / 3.0)\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n }\n}\n\n/**\n * Convert HSL to HEX\n */\nconst hslToHex = (hsl: ColorHSLNumberConfig): string => {\n const l = hsl.l / 100\n const s = hsl.s\n const a = (s * Math.min(l, 1 - l)) / 100\n const f = (n: number) => {\n const k = (n + hsl.h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0')\n }\n return `#${f(0)}${f(8)}${f(4)}`\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 info = 'info',\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 case DataStateStatus.info:\n return (\n <span className='Layer__data-state__icon Layer__data-state__icon--neutral'>\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 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 { usePagination, DOTS } from '../../hooks/usePagination'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport classnames from 'classnames'\n\nexport interface PaginationProps {\n currentPage: number\n pageSize: number\n onPageChange: (page: number) => void\n totalCount: number\n siblingCount?: number\n}\n\nexport const Pagination = ({\n onPageChange,\n totalCount,\n siblingCount = 1,\n currentPage,\n pageSize,\n}: PaginationProps) => {\n const paginationRange = usePagination({\n currentPage,\n totalCount,\n siblingCount,\n pageSize,\n })\n\n if (!paginationRange) {\n return\n }\n\n if (currentPage === 0 || paginationRange.length < 2) {\n return\n }\n\n let lastPage = paginationRange[paginationRange.length - 1]\n\n return (\n <ul className='Layer__pagination'>\n <li\n key={`page-prev`}\n className={classnames(\n 'Layer__pagination-item Layer__pagination-arrow Layer__pagination-arrow--previous',\n {\n disabled: currentPage === 1,\n },\n )}\n onClick={() => onPageChange(currentPage - 1)}\n >\n <ChevronLeft size={12} />\n </li>\n {paginationRange.map(pageNumber => {\n if (pageNumber === DOTS) {\n return (\n <li\n key={`page-${pageNumber}`}\n className='Layer__pagination-item Layer__pagination-dots'\n >\n &#8230;\n </li>\n )\n }\n\n return (\n <li\n key={`page-${pageNumber}`}\n className={classnames('Layer__pagination-item', {\n selected: pageNumber === currentPage,\n })}\n onClick={() => {\n if (typeof pageNumber === 'number') {\n onPageChange(pageNumber)\n }\n }}\n >\n {pageNumber}\n </li>\n )\n })}\n <li\n key={`page-last`}\n className={classnames(\n 'Layer__pagination-item Layer__pagination-arrow Layer__pagination-arrow--next',\n {\n disabled: currentPage === lastPage,\n },\n )}\n onClick={() => onPageChange(currentPage + 1)}\n >\n <ChevronRight size={12} />\n </li>\n </ul>\n )\n}\n", "import { useMemo } from 'react'\nimport { range } from '../../utils/helpers'\n\nexport const DOTS = '...'\n\nexport interface UsePaginationProps {\n totalCount: number\n pageSize: number\n siblingCount?: number\n currentPage: number\n}\n\nexport type UsePaginationReturn = (string | number)[] | undefined\n\nexport const usePagination = ({\n totalCount,\n pageSize,\n siblingCount = 1,\n currentPage,\n}: UsePaginationProps): UsePaginationReturn => {\n const paginationRange = useMemo(() => {\n const totalPageCount = Math.ceil(totalCount / pageSize)\n const totalPageNumbers = siblingCount + 5\n\n if (totalPageNumbers >= totalPageCount) {\n return range(1, totalPageCount)\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(\n currentPage + siblingCount,\n totalPageCount,\n )\n const shouldShowLeftDots = leftSiblingIndex > 2\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2\n\n const firstPageIndex = 1\n const lastPageIndex = totalPageCount\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n let leftItemCount = 3 + 2 * siblingCount\n let leftRange = range(1, leftItemCount)\n\n return [...leftRange, DOTS, totalPageCount]\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n let rightItemCount = 3 + 2 * siblingCount\n let rightRange = range(\n totalPageCount - rightItemCount + 1,\n totalPageCount,\n )\n return [firstPageIndex, DOTS, ...rightRange]\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n let middleRange = range(leftSiblingIndex, rightSiblingIndex)\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex]\n }\n }, [totalCount, pageSize, siblingCount, currentPage])\n\n return paginationRange\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChevronLeft = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='18'\n height='18'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n >\n <path\n d='M11.25 13.5L6.75 9L11.25 4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default ChevronLeft\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst ChavronRight = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='18'\n height='18'\n viewBox='0 0 18 18'\n fill='none'\n {...props}\n >\n <path\n d='M6.75 13.5L11.25 9L6.75 4.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default ChavronRight\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 from 'react'\nimport { useLinkedAccounts } from '../../hooks/useLinkedAccounts'\nimport PlusIcon from '../../icons/PlusIcon'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { LinkedAccountOptions } from '../LinkedAccountOptions'\nimport { LinkedAccountThumb } from '../LinkedAccountThumb'\nimport { Loader } from '../Loader'\nimport { Heading, HeadingSize, Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nconst COMPONENT_NAME = 'linked-accounts'\n\nexport interface LinkedAccountsProps {\n asWidget?: boolean\n elevated?: boolean\n}\n\nexport const LinkedAccounts = ({ asWidget, elevated }: LinkedAccountsProps) => {\n const {\n data,\n isLoading,\n error,\n isValidating,\n refetchAccounts,\n addConnection,\n unlinkAccount,\n renewLinkAccount,\n } = useLinkedAccounts()\n\n const linkedAccountOptionsConfig = [\n { name: 'Renew link', action: renewLinkAccount },\n { name: 'Unlink', action: unlinkAccount },\n ]\n\n const linkedAccountsNewAccountClassName = classNames(\n 'Layer__linked-accounts__new-account',\n asWidget && '--as-widget',\n )\n\n return (\n <Container name={COMPONENT_NAME} elevated={elevated}>\n <Header className='Layer__linked-accounts__header'>\n <Heading\n className='Layer__linked-accounts__title'\n size={HeadingSize.secondary}\n >\n Linked Accounts\n </Heading>\n </Header>\n {isLoading && (\n <div className='Layer__linked-accounts__loader-container'>\n <Loader />\n </div>\n )}\n {error && !isLoading ? (\n <DataState\n status={DataStateStatus.failed}\n title='Something went wrong'\n description='We couldn\u2019t load your data.'\n onRefresh={() => refetchAccounts()}\n isLoading={isValidating}\n />\n ) : null}\n {!error && !isLoading ? (\n <div className='Layer__linked-accounts__list'>\n {data?.map((account, index) => (\n <LinkedAccountOptions\n key={`linked-acc-${index}`}\n config={linkedAccountOptionsConfig}\n accountId={account.external_account_external_id}\n plaidItemId={'TODO' /*account.connection_id*/}\n >\n <LinkedAccountThumb account={account} asWidget={asWidget} />\n </LinkedAccountOptions>\n ))}\n <div\n role='button'\n tabIndex={0}\n aria-label='new-account'\n onClick={() => addConnection('PLAID')}\n className={linkedAccountsNewAccountClassName}\n >\n <div className='Layer__linked-accounts__new-account-label'>\n <PlusIcon size={15} />\n <Text as='span' size={'sm' as TextSize}>\n Add Account\n </Text>\n </div>\n </div>\n </div>\n ) : null}\n </Container>\n )\n}\n", "import { useEffect, useState } from 'react'\nimport { PlaidLinkOnSuccessMetadata, usePlaidLink } from 'react-plaid-link'\nimport { Layer } from '../../api/layer'\nimport { LinkedAccount } from '../../types/linked_accounts'\nimport { useLayerContext } from '../useLayerContext'\nimport { LINKED_ACCOUNTS_MOCK_DATA } from './mockData'\nimport useSWR from 'swr'\n\ntype Source = 'PLAID' | 'STRIPE'\n\ntype UseLinkedAccounts = () => {\n data?: LinkedAccount[]\n isLoading: boolean\n isValidating: boolean\n error: unknown\n addConnection: (source: Source) => void\n removeConnection: (source: Source, sourceId: string) => void // means, \"unlink institution\"\n refetchAccounts: () => void\n unlinkAccount: (plaidAccountId: string) => void\n renewLinkAccount: () => void\n}\n\nconst DEBUG = true\nconst USE_MOCK_RESPONSE_DATA = false\n\n// Note: you will need to be using a business whose client's plaid client and plaid secret correspond to the\n// plaid sandbox account\nconst USE_PLAID_SANDBOX = true\n\nexport const useLinkedAccounts: UseLinkedAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n const [linkToken, setLinkToken] = useState<string | null>(null)\n\n const {\n data: responseData,\n isLoading,\n isValidating,\n error: responseError,\n mutate,\n } = useSWR(\n businessId && auth?.access_token && `linked-accounts-${businessId}`,\n Layer.getLinkedAccounts(apiUrl, auth?.access_token, {\n params: { businessId },\n }),\n )\n\n // Fetch link token on component load\n useEffect(() => {\n const getLinkToken = async () => {\n if (auth?.access_token) {\n const linkToken = (\n await Layer.getPlaidLinkToken(apiUrl, auth.access_token, {\n params: { businessId },\n })\n ).data.link_token\n setLinkToken(linkToken)\n }\n }\n getLinkToken()\n }, [setLinkToken, auth?.access_token])\n\n /**\n * When the user has finished entering credentials, send the resulting\n * token to the backend where it will fetch and save the Plaid access token\n * and item id\n * */\n const exchangePublicToken = async (\n publicToken: string,\n metadata: PlaidLinkOnSuccessMetadata,\n ) => {\n await Layer.exchangePlaidPublicToken(apiUrl, auth?.access_token, {\n params: { businessId },\n body: { public_token: publicToken, institution_id: metadata.institution },\n })\n\n refetchAccounts()\n }\n\n const { open: plaidLinkStart, ready: plaidLinkReady } = usePlaidLink({\n token: linkToken,\n onSuccess: exchangePublicToken,\n env: USE_PLAID_SANDBOX ? 'sandbox' : undefined,\n })\n\n const mockResponseData = {\n data: LINKED_ACCOUNTS_MOCK_DATA,\n meta: {},\n error: undefined,\n }\n\n const addConnection = (source: Source) => {\n if (source === 'PLAID') {\n linkPlaidItem()\n } else {\n console.error(`Connection with source ${source} not yet supported`)\n }\n }\n\n const removeConnection = (source: Source, connectionId: string) => {\n if (source === 'PLAID') {\n unlinkPlaidItem(connectionId)\n } else {\n console.error(`Connection with source ${source} not yet supported`)\n }\n }\n\n const linkPlaidItem = async () => {\n DEBUG && console.log('add account...')\n // TODO: display error if not ready\n console.log('plaidLinkReady', plaidLinkReady)\n plaidLinkReady && plaidLinkStart()\n }\n\n const unlinkPlaidItem = (plaidItemId: string) => {\n DEBUG && console.log('unlinking plaid item')\n Layer.unlinkPlaidItem(apiUrl, auth?.access_token, {\n params: { businessId, plaidItemId },\n })\n }\n\n const unlinkAccount = (plaidAccountId: string) => {\n DEBUG && console.log('unlinking account')\n Layer.unlinkPlaidAccount(apiUrl, auth?.access_token, {\n params: { businessId, accountId: plaidAccountId },\n })\n }\n\n const renewLinkAccount = () => {\n DEBUG && console.log('relink account...')\n }\n\n const refetchAccounts = () => {\n DEBUG && console.log('refetching plaid accounts...')\n mutate()\n }\n\n return {\n data: USE_MOCK_RESPONSE_DATA\n ? mockResponseData.data\n : responseData?.data.external_accounts,\n isLoading,\n isValidating,\n error: responseError,\n addConnection,\n removeConnection,\n refetchAccounts,\n unlinkAccount,\n renewLinkAccount,\n }\n}\n", "import { LinkedAccount } from '../../types/linked_accounts'\n\nexport const LINKED_ACCOUNTS_MOCK_DATA: LinkedAccount[] = [\n {\n id: '1',\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n external_account_name: 'Citi Double Cash\u00AE Card',\n //external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: {\n name: 'Chase',\n logo: '',\n },\n //connection_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n //connection_status: 'OK',\n },\n {\n id: '2',\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n external_account_name: 'Citi Double Cash\u00AE Card',\n //external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: {\n name: 'Chase',\n logo: '',\n },\n //connection_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n //connection_status: 'OK',\n },\n {\n id: '3',\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n external_account_name: 'Citi Double Cash\u00AE Card',\n //external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: {\n name: 'Chase',\n logo: '',\n },\n //connection_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n //connection_status: 'OK',\n },\n {\n id: '4',\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n external_account_name: 'Citi Double Cash\u00AE Card',\n //external_account_number: '1234',\n latest_balance_timestamp: {\n external_account_external_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n external_account_source: 'PLAID',\n balance: 435121,\n at: '2024-04-03T13:00:00Z',\n created_at: '2024-04-06T16:44:35.715458Z',\n },\n current_ledger_balance: 373717,\n institution: {\n name: 'Chase',\n logo: '',\n },\n //connection_id: '0Br385JmgbTryJn8nEBnUb4A5ydv06U9Vbqqq',\n //connection_status: 'OK',\n },\n]\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst PlusIcon = ({ size = 14, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 16 16'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M14.6667 8.49996C14.6667 4.81806 11.6819 1.83329 8.00004 1.83329C4.31814 1.83329 1.33337 4.81806 1.33337 8.49996C1.33337 12.1819 4.31814 15.1666 8.00004 15.1666C11.6819 15.1666 14.6667 12.1819 14.6667 8.49996Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M5.33337 8.5L10.6667 8.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8 11.1666L8 5.83329'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default PlusIcon\n", "import React from 'react'\nimport MoreVertical from '../../icons/MoreVertical'\nimport { HoverMenu, HoverMenuProps } from '../HoverMenu'\n\ninterface LinkedAccountOptionsProps extends HoverMenuProps {}\n\nexport const LinkedAccountOptions = ({\n children,\n config,\n accountId,\n plaidItemId,\n}: LinkedAccountOptionsProps) => {\n return (\n <div className='Layer__linked-accounts__options'>\n <div className='Layer__linked-accounts__options-overlay'>\n <div className='Layer__linked-accounts__options-overlay-button'>\n <HoverMenu\n config={config}\n accountId={accountId}\n plaidItemId={plaidItemId}\n >\n <MoreVertical size={16} />\n </HoverMenu>\n </div>\n </div>\n {children}\n </div>\n )\n}\n", "import React from 'react'\nimport { IconSvgProps } from './types'\n\nconst MoreVertical = ({ size = 18, ...props }: IconSvgProps) => {\n return (\n <svg\n viewBox='0 0 16 14'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <path\n d='M8.66659 8C8.66659 7.63181 8.36811 7.33333 7.99992 7.33333C7.63173 7.33333 7.33325 7.63181 7.33325 8C7.33325 8.36819 7.63173 8.66667 7.99992 8.66667C8.36811 8.66667 8.66659 8.36819 8.66659 8Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8.66659 3.33333C8.66659 2.96514 8.36811 2.66667 7.99992 2.66667C7.63173 2.66667 7.33325 2.96514 7.33325 3.33333C7.33325 3.70152 7.63173 4 7.99992 4C8.36811 4 8.66659 3.70152 8.66659 3.33333Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M8.66659 12.6667C8.66659 12.2985 8.36811 12 7.99992 12C7.63173 12 7.33325 12.2985 7.33325 12.6667C7.33325 13.0349 7.63173 13.3333 7.99992 13.3333C8.36811 13.3333 8.66659 13.0349 8.66659 12.6667Z'\n fill='currentColor'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n )\n}\n\nexport default MoreVertical\n", "import React, { ReactNode, useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\n\nexport interface HoverMenuProps {\n children: ReactNode\n config: {\n name: string\n action: (plaidItemId: string, accountId: string) => void\n }[]\n plaidItemId: string\n accountId: string\n}\n\nexport const HoverMenu = ({\n children,\n config,\n plaidItemId,\n accountId,\n}: HoverMenuProps) => {\n const [openMenu, setOpenMenu] = useState(false)\n const hoverMenuRef = useRef<HTMLDivElement>(null)\n\n const hoverMenuClassName = classNames(\n 'Layer__hover-menu',\n openMenu && 'Layer__hover-menu--open',\n )\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n hoverMenuRef.current &&\n !hoverMenuRef.current.contains(event.target as Node)\n ) {\n setOpenMenu(false)\n }\n }\n\n document.addEventListener('click', handleClickOutside)\n return () => {\n document.removeEventListener('click', handleClickOutside)\n }\n }, [])\n\n return (\n <div\n className={hoverMenuClassName}\n ref={hoverMenuRef}\n onMouseLeave={() => setOpenMenu(false)}\n >\n <div\n className='Layer__hover-menu__children'\n role='button'\n onMouseEnter={() => setOpenMenu(true)}\n onClick={() => setOpenMenu(true)}\n >\n {children}\n </div>\n <div className='Layer__hover-menu__list-wrapper'>\n <ul className='Layer__hover-menu__list'>\n {config &&\n config.length > 0 &&\n config.map(item => (\n <li\n key={`hover-menu-${item.name}`}\n className='Layer__hover-menu__list-item'\n >\n <button\n className='Layer__hover-menu__list-item-button'\n onClick={() => item.action(plaidItemId, accountId)}\n >\n {item.name}\n </button>\n </li>\n ))}\n </ul>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport InstitutionIcon from '../../icons/InstitutionIcon'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { LinkedAccount } from '../../types/linked_accounts'\nimport { Text, TextSize } from '../Typography'\nimport classNames from 'classnames'\n\nexport interface LinkedAccountThumbProps {\n account: LinkedAccount\n asWidget?: boolean\n}\n\nconst AccountNumber = ({ accountNumber }: { accountNumber: string }) => (\n <div className='account-number'>\n <Text size={'sm' as TextSize}>\u2022\u2022\u2022{accountNumber}</Text>\n </div>\n)\n\nexport const LinkedAccountThumb = ({\n account,\n asWidget,\n}: LinkedAccountThumbProps) => {\n const linkedAccountThumbClassName = classNames(\n 'Layer__linked-account-thumb',\n asWidget && '--as-widget',\n )\n\n return (\n <div className={linkedAccountThumbClassName}>\n <div className='topbar'>\n <div className='topbar-details'>\n <Text as='span' className='account-name'>\n {account.external_account_name}\n </Text>\n {!asWidget && (\n <AccountNumber\n accountNumber={'TODO' /*account.external_account_number*/}\n />\n )}\n <Text\n as='span'\n className='account-institution'\n size={'sm' as TextSize}\n >\n {account.institution?.name}\n </Text>\n </div>\n <div className='topbar-logo'>\n {!account.institution?.logo && <InstitutionIcon />}\n </div>\n </div>\n {!asWidget && (\n <div className='middlebar'>\n <Text\n as='span'\n className='account-balance-text'\n size={'sm' as TextSize}\n >\n Bank balance\n </Text>\n <Text as='span' className='account-balance'>\n ${formatMoney(account.latest_balance_timestamp.balance)}\n </Text>\n </div>\n )}\n <div className='bottombar'>\n {asWidget ? (\n <AccountNumber\n accountNumber={'TODO' /*account.external_account_number*/}\n />\n ) : (\n <Text\n as='span'\n className='account-balance-text'\n size={'sm' as TextSize}\n >\n General ledger balance\n </Text>\n )}\n <Text as='span' className='account-balance'>\n ${formatMoney(account.current_ledger_balance)}\n </Text>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst InstitutionIcon = ({ size = 18, ...props }: IconSvgProps) => (\n <svg\n viewBox='0 0 27 28'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n width={size}\n height={size}\n >\n <g filter='url(#filter0_i_2320_122784)'>\n <path\n d='M0 8.50225C0 8.13268 0.20383 7.79324 0.530047 7.61956L13.03 0.964441C13.3238 0.80803 13.6762 0.808029 13.97 0.964441L26.47 7.61956C26.7962 7.79324 27 8.13268 27 8.50225V9.71423C27 10.2665 26.5523 10.7142 26 10.7142H0.999999C0.447715 10.7142 0 10.2665 0 9.71423V8.50225Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter1_i_2320_122784)'>\n <path\n d='M3 13C3 12.4477 3.44772 12 4 12H7C7.55228 12 8 12.4477 8 13V20C8 20.5523 7.55228 21 7 21H4C3.44772 21 3 20.5523 3 20L3 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter2_i_2320_122784)'>\n <path\n d='M11 13C11 12.4477 11.4477 12 12 12H15C15.5523 12 16 12.4477 16 13V20C16 20.5523 15.5523 21 15 21H12C11.4477 21 11 20.5523 11 20L11 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter3_i_2320_122784)'>\n <path\n d='M19 13C19 12.4477 19.4477 12 20 12H23C23.5523 12 24 12.4477 24 13V20C24 20.5523 23.5523 21 23 21H20C19.4477 21 19 20.5523 19 20L19 13Z'\n fill='currentColor'\n />\n </g>\n <g filter='url(#filter4_i_2320_122784)'>\n <path\n d='M1 23.2856C1 22.7334 1.44772 22.2856 2 22.2856H25C25.5523 22.2856 26 22.7334 26 23.2856V26.2856C26 26.8379 25.5523 27.2856 25 27.2856H2C1.44772 27.2856 1 26.8379 1 26.2856L1 23.2856Z'\n fill='currentColor'\n />\n </g>\n <defs>\n <filter\n id='filter0_i_2320_122784'\n x='0'\n y='0.847168'\n width='27'\n height='9.86707'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter1_i_2320_122784'\n x='3'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter2_i_2320_122784'\n x='11'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter3_i_2320_122784'\n x='19'\n y='12'\n width='5'\n height='9'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n <filter\n id='filter4_i_2320_122784'\n x='1'\n y='22.2856'\n width='25'\n height='5'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood floodOpacity='0' result='BackgroundImageFix' />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='BackgroundImageFix'\n result='shape'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset />\n <feGaussianBlur stdDeviation='0.5' />\n <feComposite in2='hardAlpha' operator='arithmetic' k2='-1' k3='1' />\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.04 0'\n />\n <feBlend\n mode='normal'\n in2='shape'\n result='effect1_innerShadow_2320_122784'\n />\n </filter>\n </defs>\n </svg>\n)\n\nexport default InstitutionIcon\n", "import React, { PropsWithChildren, createContext } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ReportingBasis } from '../../types'\nimport { Container } from '../Container'\nimport { ProfitAndLossChart } from '../ProfitAndLossChart'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { ProfitAndLossDetailedCharts } from '../ProfitAndLossDetailedCharts'\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 filteredDataRevenue: [],\n filteredTotalRevenue: undefined,\n filteredDataExpenses: [],\n filteredTotalExpenses: undefined,\n isLoading: true,\n isValidating: false,\n error: undefined,\n dateRange: {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n changeDateRange: () => {},\n refetch: () => {},\n sidebarScope: undefined,\n setSidebarScope: () => {},\n sortBy: () => {},\n setFilterTypes: () => {},\n filters: {\n expenses: undefined,\n revenue: undefined,\n },\n})\n\ntype Props = PropsWithChildren & {\n tagFilter?: {\n key: string\n values: string[]\n }\n reportingBasis?: ReportingBasis\n asContainer?: boolean\n}\n\nconst ProfitAndLoss = ({\n children,\n tagFilter,\n reportingBasis,\n asContainer = true,\n}: Props) => {\n const contextData = useProfitAndLoss({ tagFilter, reportingBasis })\n return (\n <PNLContext.Provider value={contextData}>\n {asContainer ? (\n <Container name='profit-and-loss'>{children}</Container>\n ) : (\n children\n )}\n </PNLContext.Provider>\n )\n}\n\nProfitAndLoss.Chart = ProfitAndLossChart\nProfitAndLoss.Context = PNLContext\nProfitAndLoss.DatePicker = ProfitAndLossDatePicker\nProfitAndLoss.Summaries = ProfitAndLossSummaries\nProfitAndLoss.Table = ProfitAndLossTable\nProfitAndLoss.DetailedCharts = ProfitAndLossDetailedCharts\nexport { ProfitAndLoss }\n", "import { useMemo, useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport {\n ProfitAndLoss,\n DateRange,\n ReportingBasis,\n SortDirection,\n} from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport {\n collectExpensesItems,\n collectRevenueItems,\n applyShare,\n} from '../../utils/profitAndLossUtils'\nimport { useLayerContext } from '../useLayerContext'\nimport { startOfMonth, endOfMonth, formatISO } from 'date-fns'\nimport useSWR from 'swr'\n\nexport type Scope = 'expenses' | 'revenue'\n\nexport type SidebarScope = Scope | undefined\n\ntype Props = {\n startDate?: Date\n endDate?: Date\n tagFilter?: {\n key: string\n values: string[]\n }\n reportingBasis?: ReportingBasis\n}\n\ntype ProfitAndLossFilter = {\n sortBy?: string\n sortDirection?: SortDirection\n types?: string[]\n}\n\nexport type ProfitAndLossFilters = Record<\n Scope,\n ProfitAndLossFilter | undefined\n>\n\ntype UseProfitAndLoss = (props?: Props) => {\n data: ProfitAndLoss | undefined\n filteredDataRevenue: LineBaseItem[]\n filteredTotalRevenue?: number\n filteredDataExpenses: LineBaseItem[]\n filteredTotalExpenses?: number\n isLoading: boolean\n isValidating: boolean\n error: unknown\n dateRange: DateRange\n changeDateRange: (dateRange: Partial<DateRange>) => void\n refetch: () => void\n sidebarScope: SidebarScope\n setSidebarScope: (view: SidebarScope) => void\n filters: ProfitAndLossFilters\n sortBy: (scope: Scope, field: string, direction?: SortDirection) => void\n setFilterTypes: (scope: Scope, types: string[]) => void\n}\n\nexport const useProfitAndLoss: UseProfitAndLoss = (\n {\n startDate: initialStartDate,\n endDate: initialEndDate,\n tagFilter,\n reportingBasis,\n }: 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 const [filters, setFilters] = useState<ProfitAndLossFilters>({\n expenses: undefined,\n revenue: undefined,\n })\n\n const [sidebarScope, setSidebarScope] = useState<SidebarScope>(undefined)\n\n const {\n data: rawData,\n isLoading,\n isValidating,\n error: rawError,\n mutate,\n } = useSWR(\n businessId &&\n startDate &&\n endDate &&\n auth?.access_token &&\n `profit-and-loss-${businessId}-${startDate.valueOf()}-${endDate.valueOf()}-${tagFilter?.key}-${tagFilter?.values?.join(\n ',',\n )}-${reportingBasis}`,\n Layer.getProfitAndLoss(apiUrl, auth?.access_token, {\n params: {\n businessId,\n startDate: formatISO(startDate),\n endDate: formatISO(endDate),\n tagKey: tagFilter?.key,\n tagValues: tagFilter?.values?.join(','),\n reportingBasis,\n },\n }),\n )\n const { data, error } = rawData || {}\n\n const { filteredDataRevenue, filteredTotalRevenue } = useMemo(() => {\n if (!data) {\n return { filteredDataRevenue: [], filteredTotalRevenue: undefined }\n }\n const items = collectRevenueItems(data)\n const filtered = items.map(x => {\n if (\n filters['revenue']?.types &&\n filters['revenue']!.types!.length > 0 &&\n !filters['revenue']?.types?.includes(x.type)\n ) {\n return {\n ...x,\n hidden: true,\n }\n }\n\n return x\n })\n const sorted = filtered.sort((a, b) => {\n switch (filters['revenue']?.sortBy) {\n case 'category':\n if (filters['revenue']?.sortDirection === 'asc') {\n return a.display_name.localeCompare(b.display_name)\n }\n return b.display_name.localeCompare(a.display_name)\n\n case 'type':\n if (filters['revenue']?.sortDirection === 'asc') {\n return a.type.localeCompare(b.type)\n }\n return b.type.localeCompare(a.type)\n\n default:\n if (filters['revenue']?.sortDirection === 'asc') {\n return a.value - b.value\n }\n return b.value - a.value\n }\n })\n const total = sorted\n .filter(x => !x.hidden)\n .reduce((x, { value }) => x + value, 0)\n const withShare = applyShare(sorted, total)\n\n return { filteredDataRevenue: withShare, filteredTotalRevenue: total }\n }, [data, startDate, filters, sidebarScope])\n\n const { filteredDataExpenses, filteredTotalExpenses } = useMemo(() => {\n if (!data) {\n return { filteredDataExpenses: [], filteredTotalExpenses: undefined }\n }\n const items = collectExpensesItems(data)\n const filtered = items.map(x => {\n if (\n filters['expenses']?.types &&\n filters['expenses']!.types!.length > 0 &&\n !filters['expenses']?.types?.includes(x.type)\n ) {\n return {\n ...x,\n hidden: true,\n }\n }\n\n return x\n })\n const sorted = filtered.sort((a, b) => {\n switch (filters['expenses']?.sortBy) {\n case 'category':\n if (filters['expenses']?.sortDirection === 'asc') {\n return a.display_name.localeCompare(b.display_name)\n }\n return b.display_name.localeCompare(a.display_name)\n\n case 'type':\n if (filters['expenses']?.sortDirection === 'asc') {\n return a.type.localeCompare(b.type)\n }\n return b.type.localeCompare(a.type)\n\n default:\n if (filters['expenses']?.sortDirection === 'asc') {\n return a.value - b.value\n }\n return b.value - a.value\n }\n })\n const total = sorted\n .filter(x => !x.hidden)\n .reduce((x, { value }) => x + value, 0)\n const withShare = applyShare(sorted, total)\n\n return { filteredDataExpenses: withShare, filteredTotalExpenses: total }\n }, [data, startDate, filters, sidebarScope])\n\n const changeDateRange = ({\n startDate: newStartDate,\n endDate: newEndDate,\n }: Partial<DateRange>) => {\n newStartDate && setStartDate(newStartDate)\n newEndDate && setEndDate(newEndDate)\n }\n\n const refetch = () => {\n mutate()\n }\n\n const sortBy = (scope: Scope, field: string, direction?: SortDirection) => {\n setFilters({\n ...filters,\n [scope]: {\n ...filters[scope],\n sortBy: field,\n sortDirection:\n direction ?? filters[scope]?.sortDirection === 'desc'\n ? 'asc'\n : 'desc',\n },\n })\n }\n\n const setFilterTypes = (scope: Scope, types: string[]) => {\n setFilters({\n ...filters,\n [scope]: {\n ...filters[scope],\n types,\n },\n })\n }\n\n return {\n data,\n filteredDataRevenue,\n filteredTotalRevenue,\n filteredDataExpenses,\n filteredTotalExpenses,\n isLoading,\n isValidating,\n error: error || rawError,\n dateRange: { startDate, endDate },\n refetch,\n changeDateRange,\n sidebarScope,\n setSidebarScope,\n sortBy,\n filters,\n setFilterTypes,\n }\n}\n", "import { SidebarScope } from '../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { LineItem, LineBaseItem } from '../types/line_item'\nimport { ProfitAndLoss } from '../types/profit_and_loss'\n\nconst doesLineItemQualifies = (item: LineItem) => {\n return !(\n item.is_contra ||\n item.value === undefined ||\n item.value === null ||\n isNaN(item.value) ||\n item.value === -Infinity ||\n item.value === Infinity ||\n item.value < 0\n )\n}\n\nconst collectSubItems = (type: string, item?: LineItem | null) => {\n if (!item) {\n return []\n }\n\n const items: LineBaseItem[] = []\n\n item?.line_items?.forEach(item => {\n if (doesLineItemQualifies(item)) {\n items.push({\n name: item.name,\n display_name: item.display_name,\n value: item.value || 0,\n type,\n })\n }\n })\n\n return items\n}\n\nexport const collectExpensesItems = (data: ProfitAndLoss) => {\n const cogs = collectSubItems('Cost of Goods Sold', data.cost_of_goods_sold)\n const expenses = collectSubItems('Operating Expenses', data.expenses)\n const taxes = collectSubItems('Taxes & Licenses', data.taxes)\n\n return ([] as LineBaseItem[]).concat(cogs).concat(expenses).concat(taxes)\n}\n\nexport const collectRevenueItems = (data: ProfitAndLoss) => {\n const income = collectSubItems('Income', data.income)\n\n return ([] as LineBaseItem[]).concat(income)\n}\n\nexport const humanizeTitle = (sidebarView: SidebarScope) => {\n switch (sidebarView) {\n case 'expenses':\n return 'Expenses'\n case 'revenue':\n return 'Revenue'\n default:\n return 'Profit & Loss'\n }\n}\n\nexport const applyShare = (\n items: LineBaseItem[],\n total: number,\n): LineBaseItem[] => {\n return items.map(item => {\n if (total === 0) {\n return item\n }\n\n return {\n ...item,\n share: item.value / total,\n }\n })\n}\n", "import React, { useContext, useMemo, useState } from 'react'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { centsToDollars } from '../../models/Money'\nimport { ProfitAndLoss } from '../../types'\nimport { capitalizeFirstLetter } from '../../utils/format'\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 Tooltip,\n TooltipProps,\n Rectangle,\n} from 'recharts'\nimport { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart'\n\nconst barGap = 4\nconst barSize = 20\n\nexport const ProfitAndLossChart = () => {\n const { getColor } = useLayerContext()\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: Math.abs((pnl?.income.value || 0) - (pnl?.net_profit || 0)),\n netProfit: 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 const CustomTooltip = ({\n active,\n payload,\n label,\n }: TooltipProps<number, string>) => {\n if (active && payload && payload.length) {\n const netProfit = payload[0].payload.netProfit ?? 0\n const netProfitClass =\n netProfit > 0 ? 'positive' : netProfit < 0 ? 'negative' : ''\n return (\n <div className='Layer__chart__tooltip'>\n <ul className='Layer__chart__tooltip-list'>\n <li>\n <label className='Layer__chart__tooltip-label'>\n {capitalizeFirstLetter(payload[0].name ?? '')}\n </label>\n <span className='Layer__chart__tooltip-value'>\n ${centsToDollars(Math.abs(payload[0].value ?? 0))}\n </span>\n </li>\n <li>\n <label className='Layer__chart__tooltip-label'>\n {capitalizeFirstLetter(payload[1].name ?? '')}\n </label>\n <span className='Layer__chart__tooltip-value'>\n ${centsToDollars(Math.abs(payload[1].value ?? 0))}\n </span>\n </li>\n <li>\n <label className='Layer__chart__tooltip-label'>Net Profit</label>\n <span className={`Layer__chart__tooltip-value ${netProfitClass}`}>\n ${centsToDollars(netProfit)}\n </span>\n </li>\n </ul>\n </div>\n )\n }\n\n return null\n }\n\n const CustomizedCursor = (props: any) => {\n const { x, width, height } = props\n\n return (\n <Rectangle\n fill={getColor(900)?.hex ?? '#333'}\n stroke='none'\n x={x + width / 2 - 11}\n y={height + 44}\n radius={2}\n width={22}\n height={2}\n className='Layer__chart__tooltip-cursor'\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\n className='Layer__chart-container'\n width='100%'\n height='100%'\n minHeight={200}\n >\n <BarChart\n margin={{ left: 12, right: 12, bottom: 12 }}\n data={data}\n onClick={onClick}\n barGap={barGap}\n className='Layer__profit-and-loss-chart'\n >\n <Tooltip\n wrapperClassName='Layer__chart__tooltip-wrapper'\n content={<CustomTooltip />}\n cursor={<CustomizedCursor />}\n animationDuration={100}\n animationEasing='ease-out'\n />\n <CartesianGrid\n vertical={false}\n stroke={getColor(200)?.hex ?? '#fff'}\n strokeDasharray='5 5'\n />\n <Legend\n verticalAlign='top'\n align='left'\n wrapperStyle={{ top: -24 }}\n payload={[\n {\n value: 'Revenue',\n type: 'circle',\n id: 'IncomeLegend',\n },\n {\n value: 'Expenses',\n type: 'circle',\n id: 'ExpensesLegend',\n },\n ]}\n />\n <XAxis dataKey='name' tickLine={false} />\n <Bar\n dataKey='revenue'\n barSize={barSize}\n isAnimationActive={false}\n radius={[2, 2, 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={[2, 2, 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", "/**\n * Capitalize first letter of the given text.\n */\nexport const capitalizeFirstLetter = (text: string) =>\n text.charAt(0).toUpperCase() + text.slice(1)\n\n/**\n * Convert number into percentage.\n *\n * @example\n * 0.112 -> 11%\n * 0.09843 -> 9.8%\n * 0.00123 -> 0.12%\n */\nexport const formatPercent = (\n value?: number,\n options?: Intl.NumberFormatOptions,\n) => {\n if (!value && value !== 0) {\n return\n }\n\n const val = value * 100\n\n let defaultOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }\n\n if (Math.abs(val) < 10) {\n defaultOptions = {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }\n }\n\n if (Math.abs(val) < 1) {\n defaultOptions = {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }\n }\n\n if (val === 0) {\n defaultOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }\n }\n\n return val.toLocaleString('en-US', {\n ...defaultOptions,\n ...options,\n })\n}\n\n/**\n * Convert Enum-like (upper snakecase) text into human friendly format.\n */\nexport const humanizeEnum = (text: string) => {\n return capitalizeFirstLetter(text.replace(/_/gi, ' ').toLowerCase())\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 { x: animateTo = 0, width = 0 } =\n 'x' in viewBox ? viewBox : emptyViewBox\n const margin = width > 12 ? 4 : 1\n const boxWidth = width * 2 + margin\n const multiplier = width > 12 ? 1.2 : 1\n const xOffset = (boxWidth * multiplier - boxWidth) / 2\n const borderRadius = width > 16 ? 8 : width / 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 rx={borderRadius}\n ry={borderRadius}\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: 22,\n height: 'calc(100% - 38px)',\n }}\n />\n )\n}\n", "import React, { useContext, useState, useEffect } from 'react'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { add, endOfMonth, format, startOfMonth } from 'date-fns'\n\nexport const ProfitAndLossDatePicker = () => {\n const { changeDateRange, dateRange } = useContext(ProfitAndLoss.Context)\n const [isAnimating, setIsAnimating] = useState(false)\n\n const [localDate, setLocalDate] = useState(dateRange.startDate)\n const [nextOpacity, setNextOpacity] = useState(0) \n const [currentOpacity, setCurrentOpacity] = useState(1) \n\n const [transformStyle, setTransformStyle] = useState({\n transform: 'translateX(33%)',\n transition: 'ease',\n })\n\n useEffect(() => {\n if (dateRange.startDate !== localDate && !isAnimating) {\n setLocalDate(dateRange.startDate)\n setTransformStyle({ transform: 'translateX(33%)', transition: 'none' })\n }\n }, [dateRange.startDate, localDate, isAnimating])\n\n const change = (monthsToAdd: number) => {\n if (isAnimating) return\n setIsAnimating(true)\n setNextOpacity(1) \n\n const newDate = add(localDate, { months: monthsToAdd })\n if (monthsToAdd === -1) {\n setCurrentOpacity(0) \n }\n\n changeDateRange({\n startDate: startOfMonth(newDate),\n endDate: endOfMonth(newDate),\n })\n\n const translateXValue = monthsToAdd > 0 ? '0%' : '66%'\n setTransformStyle({\n transform: `translateX(${translateXValue})`,\n transition: 'transform 0.4s ease',\n })\n\n setTimeout(() => {\n setCurrentOpacity(1)\n }, 300)\n\n setTimeout(() => {\n setLocalDate(newDate)\n setTransformStyle({ transform: 'translateX(33%)', transition: 'none' })\n setIsAnimating(false)\n setNextOpacity(0) \n setCurrentOpacity(1)\n }, 300)\n }\n\n const currentLabel = format(localDate, 'LLLL, y')\n const prevLabel = format(add(localDate, { months: -1 }), 'LLLL, y')\n const nextLabel = format(add(localDate, { months: 1 }), 'LLLL, y')\n\n return (\n <div\n className='Layer__profit-and-loss-date-picker'\n >\n <div className='Layer__profit-and-loss-date-picker__labels-container' style={transformStyle}>\n <span className='Layer__profit-and-loss-date-picker__label'>\n {prevLabel}\n </span>\n <span\n className='Layer__profit-and-loss-date-picker__label'\n style={{ opacity: currentOpacity }}\n >\n {currentLabel}\n </span>\n <span\n className='Layer__profit-and-loss-date-picker__label'\n style={{ opacity: nextOpacity }}\n >\n {nextLabel}\n </span>\n </div>\n <button\n aria-label='View Previous Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={() => change(-1)}\n disabled={isAnimating}\n >\n <ChevronLeft\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={16}\n />\n </button>\n <button\n aria-label='View Next Month'\n className='Layer__profit-and-loss-date-picker__button'\n onClick={() => change(1)}\n disabled={isAnimating}\n >\n <ChevronRight\n className='Layer__profit-and-loss-date-picker__button-icon'\n size={16}\n />\n </button>\n <div className='Layer__profit-and-loss-date-picker__effect-blur'></div>\n </div>\n )\n}\n", "import React, { useContext, useState } from 'react'\nimport { SidebarScope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport XIcon from '../../icons/X'\nimport { humanizeTitle } from '../../utils/profitAndLossUtils'\nimport { Button, BackButton, ButtonVariant } from '../Button'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { DetailedChart } from './DetailedChart'\nimport { DetailedTable } from './DetailedTable'\nimport { Filters } from './Filters'\nimport { format } from 'date-fns'\n\nexport const ProfitAndLossDetailedCharts = ({\n scope,\n hideClose = false,\n showDatePicker = false,\n}: {\n scope?: SidebarScope\n hideClose?: boolean\n showDatePicker?: boolean\n}) => {\n const {\n filteredDataRevenue,\n filteredTotalRevenue,\n filteredDataExpenses,\n filteredTotalExpenses,\n sortBy,\n isLoading,\n filters,\n dateRange,\n sidebarScope,\n setSidebarScope,\n setFilterTypes,\n } = useContext(PNL.Context)\n\n const theScope = scope ? scope : sidebarScope\n const data =\n theScope === 'revenue' ? filteredDataRevenue : filteredDataExpenses\n const total =\n theScope === 'revenue' ? filteredTotalRevenue : filteredTotalExpenses\n\n const [hoveredItem, setHoveredItem] = useState<string | undefined>()\n\n return (\n <div className='Layer__profit-and-loss-detailed-charts'>\n <header className='Layer__profit-and-loss-detailed-charts__header'>\n <div className='Layer__profit-and-loss-detailed-charts__head'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {humanizeTitle(theScope)}\n </Text>\n <Text size={TextSize.sm} className='date'>\n {format(dateRange.startDate, 'LLLL, y')}\n </Text>\n {showDatePicker && <ProfitAndLossDatePicker />}\n </div>\n {!hideClose && (\n <Button\n rightIcon={<XIcon />}\n iconOnly={true}\n onClick={() => setSidebarScope(undefined)}\n variant={ButtonVariant.secondary}\n />\n )}\n </header>\n\n <header className='Layer__profit-and-loss-detailed-charts__header--tablet'>\n <BackButton onClick={() => setSidebarScope(undefined)} />\n </header>\n\n <div className='Layer__profit-and-loss-detailed-charts__content'>\n <DetailedChart\n filteredData={data}\n filteredTotal={total}\n hoveredItem={hoveredItem}\n setHoveredItem={setHoveredItem}\n sidebarScope={theScope}\n date={dateRange.startDate}\n isLoading={isLoading}\n />\n\n <div className='Layer__profit-and-loss-detailed-charts__table-wrapper'>\n <Filters\n filteredData={data}\n sidebarScope={theScope}\n filters={filters}\n setFilterTypes={setFilterTypes}\n />\n\n <DetailedTable\n filteredData={data}\n sidebarScope={theScope}\n filters={filters}\n sortBy={sortBy}\n hoveredItem={hoveredItem}\n setHoveredItem={setHoveredItem}\n />\n </div>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst X = ({ 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='M13.5 4.5L4.5 13.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M4.5 4.5L13.5 13.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\n\nexport default X\n", "import React, { useMemo } from 'react'\nimport {\n INACTIVE_OPACITY_LEVELS,\n DEFAULT_CHART_COLORS,\n} from '../../config/charts'\nimport { SidebarScope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { LineBaseItem } from '../../types/line_item'\nimport { formatPercent } from '../../utils/format'\nimport { humanizeTitle } from '../../utils/profitAndLossUtils'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { format } from 'date-fns'\nimport {\n PieChart,\n Pie,\n Cell,\n ResponsiveContainer,\n Label,\n Text as ChartText,\n} from 'recharts'\nimport { PolarViewBox } from 'recharts/types/util/types'\n\ninterface DetailedChartProps {\n filteredData: LineBaseItem[]\n filteredTotal?: number\n hoveredItem?: string\n setHoveredItem: (name?: string) => void\n sidebarScope?: SidebarScope\n date: number | Date\n isLoading?: boolean\n}\n\nexport const DetailedChart = ({\n filteredData,\n filteredTotal,\n hoveredItem,\n setHoveredItem,\n sidebarScope,\n date,\n isLoading,\n}: DetailedChartProps) => {\n const chartData = useMemo(() => {\n if (!filteredData) {\n return []\n }\n return filteredData.map(x => {\n if (x.hidden) {\n return {\n name: x.display_name,\n value: 0,\n }\n }\n return {\n name: x.display_name,\n value: x.value,\n }\n })\n }, [filteredData, isLoading])\n\n const noValue = chartData.length === 0 || !chartData.find(x => x.value !== 0)\n\n return (\n <div className='chart-field'>\n <div className='header--tablet'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {humanizeTitle(sidebarScope)}\n </Text>\n\n <ProfitAndLossDatePicker />\n </div>\n\n <div className='chart-container'>\n <ResponsiveContainer>\n <PieChart>\n {!isLoading && !noValue ? (\n <Pie\n data={chartData}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={105}\n outerRadius={120}\n paddingAngle={0.5}\n fill='#8884d8'\n animationDuration={200}\n animationEasing='ease-in-out'\n >\n {chartData.map((entry, index) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[index % DEFAULT_CHART_COLORS.length]\n let fill: string | undefined = colorConfig.color\n let opacity = colorConfig.opacity\n let active = true\n if (hoveredItem && entry.name !== hoveredItem) {\n active = false\n fill = undefined\n opacity =\n INACTIVE_OPACITY_LEVELS[\n index % INACTIVE_OPACITY_LEVELS.length\n ]\n }\n\n return (\n <Cell\n key={`cell-${index}`}\n className={`Layer__profit-and-loss-detailed-charts__pie ${\n hoveredItem && active ? 'active' : 'inactive'\n }`}\n style={{ fill }}\n opacity={opacity}\n onMouseEnter={() => setHoveredItem(entry.name)}\n onMouseLeave={() => setHoveredItem(undefined)}\n />\n )\n })}\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) - 15,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let text = 'Total'\n\n if (hoveredItem) {\n text = hoveredItem\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__title'\n >\n {text}\n </ChartText>\n )\n }}\n />\n\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) + 5,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let value = filteredTotal\n if (hoveredItem) {\n value = filteredData.find(\n x => x.display_name === hoveredItem,\n )?.value\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__value'\n >\n {`$${formatMoney(value)}`}\n </ChartText>\n )\n }}\n />\n\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) + 25,\n height: 20,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n if (hoveredItem) {\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__share'\n >\n {`${formatPercent(\n filteredData.find(\n x => x.display_name === hoveredItem,\n )?.share,\n )}%`}\n </ChartText>\n )\n }\n\n return\n }}\n />\n </Pie>\n ) : null}\n\n {!isLoading && noValue ? (\n <Pie\n data={[{ name: 'Total', value: 1 }]}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={105}\n outerRadius={120}\n paddingAngle={0}\n fill='#F8F8FA'\n animationDuration={200}\n animationEasing='ease-in-out'\n >\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) - 15,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let text = 'Total'\n\n if (hoveredItem) {\n text = hoveredItem\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__title'\n >\n {text}\n </ChartText>\n )\n }}\n />\n\n <Label\n position='center'\n value='Total'\n className='pie-center-label-title'\n content={props => {\n const { cx, cy } = (props.viewBox as PolarViewBox) ?? {\n cx: 0,\n cy: 0,\n }\n const positioningProps = {\n x: cx,\n y: (cy || 0) + 5,\n textAnchor: 'middle' as\n | 'start'\n | 'middle'\n | 'end'\n | 'inherit',\n verticalAnchor: 'middle' as 'start' | 'middle' | 'end',\n }\n\n let value = filteredTotal\n if (hoveredItem) {\n value = filteredData.find(\n x => x.display_name === hoveredItem,\n )?.value\n }\n\n return (\n <ChartText\n {...positioningProps}\n className='pie-center-label__value'\n >\n {`$${formatMoney(value)}`}\n </ChartText>\n )\n }}\n />\n </Pie>\n ) : null}\n\n {isLoading ? (\n <Pie\n data={[{ name: 'loading...', value: 1 }]}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={105}\n outerRadius={120}\n paddingAngle={0}\n fill='#F8F8FA'\n animationDuration={200}\n animationEasing='ease-in-out'\n />\n ) : null}\n </PieChart>\n </ResponsiveContainer>\n </div>\n </div>\n )\n}\n", "export const INACTIVE_OPACITY_LEVELS = [\n 0.85, 0.7, 0.66, 0.55, 0.4, 0.33, 0.25, 0.15,\n]\n\nexport const DEFAULT_CHART_COLORS = [\n {\n color: '#7417B3',\n opacity: 1,\n },\n {\n color: '#7417B3',\n opacity: 0.8,\n },\n {\n color: '#7417B3',\n opacity: 0.6,\n },\n {\n color: '#7417B3',\n opacity: 0.4,\n },\n {\n color: '#7417B3',\n opacity: 0.2,\n },\n {\n color: '#7417B3',\n opacity: 0.1,\n },\n {\n color: '#006A80',\n opacity: 1,\n },\n {\n color: '#006A80',\n opacity: 0.8,\n },\n {\n color: '#006A80',\n opacity: 0.6,\n },\n {\n color: '#006A80',\n opacity: 0.4,\n },\n {\n color: '#006A80',\n opacity: 0.2,\n },\n {\n color: '#006A80',\n opacity: 0.1,\n },\n {\n color: '#009930',\n opacity: 1,\n },\n {\n color: '#009930',\n opacity: 0.8,\n },\n {\n color: '#009930',\n opacity: 0.6,\n },\n {\n color: '#009930',\n opacity: 0.4,\n },\n {\n color: '#009930',\n opacity: 0.2,\n },\n {\n color: '#009930',\n opacity: 0.1,\n },\n]\n", "import React from 'react'\nimport { DEFAULT_CHART_COLORS } from '../../config/charts'\nimport {\n Scope,\n SidebarScope,\n ProfitAndLossFilters,\n} from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport SortArrows from '../../icons/SortArrows'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { SortDirection } from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport { formatPercent } from '../../utils/format'\nimport classNames from 'classnames'\n\nexport interface DetailedTableProps {\n filteredData: LineBaseItem[]\n hoveredItem?: string\n setHoveredItem: (name?: string) => void\n sidebarScope: SidebarScope\n filters: ProfitAndLossFilters\n sortBy: (scope: Scope, field: string, direction?: SortDirection) => void\n}\n\nexport const DetailedTable = ({\n filteredData,\n sidebarScope,\n filters,\n sortBy,\n hoveredItem,\n setHoveredItem,\n}: DetailedTableProps) => {\n const buildColClass = (column: string) => {\n return classNames(\n 'Layer__sortable-col',\n sidebarScope && filters[sidebarScope]?.sortBy === column\n ? `sort--${\n (sidebarScope && filters[sidebarScope]?.sortDirection) ?? 'desc'\n }`\n : '',\n )\n }\n\n return (\n <div className='details-container'>\n <div className='table'>\n <table>\n <thead>\n <tr>\n <th\n className={buildColClass('category')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'category')}\n >\n Expense/Sale <SortArrows className='Layer__sort-arrows' />\n </th>\n <th\n className={buildColClass('type')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'type')}\n >\n Type <SortArrows className='Layer__sort-arrows' />\n </th>\n <th></th>\n <th\n className={buildColClass('value')}\n onClick={() => sortBy(sidebarScope ?? 'expenses', 'value')}\n >\n Value <SortArrows className='Layer__sort-arrows' />\n </th>\n </tr>\n </thead>\n <tbody>\n {filteredData\n .filter(x => !x.hidden)\n .map((item, idx) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[idx % DEFAULT_CHART_COLORS.length]\n return (\n <tr\n key={`pl-side-table-item-${idx}`}\n className={classNames(\n 'Layer__profit-and-loss-detailed-table__row',\n hoveredItem && hoveredItem === item.display_name\n ? 'active'\n : '',\n )}\n onMouseEnter={() => setHoveredItem(item.display_name)}\n onMouseLeave={() => setHoveredItem(undefined)}\n >\n <td className='category-col'>{item.display_name}</td>\n <td className='type-col'>{item.type}</td>\n <td className='value-col'>${formatMoney(item.value)}</td>\n <td className='share-col'>\n <span className='share-cell-content'>\n {formatPercent(item.share)}%\n <div\n className='share-icon'\n style={{\n background: colorConfig.color,\n opacity: colorConfig.opacity,\n }}\n />\n </span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst SortArrows = ({ size = 13, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 12 13'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <g clip-path='url(#clip0_1758_75388)'>\n <path\n d='M1.33325 8.5L3.99992 11.1667L6.66659 8.5'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='desc-arrow'\n />\n <path\n d='M4 2.5L4 11.1667'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='desc-arrow'\n />\n <path\n d='M5.99988 5.16602L8.66654 2.49935L11.3332 5.16602'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='asc-arrow'\n />\n <path\n d='M8.66663 11.166L8.66663 2.49935'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n className='asc-arrow'\n />\n </g>\n <defs>\n <clipPath id='clip0_1758_75388'>\n <rect\n width='12'\n height='12'\n fill='white'\n transform='translate(0 0.5)'\n />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SortArrows\n", "import React from 'react'\nimport Select, { components } from 'react-select'\nimport {\n Scope,\n SidebarScope,\n ProfitAndLossFilters,\n} from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport ChevronDown from '../../icons/ChevronDown'\nimport { LineBaseItem } from '../../types/line_item'\nimport { CategoryOption } from '../CategorySelect/CategorySelect'\nimport { Text, TextSize } from '../Typography'\n\nexport interface FiltersProps {\n filteredData: LineBaseItem[]\n sidebarScope: SidebarScope\n filters: ProfitAndLossFilters\n setFilterTypes: (scope: Scope, types: string[]) => void\n}\n\nexport const Filters = ({\n filteredData,\n sidebarScope,\n filters,\n setFilterTypes,\n}: FiltersProps) => {\n return (\n <div className='filters'>\n <Text size={TextSize.sm} className='Layer__label'>\n Filters\n </Text>\n <Select\n className='Layer__select type-select'\n classNamePrefix='Layer__select'\n value={\n sidebarScope && filters[sidebarScope]?.types\n ? sidebarScope &&\n filters[sidebarScope]?.types?.map(x => ({\n value: x,\n label: x,\n }))\n : []\n }\n isMulti\n isClearable={false}\n options={\n [...new Set(filteredData?.map(x => x.type))].map(x => ({\n label: x,\n value: x,\n })) as unknown as readonly { value: string; label: string }[]\n }\n onChange={selected => {\n setFilterTypes(\n sidebarScope ?? 'expenses',\n selected.map(x => x.value),\n )\n }}\n components={{\n DropdownIndicator: props => (\n <components.DropdownIndicator {...props}>\n <ChevronDown />\n </components.DropdownIndicator>\n ),\n Placeholder: props => (\n <components.Placeholder {...props}>\n <div className='Layer__select__multi-all-placeholder-badge'>\n All\n </div>\n </components.Placeholder>\n ),\n }}\n />\n </div>\n )\n}\n", "import React, { useContext, useMemo } from 'react'\nimport { Scope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { ProfitAndLoss } from '../../types'\nimport { LineBaseItem } from '../../types/line_item'\nimport {\n collectExpensesItems,\n collectRevenueItems,\n} from '../../utils/profitAndLossUtils'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { SkeletonLoader } from '../SkeletonLoader'\nimport { MiniChart } from './MiniChart'\nimport classNames from 'classnames'\n\ntype Props = {\n revenueLabel?: string\n vertical?: boolean\n actionable?: boolean\n}\n\nconst CHART_PLACEHOLDER = [\n {\n name: 'placeholder',\n display_name: 'placeholder',\n value: 1,\n type: 'placeholder',\n share: 1,\n },\n]\n\nconst buildMiniChartData = (scope: Scope, data?: ProfitAndLoss) => {\n if (!data) {\n return CHART_PLACEHOLDER\n }\n\n let items: LineBaseItem[] = []\n\n switch (scope) {\n case 'revenue':\n items = collectRevenueItems(data)\n break\n default:\n items = collectExpensesItems(data)\n }\n\n if (\n !items ||\n items.length === 0 ||\n !items.find(x => Math.abs(x.value) !== 0)\n ) {\n return CHART_PLACEHOLDER\n }\n\n return items.slice()\n}\n\nexport const ProfitAndLossSummaries = ({\n vertical,\n revenueLabel = 'Revenue',\n actionable = true,\n}: Props) => {\n const {\n data: storedData,\n isLoading,\n setSidebarScope,\n sidebarScope,\n } = useContext(PNL.Context)\n\n const expensesChartData = useMemo(() => {\n return buildMiniChartData('expenses', storedData)\n }, [storedData])\n\n const revenueChartData = useMemo(() => {\n return buildMiniChartData('revenue', storedData)\n }, [storedData])\n\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--positive'\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--positive'\n\n const netProfitDirectionClass =\n data.net_profit < 0\n ? 'Layer__profit-and-loss-summaries__amount--negative'\n : 'Layer__profit-and-loss-summaries__amount--positive'\n\n return (\n <div\n className={`Layer__profit-and-loss-summaries ${\n vertical ? 'flex-col' : ''\n }`}\n >\n <div\n className={classNames(\n 'Layer__profit-and-loss-summaries__summary',\n actionable && 'Layer__actionable',\n 'Layer__profit-and-loss-summaries__summary--income',\n sidebarScope === 'revenue' ? 'active' : '',\n )}\n onClick={() => {\n actionable && setSidebarScope('revenue')\n }}\n >\n <MiniChart data={revenueChartData} />\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n {revenueLabel}\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${incomeDirectionClass}`}\n >\n {formatMoney(Math.abs(data?.income?.value ?? NaN))}\n </span>\n )}\n </div>\n </div>\n <div\n className={classNames(\n 'Layer__profit-and-loss-summaries__summary',\n actionable && 'Layer__actionable',\n 'Layer__profit-and-loss-summaries__summary--expenses',\n sidebarScope === 'expenses' ? 'active' : '',\n )}\n onClick={() => {\n actionable && setSidebarScope('expenses')\n }}\n >\n <MiniChart data={expensesChartData} />\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Expenses\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader className='Layer__profit-and-loss-summaries__loader' />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${expensesDirectionClass}`}\n >\n {formatMoney(\n Math.abs((data.income.value ?? 0) - data.net_profit),\n )}\n </span>\n )}\n </div>\n </div>\n <div\n className={classNames(\n 'Layer__profit-and-loss-summaries__summary net-profit Layer__profit-and-loss-summaries__summary--net-profit',\n actionable && 'Layer__actionable',\n )}\n >\n <div className='Layer__profit-and-loss-summaries__text'>\n <span className='Layer__profit-and-loss-summaries__title'>\n Net Profit\n </span>\n {isLoading || storedData === undefined ? (\n <div className='Layer__profit-and-loss-summaries__loader'>\n <SkeletonLoader className='Layer__profit-and-loss-summaries__loader' />\n </div>\n ) : (\n <span\n className={`Layer__profit-and-loss-summaries__amount ${netProfitDirectionClass}`}\n >\n {formatMoney(Math.abs(data.net_profit))}\n </span>\n )}\n </div>\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport classNames from 'classnames'\n\nexport interface SkeletonLoaderProps {\n width?: string\n height?: string\n className?: string\n}\n\nexport const SkeletonLoader = ({\n height,\n width,\n className,\n}: SkeletonLoaderProps) => {\n const baseClassName = classNames(\n 'Layer__skeleton-loader Layer__anim--skeleton-loading',\n className,\n )\n return <div className={baseClassName} style={{ width, height }} />\n}\n", "import React from 'react'\nimport { DEFAULT_CHART_COLORS } from '../../config/charts'\nimport { LineBaseItem } from '../../types/line_item'\nimport { PieChart, Pie, Cell } from 'recharts'\n\nexport interface MiniChartProps {\n data: LineBaseItem[]\n}\n\nexport const MiniChart = ({ data }: MiniChartProps) => {\n return (\n <PieChart width={48} height={48} className='mini-chart'>\n <Pie\n data={data}\n dataKey='value'\n nameKey='name'\n cx='50%'\n cy='50%'\n innerRadius={10}\n outerRadius={16}\n paddingAngle={0.2}\n fill='#8884d8'\n width={24}\n height={24}\n animationDuration={250}\n animationEasing='ease-in-out'\n >\n {data.map((entry, index) => {\n const colorConfig =\n DEFAULT_CHART_COLORS[index % DEFAULT_CHART_COLORS.length]\n\n return (\n <Cell\n key={`cell-${index}`}\n className={`Layer__profit-and-loss-detailed-charts__pie`}\n fill={\n entry.name === 'placeholder' ? '#e6e6e6' : colorConfig.color\n }\n opacity={colorConfig.opacity}\n />\n )\n })}\n </Pie>\n </PieChart>\n )\n}\n", "import React, { useContext } from 'react'\nimport { Direction } from '../../types'\nimport { Loader } from '../Loader'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossRow } from '../ProfitAndLossRow'\nimport emptyPNL from './empty_profit_and_loss_report'\nimport classNames from 'classnames'\n\ntype Props = {\n lockExpanded?: boolean\n asContainer?: boolean\n}\n\nexport const ProfitAndLossTable = ({ lockExpanded, asContainer }: Props) => {\n const {\n data: actualData,\n isLoading,\n setSidebarScope,\n } = useContext(ProfitAndLoss.Context)\n const data = !actualData || isLoading ? emptyPNL : actualData\n\n if (isLoading || actualData === undefined) {\n return (\n <div\n className={classNames(\n 'Layer__profit-and-loss-table__loader-container',\n asContainer && 'Layer__component-container',\n )}\n >\n <Loader />\n </div>\n )\n }\n\n return (\n <>\n <div\n className={classNames(\n 'Layer__profit-and-loss-table Layer__profit-and-loss-table--main',\n asContainer && 'Layer__component-container',\n )}\n >\n <ProfitAndLossRow\n lineItem={data.income}\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.cost_of_goods_sold}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.gross_profit,\n display_name: 'Gross Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.expenses}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\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 lockExpanded={lockExpanded}\n scope='revenue'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={data.taxes}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n scope='expenses'\n setSidebarScope={setSidebarScope}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.net_profit,\n display_name: 'Net Profit',\n }}\n variant='summation'\n direction={Direction.CREDIT}\n lockExpanded={lockExpanded}\n />\n </div>\n {data.other_outflows || data.personal_expenses ? (\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 lockExpanded={lockExpanded}\n />\n <ProfitAndLossRow\n lineItem={data.personal_expenses}\n direction={Direction.DEBIT}\n lockExpanded={lockExpanded}\n />\n </div>\n ) : null}\n </>\n )\n}\n", "import React, { useState } from 'react'\nimport { SidebarScope } from '../../hooks/useProfitAndLoss/useProfitAndLoss'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport PieChart from '../../icons/PieChart'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LineItem } from '../../types'\nimport { Text } from '../Typography'\n\ntype Props = {\n variant?: string\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n direction?: Direction\n scope?: SidebarScope\n setSidebarScope?: (name: SidebarScope) => void\n\n /* This removes the expand toggle and leaves everything in the expanded state */\n lockExpanded?: boolean\n}\n\nexport const ProfitAndLossRow = ({\n variant,\n lineItem,\n depth = 0,\n maxDepth = 1,\n direction = Direction.DEBIT,\n lockExpanded = false,\n scope,\n setSidebarScope,\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\n className={labelClasses.join(' ')}\n onClick={() => !lockExpanded && toggleExpanded()}\n >\n <span className='Layer__profit-and-loss-row__label__title'>\n {!lockExpanded && variant !== 'summation' ? (\n <ChevronDownFill\n size={16}\n className='Layer__profit-and-loss-row__label__chevron'\n />\n ) : null}\n <Text>{display_name}</Text>\n </span>\n {setSidebarScope && (\n <span\n className='Layer__profit-and-loss-row__detailed-chart-btn'\n onClick={e => {\n e.stopPropagation()\n setSidebarScope && setSidebarScope(scope ?? 'expenses')\n }}\n >\n <PieChart />\n </span>\n )}\n </div>\n <div className={valueClasses.join(' ')}>\n <Text>{amountString}</Text>\n </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__profit-and-loss-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 </div>\n </div>\n )}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst PieChart = ({ size = 12, ...props }: IconSvgProps) => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 12 12'\n fill='none'\n {...props}\n width={size}\n height={size}\n >\n <g>\n <path\n d='M10.2213 7.78271C9.92969 8.47226 9.47363 9.07989 8.89297 9.55247C8.3123 10.0251 7.62471 10.3482 6.89031 10.4936C6.1559 10.6391 5.39705 10.6024 4.68009 10.3869C3.96313 10.1713 3.30989 9.78337 2.77749 9.25701C2.24509 8.73065 1.84973 8.08189 1.62598 7.36744C1.40223 6.65298 1.3569 5.8946 1.49396 5.15858C1.63102 4.42257 1.94629 3.73133 2.41221 3.14531C2.87813 2.55928 3.48051 2.09631 4.16669 1.79688'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M10.5833 6.00033C10.5833 5.39843 10.4648 4.80244 10.2344 4.24636C10.0041 3.69028 9.66651 3.18502 9.24091 2.75942C8.8153 2.33382 8.31004 1.99621 7.75397 1.76588C7.19789 1.53554 6.60189 1.41699 6 1.41699V6.00033H10.5833Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </g>\n </svg>\n)\n\nexport default PieChart\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, { RefObject, useContext, useRef } from 'react'\nimport { Container, Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { Panel } from '../Panel'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossDetailedCharts } from '../ProfitAndLossDetailedCharts'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'profit-and-loss'\n\nexport interface ProfitAndLossViewProps {\n hideTable?: boolean\n hideChart?: boolean\n showDetailedCharts?: boolean\n}\n\nexport interface ProfitAndLossViewPanelProps extends ProfitAndLossViewProps {\n containerRef: RefObject<HTMLDivElement>\n}\n\nexport const ProfitAndLossView = (props: ProfitAndLossViewProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n\n return (\n <Container name={COMPONENT_NAME} ref={containerRef}>\n <ProfitAndLoss>\n <ProfitAndLossPanel containerRef={containerRef} {...props} />\n </ProfitAndLoss>\n </Container>\n )\n}\n\nconst ProfitAndLossPanel = ({\n containerRef,\n ...props\n}: ProfitAndLossViewPanelProps) => {\n const { sidebarScope } = useContext(ProfitAndLoss.Context)\n\n return (\n <Panel\n sidebar={<ProfitAndLossDetailedCharts />}\n sidebarIsOpen={Boolean(sidebarScope)}\n parentRef={containerRef}\n >\n <Header className={`Layer__${COMPONENT_NAME}__header`}>\n <Heading className='Layer__profit-and-loss__title'>\n Profit & Loss\n </Heading>\n </Header>\n\n <Components {...props} />\n </Panel>\n )\n}\n\nconst Components = ({\n hideChart = false,\n hideTable = false,\n}: ProfitAndLossViewProps) => {\n const { error, isLoading, isValidating, refetch } = useContext(\n ProfitAndLoss.Context,\n )\n\n if (!isLoading && error) {\n return (\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 )\n }\n\n return (\n <>\n {!hideChart && (\n <div className={`Layer__${COMPONENT_NAME}__chart_with_summaries`}>\n <div\n className={`Layer__${COMPONENT_NAME}__chart_with_summaries__summary-col`}\n >\n <ProfitAndLoss.DatePicker />\n <ProfitAndLoss.Summaries vertical={true} />\n </div>\n <div\n className={`Layer__${COMPONENT_NAME}__chart_with_summaries__chart-col`}\n >\n <ProfitAndLoss.Chart />\n </div>\n </div>\n )}\n {!hideTable && <ProfitAndLoss.Table />}\n </>\n )\n}\n", "import React, { ReactNode, RefObject, useEffect, useRef, useState } from 'react'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport classNames from 'classnames'\n\nexport interface PanelProps {\n children: ReactNode\n className?: string\n sidebar?: ReactNode\n sidebarIsOpen?: boolean\n header?: ReactNode\n parentRef?: RefObject<HTMLDivElement>\n}\n\nexport const Panel = ({\n children,\n className,\n sidebar,\n header,\n sidebarIsOpen,\n parentRef,\n}: PanelProps) => {\n const [sidebarHeight, setSidebarHeight] = useState(0)\n\n useEffect(() => {\n if (parentRef?.current?.offsetHeight) {\n setSidebarHeight(parentRef?.current?.offsetHeight - 1)\n }\n }, [parentRef?.current?.offsetHeight, sidebarIsOpen])\n\n return (\n <div\n className={classNames(\n 'Layer__panel',\n className,\n sidebarIsOpen && 'Layer__panel--open',\n )}\n >\n <div className='Layer__panel__content'>\n {header}\n {children}\n </div>\n {sidebar && (\n <div\n className='Layer__panel__sidebar'\n style={{\n maxHeight: sidebarHeight > 0 && sidebarIsOpen ? sidebarHeight : 0,\n }}\n >\n <div className='Layer__panel__sidebar-content'>{sidebar}</div>\n </div>\n )}\n </div>\n )\n}\n", "import React, { createContext, useContext, useState } from 'react'\nimport { BREAKPOINTS } from '../../config/general'\nimport { useChartOfAccounts } from '../../hooks/useChartOfAccounts'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport { useLedgerAccounts } from '../../hooks/useLedgerAccounts'\nimport { ChartOfAccountsTable } from '../ChartOfAccountsTable'\nimport { Container } from '../Container'\nimport { LedgerAccount } from '../LedgerAccount'\n\nexport type View = 'mobile' | 'tablet' | 'desktop'\n\nexport interface ChartOfAccountsProps {\n asWidget?: boolean\n}\n\nexport type ChartOfAccountsContextType = ReturnType<typeof useChartOfAccounts>\nexport const ChartOfAccountsContext = createContext<ChartOfAccountsContextType>(\n {\n data: undefined,\n isLoading: false,\n isValidating: false,\n error: undefined,\n refetch: () => {},\n create: () => {},\n form: undefined,\n sendingForm: false,\n apiError: undefined,\n addAccount: () => {},\n editAccount: () => {},\n cancelForm: () => {},\n changeFormData: () => {},\n submitForm: () => {},\n },\n)\n\nexport type LedgerAccountsContextType = ReturnType<typeof useLedgerAccounts>\nexport const LedgerAccountsContext = createContext<LedgerAccountsContextType>({\n data: undefined,\n entryData: undefined,\n isLoading: false,\n isLoadingEntry: false,\n isValidating: false,\n isValidatingEntry: false,\n error: undefined,\n errorEntry: undefined,\n refetch: () => {},\n accountId: undefined,\n setAccountId: () => {},\n selectedEntryId: undefined,\n setSelectedEntryId: () => {},\n closeSelectedEntry: () => {},\n})\n\nexport const ChartOfAccounts = (props: ChartOfAccountsProps) => {\n const chartOfAccountsContextData = useChartOfAccounts()\n const ledgerAccountsContextData = useLedgerAccounts()\n return (\n <ChartOfAccountsContext.Provider value={chartOfAccountsContextData}>\n <LedgerAccountsContext.Provider value={ledgerAccountsContextData}>\n <ChartOfAccountsContent />\n </LedgerAccountsContext.Provider>\n </ChartOfAccountsContext.Provider>\n )\n}\n\nconst ChartOfAccountsContent = ({ asWidget }: ChartOfAccountsProps) => {\n const { accountId } = useContext(LedgerAccountsContext)\n\n const [view, setView] = useState<View>('desktop')\n\n const containerRef = useElementSize<HTMLDivElement>((_a, _b, { width }) => {\n if (width) {\n if (width >= BREAKPOINTS.TABLET && view !== 'desktop') {\n setView('desktop')\n } else if (\n width <= BREAKPOINTS.TABLET &&\n width > BREAKPOINTS.MOBILE &&\n view !== 'tablet'\n ) {\n setView('tablet')\n } else if (width < BREAKPOINTS.MOBILE && view !== 'mobile') {\n setView('mobile')\n }\n }\n })\n\n return (\n <Container name='chart-of-accounts' ref={containerRef} asWidget={asWidget}>\n {accountId ? (\n <LedgerAccount view={view} containerRef={containerRef} />\n ) : (\n <ChartOfAccountsTable view={view} containerRef={containerRef} />\n )}\n </Container>\n )\n}\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { Account, Direction, ChartOfAccounts, NewAccount } from '../../types'\nimport { BaseSelectOption } from '../../types/general'\nimport { convertToStableName } from '../../utils/helpers'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ninterface FormError {\n field: string\n message: string\n}\n\nconst validate = (formData?: ChartOfAccountsForm) => {\n const errors: FormError[] = []\n\n const nameError = validateName(formData)\n if (nameError) {\n errors.push(nameError)\n }\n\n return errors\n}\n\nconst revalidateField = (fieldName: string, formData?: ChartOfAccountsForm) => {\n switch (fieldName) {\n case 'name':\n const nameError = validateName(formData)\n if (nameError) {\n return (formData?.errors || [])\n .filter(x => x.field !== fieldName)\n .concat([nameError])\n }\n\n return (formData?.errors || []).filter(x => x.field !== fieldName)\n default:\n return formData?.errors\n }\n}\n\nconst validateName = (formData?: ChartOfAccountsForm) => {\n if (!formData?.data.name?.trim()) {\n return {\n field: 'name',\n message: 'Cannot be blank',\n }\n }\n\n return\n}\n\nexport interface ChartOfAccountsForm {\n action: 'new' | 'edit'\n accountId?: string\n data: {\n parent?: BaseSelectOption\n name?: string\n type?: BaseSelectOption\n subType?: BaseSelectOption\n category?: BaseSelectOption\n }\n errors?: FormError[]\n}\n\ntype UseChartOfAccounts = () => {\n data: ChartOfAccounts | undefined\n isLoading?: boolean\n isValidating?: boolean\n error?: unknown\n refetch: () => void\n create: (newAccount: NewAccount) => void\n form?: ChartOfAccountsForm\n sendingForm?: boolean\n apiError?: string\n addAccount: () => void\n editAccount: (id: string) => void\n cancelForm: () => void\n changeFormData: (\n name: string,\n value: string | BaseSelectOption | undefined,\n ) => void\n submitForm: () => void\n}\n\nexport const flattenAccounts = (accounts: Account[]): Account[] =>\n accounts\n .flatMap(a => [a, flattenAccounts(a.sub_accounts || [])])\n .flat()\n .filter(id => id)\n\nexport const useChartOfAccounts: UseChartOfAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const [form, setForm] = useState<ChartOfAccountsForm | undefined>()\n const [sendingForm, setSendingForm] = useState(false)\n const [apiError, setApiError] = useState<string | undefined>(undefined)\n\n const { data, isLoading, isValidating, 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 = async (newAccount: NewAccount) => {\n setSendingForm(true)\n setApiError(undefined)\n\n try {\n await Layer.createAccount(apiUrl, auth?.access_token, {\n params: { businessId },\n body: newAccount,\n })\n await refetch()\n setForm(undefined)\n } catch (_err) {\n setApiError('Submit failed. Please, check your connection and try again.')\n } finally {\n setSendingForm(false)\n }\n }\n\n const update = async (accountData: NewAccount, accountId: string) => {\n setSendingForm(true)\n setApiError(undefined)\n\n const stable_name = convertToStableName(accountData.name)\n\n /** @TODO some fields will be deprecated soon */\n const newAccountData = {\n ...accountData,\n stable_name: stable_name,\n pnl_category: 'INCOME', //this field will be deprecated soon, but is still required\n always_show_in_pnl: false, //this field will be deprecated soon, but is still required\n }\n\n try {\n await Layer.updateAccount(apiUrl, auth?.access_token, {\n params: { businessId, accountId },\n body: newAccountData,\n })\n await refetch()\n setForm(undefined)\n } catch (_err) {\n setApiError('Submit failed. Please, check your connection and try again.')\n } finally {\n setSendingForm(false)\n }\n }\n\n const submitForm = () => {\n if (!form || !form.action) {\n return\n }\n\n const errors = validate(form)\n\n if (errors.length > 0) {\n setForm({\n ...form,\n errors,\n })\n\n return\n }\n\n const data = {\n name: form.data.name ?? '',\n normality: form.data.subType?.value as Direction,\n parent_id: form.data.parent\n ? {\n type: 'AccountId' as 'AccountId',\n id: form.data.parent.value as string,\n }\n : undefined,\n description: form.data.type?.value.toString() ?? '',\n }\n\n if (form.action === 'new') {\n create(data)\n return\n }\n\n if (form.action === 'edit' && form.accountId) {\n update(data, form.accountId)\n return\n }\n }\n\n const addAccount = () =>\n setForm({\n action: 'new',\n accountId: undefined,\n data: {\n parent: undefined,\n name: undefined,\n type: {\n value: 'assets',\n label: 'Assets',\n },\n subType: undefined,\n category: undefined,\n },\n })\n\n const editAccount = (id: string) => {\n const allAccounts = flattenAccounts(data?.data?.accounts || [])\n const found = allAccounts?.find(x => x.id === id)\n\n if (!found) {\n return\n }\n\n const parent = allAccounts.find(\n x => x.sub_accounts?.find(el => el.id === found.id),\n )\n\n setForm({\n action: 'edit',\n accountId: id,\n data: {\n parent: parent\n ? {\n value: parent.id,\n label: parent.name,\n }\n : undefined,\n name: found.name,\n type: {\n value: 'assets',\n label: 'Assets',\n },\n subType: undefined,\n category: undefined,\n },\n })\n }\n\n const cancelForm = () => setForm(undefined)\n\n const changeFormData = (\n fieldName: string,\n value: string | BaseSelectOption | undefined,\n ) => {\n if (!form) {\n return\n }\n\n const newFormData = {\n ...form,\n data: {\n ...form.data,\n [fieldName]: value,\n },\n }\n\n const errors = revalidateField(fieldName, newFormData)\n\n setForm({\n ...newFormData,\n errors,\n })\n }\n\n const refetch = () => mutate()\n\n return {\n data: data?.data,\n isLoading,\n isValidating,\n error,\n refetch,\n create,\n form,\n sendingForm,\n apiError,\n addAccount,\n editAccount,\n cancelForm,\n changeFormData,\n submitForm,\n }\n}\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { LedgerAccounts, LedgerAccountsEntry } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseLedgerAccounts = () => {\n data?: LedgerAccounts\n entryData?: LedgerAccountsEntry\n isLoading?: boolean\n isLoadingEntry?: boolean\n isValidating?: boolean\n isValidatingEntry?: boolean\n error?: unknown\n errorEntry?: unknown\n refetch: () => void\n accountId?: string\n setAccountId: (id?: string) => void\n selectedEntryId?: string\n setSelectedEntryId: (id?: string) => void\n closeSelectedEntry: () => void\n}\n\nexport const useLedgerAccounts: UseLedgerAccounts = () => {\n const { auth, businessId, apiUrl } = useLayerContext()\n\n const [accountId, setAccountId] = useState<string | undefined>()\n const [selectedEntryId, setSelectedEntryId] = useState<string | undefined>()\n\n const { data, isLoading, isValidating, error, mutate } = useSWR(\n businessId &&\n accountId &&\n auth?.access_token &&\n `ledger-accounts-lines-${businessId}-${accountId}`,\n Layer.getLedgerAccountsLines(apiUrl, auth?.access_token, {\n params: { businessId, accountId },\n }),\n )\n\n const {\n data: entryData,\n mutate: mutateEntryData,\n isLoading: isLoadingEntry,\n isValidating: isValdiatingEntry,\n error: errorEntry,\n } = useSWR(\n businessId &&\n selectedEntryId &&\n auth?.access_token &&\n `ledger-accounts-entry-${businessId}-${selectedEntryId}}`,\n Layer.getLedgerAccountsEntry(apiUrl, auth?.access_token, {\n params: { businessId, entryId: selectedEntryId },\n }),\n )\n\n const refetch = () => mutate()\n\n const closeSelectedEntry = () => {\n setSelectedEntryId(undefined)\n mutateEntryData()\n }\n\n return {\n data: data?.data,\n entryData: entryData?.data,\n isLoading,\n isLoadingEntry,\n isValidating,\n isValdiatingEntry,\n error,\n errorEntry,\n refetch,\n accountId,\n setAccountId,\n selectedEntryId,\n setSelectedEntryId,\n closeSelectedEntry,\n }\n}\n", "import React, { RefObject, useContext } from 'react'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { Button, ButtonVariant } from '../Button'\nimport { ChartOfAccountsContext, View } from '../ChartOfAccounts'\nimport { ChartOfAccountsRow } from '../ChartOfAccountsRow'\nimport { ChartOfAccountsSidebar } from '../ChartOfAccountsSidebar'\nimport { Header } from '../Container'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { Loader } from '../Loader'\nimport { Panel } from '../Panel'\nimport { Heading } from '../Typography'\n\nconst COMPONENT_NAME = 'chart-of-accounts'\n\nexport const ChartOfAccountsTable = ({\n view,\n containerRef,\n}: {\n view: View\n containerRef: RefObject<HTMLDivElement>\n}) => {\n const { data, isLoading, addAccount, error, isValidating, refetch, form } =\n useContext(ChartOfAccountsContext)\n\n let cumulativeIndex = 0\n const accountsLength = data?.accounts.length ?? 0\n\n return (\n <Panel\n sidebar={<ChartOfAccountsSidebar parentRef={containerRef} />}\n sidebarIsOpen={Boolean(form)}\n parentRef={containerRef}\n >\n <Header className={`Layer__${COMPONENT_NAME}__header`}>\n <Heading className={`Layer__${COMPONENT_NAME}__title`}>\n Chart of Accounts\n </Heading>\n <div className={`Layer__${COMPONENT_NAME}__actions`}>\n <Button\n variant={ButtonVariant.secondary}\n disabled={isLoading}\n rightIcon={<DownloadCloud size={12} />}\n >\n Download\n </Button>\n <Button onClick={() => addAccount()} disabled={isLoading}>\n Add Account\n </Button>\n </div>\n </Header>\n\n <table className='Layer__chart-of-accounts__table'>\n <thead>\n <tr className='Layer__table-row--header'>\n <th className='Layer__table-header Layer__coa__name'>Name</th>\n <th className='Layer__table-header Layer__coa__type'>Type</th>\n <th className='Layer__table-header Layer__coa__subtype Layer__mobile--hidden'>\n Sub-Type\n </th>\n <th className='Layer__table-header Layer__coa__balance'>Balance</th>\n <th className='Layer__table-header Layer__coa__actions' />\n </tr>\n </thead>\n\n <tbody>\n {!error &&\n data?.accounts.map((account, idx) => {\n const currentCumulativeIndex = cumulativeIndex\n cumulativeIndex =\n (account.sub_accounts?.length || 0) + cumulativeIndex + 1\n\n return (\n <ChartOfAccountsRow\n key={account.id}\n account={account}\n depth={0}\n index={idx}\n cumulativeIndex={currentCumulativeIndex}\n expanded={true}\n defaultOpen={true}\n acountsLength={accountsLength}\n view={view}\n />\n )\n })}\n </tbody>\n </table>\n\n {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 || isLoading}\n />\n </div>\n ) : null}\n\n {(!data || isLoading) && !error ? (\n <div className={`Layer__${COMPONENT_NAME}__loader-container`}>\n <Loader />\n </div>\n ) : null}\n\n {!isLoading && !error && data?.accounts.length === 0 ? (\n <div className='Layer__table-state-container'>\n <DataState\n status={DataStateStatus.info}\n title='Accounts were not found'\n description='New account can be created with \"Add Account\".'\n onRefresh={() => refetch()}\n isLoading={isValidating}\n />\n </div>\n ) : null}\n </Panel>\n )\n}\n", "import React, { useContext, useEffect, useState } from 'react'\nimport ChevronDownFill from '../../icons/ChevronDownFill'\nimport Edit2 from '../../icons/Edit2'\nimport { centsToDollars } from '../../models/Money'\nimport { Account } from '../../types'\nimport { Button, ButtonVariant, TextButton } from '../Button'\nimport {\n ChartOfAccountsContext,\n LedgerAccountsContext,\n View,\n} from '../ChartOfAccounts/ChartOfAccounts'\nimport { Text, TextWeight } from '../Typography'\nimport classNames from 'classnames'\n\ntype ChartOfAccountsRowProps = {\n account: Account\n depth?: number\n index: number\n cumulativeIndex?: number\n expanded: boolean\n acountsLength: number\n defaultOpen?: boolean\n view?: View\n}\n\nconst INDENTATION = 24\nconst MOBILE_INDENTATION = 12\n\nconst EXPANDED_STYLE = {\n height: 52,\n paddingTop: 12,\n paddingBottom: 12,\n opacity: 1,\n}\n\nconst EXPANDED_MOBILE_STYLE = {\n height: 76,\n paddingTop: 12,\n paddingBottom: 12,\n opacity: 1,\n}\n\nconst COLLAPSED_STYLE = {\n height: 0,\n paddingTop: 0,\n paddingBottom: 0,\n opacity: 0.5,\n}\n\nexport const ChartOfAccountsRow = ({\n account,\n depth = 0,\n index,\n cumulativeIndex = 0,\n expanded = false,\n defaultOpen = false,\n acountsLength,\n view,\n}: ChartOfAccountsRowProps) => {\n const { form, editAccount } = useContext(ChartOfAccountsContext)\n\n const { setAccountId } = useContext(LedgerAccountsContext)\n\n const baseStyle = view === 'desktop' ? EXPANDED_STYLE : EXPANDED_MOBILE_STYLE\n\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const style = expanded\n ? {\n ...baseStyle,\n transitionDelay: `${15 * index}ms`,\n }\n : {\n ...COLLAPSED_STYLE,\n transitionDelay: `${acountsLength - 15 * index}ms`,\n }\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, cumulativeIndex * 50)\n\n return () => clearTimeout(timeoutId)\n }, [])\n\n const baseClass = classNames(\n 'Layer__table-row',\n isOpen ? 'Layer__table-row--expanded' : 'Layer__table-row--collapsed',\n !expanded && 'Layer__table-row--hidden',\n `Layer__table-row--depth-${depth}`,\n form?.accountId === account.id && 'Layer__table-row--active',\n !showComponent && 'Layer__table-row--anim-starting-state',\n )\n\n const desktopRowClass = classNames(\n baseClass,\n 'Layer__chart-of-accounts__row---desktop',\n )\n const mobileRowClass = classNames(\n baseClass,\n 'Layer__chart-of-accounts__row---mobile',\n )\n\n return (\n <>\n {view === 'desktop' && (\n <tr\n className={desktopRowClass}\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n setAccountId(account.id)\n }}\n >\n <td className='Layer__table-cell Layer__coa__name'>\n <span className='Layer__table-cell-content' style={style}>\n <span\n className='Layer__table-cell-content-indentation'\n style={{\n paddingLeft: INDENTATION * depth + 16,\n }}\n >\n {account.sub_accounts && account.sub_accounts.length > 0 && (\n <ChevronDownFill\n size={16}\n className='Layer__table__expand-icon'\n onClick={e => {\n e.stopPropagation()\n setIsOpen(!isOpen)\n }}\n />\n )}\n <span className='Layer__coa__name__text'>{account.name}</span>\n </span>\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__type'>\n {/* @TODO what is type and subtype*/}\n <span\n className='Layer__table-cell-content Layer__mobile--hidden'\n style={style}\n >\n {account.normality}\n </span>\n <span\n className='Layer__table-cell-content Layer__desktop--hidden'\n style={style}\n >\n <Text\n weight={TextWeight.bold}\n className='Layer__coa__type--mobile'\n >\n {account.normality}\n </Text>\n <Text className='Layer__coa__subtype--mobile'>Sub-Type</Text>\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__subtype Layer__mobile--hidden'>\n <span className='Layer__table-cell-content' style={style}>\n Sub-Type\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__balance'>\n <span\n className='Layer__table-cell-content Layer__table-cell--amount'\n style={style}\n >\n ${centsToDollars(Math.abs(account.balance || 0))}\n </span>\n </td>\n <td className='Layer__table-cell Layer__coa__actions'>\n <span className='Layer__table-cell-content' style={style}>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={<Edit2 size={12} />}\n iconOnly={true}\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n editAccount(account.id)\n }}\n >\n Edit\n </Button>\n </span>\n </td>\n </tr>\n )}\n\n {view === 'mobile' || view === 'tablet' ? (\n <tr\n className={mobileRowClass}\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n setAccountId(account.id)\n }}\n >\n <td className='Layer__table-cell' colSpan={5}>\n <span\n className='Layer__table-cell-content Layer__table-cell-content-indentation'\n style={{\n paddingLeft: MOBILE_INDENTATION * depth + 16,\n ...style,\n }}\n >\n {account.sub_accounts && account.sub_accounts.length > 0 && (\n <ChevronDownFill\n size={16}\n className='Layer__table__expand-icon'\n onClick={e => {\n e.stopPropagation()\n setIsOpen(!isOpen)\n }}\n />\n )}\n <div className='Layer__chart-of-accounts__mobile-row-content'>\n <div className='Layer__chart-of-accounts__mobile-row-content__top-row'>\n <Text\n as='span'\n className='Layer__chart-of-accounts__mobile-row-content__name'\n >\n {account.name}\n </Text>\n <TextButton\n onClick={e => {\n e.preventDefault()\n e.stopPropagation()\n editAccount(account.id)\n }}\n >\n Edit\n </TextButton>\n </div>\n <div className='Layer__chart-of-accounts__mobile-row-content__bottom-row'>\n <div className='Layer__chart-of-accounts__mobile-row-content__types'>\n <Text as='span'>{account.normality}</Text>\n <span className='Layer__chart-of-accounts__mobile-row-content__separator' />\n <Text as='span'>Sub-Type</Text>\n </div>\n <Text\n as='span'\n className='Layer__chart-of-accounts__mobile-row-content__balance'\n >\n ${centsToDollars(Math.abs(account.balance || 0))}\n </Text>\n </div>\n </div>\n </span>\n </td>\n </tr>\n ) : null}\n\n {(account.sub_accounts || []).map((subAccount, idx) => (\n <ChartOfAccountsRow\n key={subAccount.id}\n account={subAccount}\n depth={depth + 1}\n index={idx}\n expanded={isOpen && expanded}\n cumulativeIndex={cumulativeIndex + idx + 1}\n acountsLength={(account.sub_accounts ?? []).length}\n view={view}\n />\n ))}\n </>\n )\n}\n", "import * as React from 'react'\nimport { IconSvgProps } from './types'\n\nconst Edit2 = ({ 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='M12.75 2.25C12.947 2.05301 13.1808 1.89676 13.4382 1.79015C13.6956 1.68355 13.9714 1.62868 14.25 1.62868C14.5286 1.62868 14.8044 1.68355 15.0618 1.79015C15.3192 1.89676 15.553 2.05301 15.75 2.25C15.947 2.44698 16.1032 2.68083 16.2098 2.9382C16.3165 3.19557 16.3713 3.47142 16.3713 3.75C16.3713 4.02857 16.3165 4.30442 16.2098 4.56179C16.1032 4.81916 15.947 5.05302 15.75 5.25L5.625 15.375L1.5 16.5L2.625 12.375L12.75 2.25Z'\n stroke='currentColor'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n)\nexport default Edit2\n", "import React, { RefObject } from 'react'\nimport { ChartOfAccountsForm } from '../ChartOfAccountsForm'\n\nexport const ChartOfAccountsSidebar = ({\n parentRef: _parentRef,\n}: {\n parentRef?: RefObject<HTMLDivElement>\n}) => {\n return <ChartOfAccountsForm />\n}\n", "import React, { useContext, useMemo } from 'react'\nimport { flattenAccounts } from '../../hooks/useChartOfAccounts/useChartOfAccounts'\nimport { centsToDollars } from '../../models/Money'\nimport { Button, ButtonVariant, RetryButton, SubmitButton } from '../Button'\nimport { ChartOfAccountsContext } from '../ChartOfAccounts/ChartOfAccounts'\nimport { Input, InputGroup, Select } from '../Input'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { SUB_TYPE_OPTIONS } from './constants'\nimport { useParentOptions } from './useParentOptions'\n\nexport const ChartOfAccountsForm = () => {\n const {\n form,\n data,\n changeFormData,\n cancelForm,\n submitForm,\n sendingForm,\n apiError,\n } = useContext(ChartOfAccountsContext)\n\n const parentOptions = useParentOptions(data)\n\n const entry = useMemo(() => {\n if (form?.action === 'edit' && form.accountId) {\n return flattenAccounts(data?.accounts || []).find(\n x => x.id === form.accountId,\n )\n }\n\n return\n }, [data, form?.accountId])\n\n if (!form) {\n return\n }\n\n return (\n <form\n className='Layer__form'\n onSubmit={e => {\n e.preventDefault()\n submitForm()\n }}\n >\n <div className='Layer__chart-of-accounts__sidebar__header'>\n <Text size={TextSize.lg} weight={TextWeight.bold} className='title'>\n {form?.action === 'edit' ? 'Edit' : 'Add New'} Account\n </Text>\n <div className='actions'>\n <Button\n type='button'\n onClick={cancelForm}\n variant={ButtonVariant.secondary}\n disabled={sendingForm}\n >\n Cancel\n </Button>\n {apiError && (\n <RetryButton\n type='submit'\n processing={sendingForm}\n error={'Check connection and retry in few seconds.'}\n disabled={sendingForm}\n >\n Retry\n </RetryButton>\n )}\n {!apiError && (\n <SubmitButton\n type='submit'\n noIcon={true}\n active={true}\n disabled={sendingForm}\n >\n Save\n </SubmitButton>\n )}\n </div>\n </div>\n\n {apiError && (\n <Text\n size={TextSize.sm}\n className='Layer__chart-of-accounts__form__error-message'\n >\n {apiError}\n </Text>\n )}\n\n {entry && (\n <div className='Layer__chart-of-accounts__form-edit-entry'>\n <Text weight={TextWeight.bold}>{entry.name}</Text>\n <Text weight={TextWeight.bold}>\n ${centsToDollars(entry.balance || 0)}\n </Text>\n </div>\n )}\n\n <div className='Layer__chart-of-accounts__form'>\n <InputGroup name='parent' label='Parent' inline={true}>\n <Select\n options={parentOptions}\n value={form?.data.parent}\n onChange={sel => changeFormData('parent', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n <InputGroup name='name' label='Name' inline={true}>\n <Input\n name='name'\n placeholder='Enter name...'\n value={form?.data.name}\n isInvalid={Boolean(form?.errors?.find(x => x.field === 'name'))}\n errorMessage={form?.errors?.find(x => x.field === 'name')?.message}\n disabled={sendingForm}\n onChange={e =>\n changeFormData('name', (e.target as HTMLInputElement).value)\n }\n />\n </InputGroup>\n <InputGroup name='type' label='Type' inline={true}>\n <Select\n options={[]}\n disabled\n value={form?.data.type}\n onChange={sel => changeFormData('type', sel)}\n />\n </InputGroup>\n <InputGroup name='subType' label='Sub-Type' inline={true}>\n <Select\n options={SUB_TYPE_OPTIONS}\n value={form?.data.subType}\n onChange={sel => changeFormData('subType', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n <InputGroup name='category' label='Category' inline={true}>\n <Select\n options={[]}\n value={form?.data.category}\n onChange={sel => changeFormData('category', sel)}\n disabled={sendingForm}\n />\n </InputGroup>\n </div>\n </form>\n )\n}\n", "import { Direction } from '../../types'\nimport { BaseSelectOption } from '../../types/general'\n\nexport const SUB_TYPE_OPTIONS: BaseSelectOption[] = [\n {\n value: Direction.DEBIT,\n label: 'Debit',\n },\n {\n value: Direction.CREDIT,\n label: 'Credit',\n },\n]\n", "import React, { useMemo } from 'react'\nimport { flattenAccounts } from '../../hooks/useChartOfAccounts/useChartOfAccounts'\nimport { ChartOfAccounts } from '../../types'\nimport { BaseSelectOption } from '../../types/general'\n\nexport const useParentOptions = (data?: ChartOfAccounts): BaseSelectOption[] =>\n useMemo(\n () =>\n flattenAccounts(data?.accounts || [])\n .sort((a, b) => (a?.name && b?.name ? a.name.localeCompare(b.name) : 0))\n .map(x => {\n return {\n label: x.name,\n value: x.id,\n }\n }),\n [data?.accounts?.length],\n )\n", "import React, {\n RefObject,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\nimport { flattenAccounts } from '../../hooks/useChartOfAccounts/useChartOfAccounts'\nimport { useElementSize } from '../../hooks/useElementSize'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { centsToDollars } from '../../models/Money'\nimport { BackButton, Button, ButtonVariant } from '../Button'\nimport {\n ChartOfAccountsContext,\n LedgerAccountsContext,\n View,\n} from '../ChartOfAccounts/ChartOfAccounts'\nimport { DataState, DataStateStatus } from '../DataState'\nimport { LedgerAccountEntryDetails } from '../LedgerAccountEntryDetails'\nimport { Loader } from '../Loader'\nimport { Pagination } from '../Pagination'\nimport { Panel } from '../Panel'\nimport { Text, TextWeight } from '../Typography'\nimport { LedgerAccountRow } from './LedgerAccountRow'\nimport classNames from 'classnames'\n\nexport interface LedgerAccountProps {\n view: View\n containerRef: RefObject<HTMLDivElement>\n pageSize?: number\n}\n\nexport const LedgerAccount = ({\n containerRef,\n pageSize = 15,\n view,\n}: LedgerAccountProps) => {\n const [currentPage, setCurrentPage] = useState(1)\n const [initialLoad, setInitialLoad] = useState(true)\n\n const { data: accountData } = useContext(ChartOfAccountsContext)\n\n const {\n data: rawData,\n error,\n isLoading,\n isValidating,\n accountId,\n setAccountId,\n selectedEntryId,\n closeSelectedEntry,\n refetch,\n } = useContext(LedgerAccountsContext)\n\n useEffect(() => {\n if (!isLoading) {\n const timeoutLoad = setTimeout(() => {\n setInitialLoad(false)\n }, 1000)\n return () => clearTimeout(timeoutLoad)\n }\n }, [isLoading])\n\n const baseClassName = classNames(\n 'Layer__ledger-account__index',\n accountId && 'open',\n )\n\n const entry = useMemo(() => {\n return flattenAccounts(accountData?.accounts || []).find(\n x => x.id === accountId,\n )\n }, [accountId])\n\n const data = useMemo(() => {\n const firstPageIndex = (currentPage - 1) * pageSize\n const lastPageIndex = firstPageIndex + pageSize\n return rawData\n ?.sort((a, b) => Date.parse(b.date) - Date.parse(a.date))\n ?.slice(firstPageIndex, lastPageIndex)\n }, [rawData, currentPage])\n\n const close = () => {\n setAccountId(undefined)\n closeSelectedEntry()\n }\n\n return (\n <Panel\n sidebar={<LedgerAccountEntryDetails />}\n sidebarIsOpen={Boolean(selectedEntryId)}\n parentRef={containerRef}\n className='Layer__ledger-account__panel'\n >\n <div className={baseClassName}>\n <div className='Layer__ledger-account__header'>\n <BackButton onClick={close} />\n <div className='Layer__ledger-account__title-container'>\n <Text\n weight={TextWeight.bold}\n className='Layer__ledger-account__title'\n >\n {entry?.name ?? ''}\n </Text>\n <Button\n variant={ButtonVariant.secondary}\n rightIcon={<DownloadCloud size={12} />}\n >\n Download\n </Button>\n </div>\n <div className='Layer__ledger-account__balance-container'>\n <Text\n weight={TextWeight.bold}\n className='Layer__ledger-account__balance-label'\n >\n Current balance\n </Text>\n <Text\n weight={TextWeight.bold}\n className='Layer__ledger-account__balance-value'\n >\n ${centsToDollars(entry?.balance || 0)}\n </Text>\n </div>\n </div>\n <table className='Layer__table Layer__table--hover-effect Layer__ledger-account-table'>\n <thead>\n <tr>\n {view !== 'desktop' && <th />}\n {view === 'desktop' && (\n <>\n <th className='Layer__table-header'>Date</th>\n <th className='Layer__table-header'>Journal id #</th>\n <th className='Layer__table-header'>Source</th>\n </>\n )}\n {view !== 'mobile' && (\n <>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Debit\n </th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Credit\n </th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Running balance\n </th>\n </>\n )}\n </tr>\n </thead>\n <tbody>\n {data?.map((x, index) => (\n <LedgerAccountRow\n key={x.id}\n row={x}\n index={index}\n initialLoad={initialLoad}\n view={view}\n />\n ))}\n </tbody>\n </table>\n\n {data && (\n <div className='Layer__ledger-account__pagination'>\n <Pagination\n currentPage={currentPage}\n totalCount={rawData?.length || 0}\n pageSize={pageSize}\n onPageChange={page => setCurrentPage(page)}\n />\n </div>\n )}\n\n {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 || isLoading}\n />\n </div>\n ) : null}\n\n {(!data || isLoading) && !error ? (\n <div className={`Layer__ledger-account__loader-container`}>\n <Loader />\n </div>\n ) : null}\n\n {!isLoading && !error && data?.length === 0 ? (\n <div className='Layer__table-state-container'>\n <DataState\n status={DataStateStatus.info}\n title='No records found'\n onRefresh={() => refetch()}\n isLoading={isValidating}\n />\n </div>\n ) : null}\n </div>\n </Panel>\n )\n}\n", "import React, { useContext, useMemo } from 'react'\nimport X from '../../icons/X'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction } from '../../types'\nimport { humanizeEnum } from '../../utils/format'\nimport { Badge, BadgeVariant } from '../Badge'\nimport { BackButton, IconButton } from '../Button'\nimport { Card } from '../Card'\nimport { LedgerAccountsContext } from '../ChartOfAccounts/ChartOfAccounts'\nimport { DateTime } from '../DateTime'\nimport { DetailsList, DetailsListItem } from '../DetailsList'\n\nexport const LedgerAccountEntryDetails = () => {\n const { entryData, isLoadingEntry, closeSelectedEntry, errorEntry } =\n useContext(LedgerAccountsContext)\n\n const { totalDebit, totalCredit } = useMemo(() => {\n let totalDebit = 0\n let totalCredit = 0\n entryData?.line_items?.forEach(item => {\n if (item.direction === Direction.CREDIT) {\n totalCredit += item.amount || 0\n } else if (item.direction === Direction.DEBIT) {\n totalDebit += item.amount || 0\n }\n })\n\n return { totalDebit, totalCredit }\n }, [entryData])\n\n return (\n <div className='Layer__ledger-account__entry-details'>\n <div className='Layer__ledger-account__entry-details__back-btn'>\n <BackButton onClick={() => closeSelectedEntry()} />\n </div>\n <DetailsList\n title='Transaction source'\n actions={\n <IconButton\n icon={<X />}\n onClick={() => closeSelectedEntry()}\n className='Layer__hidden-sm Layer__hidden-xs'\n />\n }\n >\n <DetailsListItem label='Source' isLoading={isLoadingEntry}>\n <Badge>Invoice</Badge>\n </DetailsListItem>\n <DetailsListItem label='Number' isLoading={isLoadingEntry}>\n 1234\n </DetailsListItem>\n <DetailsListItem label='Date' isLoading={isLoadingEntry}>\n May 5, 2023\n </DetailsListItem>\n <DetailsListItem label='Account' isLoading={isLoadingEntry}>\n 89 8888 7656 6666 0000 6765\n </DetailsListItem>\n </DetailsList>\n\n <DetailsList title='Journal Entry #123' className='Layer__border-top'>\n <DetailsListItem label='Entry type' isLoading={isLoadingEntry}>\n {humanizeEnum(entryData?.entry_type ?? '')}\n </DetailsListItem>\n <DetailsListItem label='Date' isLoading={isLoadingEntry}>\n {entryData?.entry_at && <DateTime value={entryData?.entry_at} />}\n </DetailsListItem>\n <DetailsListItem label='Creation date' isLoading={isLoadingEntry}>\n {entryData?.date && <DateTime value={entryData?.date} />}\n </DetailsListItem>\n <DetailsListItem label='Reversal' isLoading={isLoadingEntry}>\n Journal Entry #79 TBD\n </DetailsListItem>\n </DetailsList>\n\n {!isLoadingEntry && !errorEntry ? (\n <div className='Layer__ledger-account__entry-details__line-items'>\n <Card>\n <table className='Layer__table Layer__ledger-account__entry-details__table'>\n <thead>\n <tr>\n <th className='Layer__table-header'>Line items</th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Debit\n </th>\n <th className='Layer__table-header Layer__table-cell--amount'>\n Credit\n </th>\n </tr>\n </thead>\n <tbody>\n {entryData?.line_items?.map(item => (\n <tr key={`ledger-line-item-${item.id}`}>\n <td className='Layer__table-cell'>\n {item.account?.name || ''}\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n {item.direction === Direction.DEBIT && (\n <Badge variant={BadgeVariant.WARNING}>\n ${centsToDollars(item.amount || 0)}\n </Badge>\n )}\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n {item.direction === Direction.CREDIT && (\n <Badge variant={BadgeVariant.SUCCESS}>\n ${centsToDollars(item.amount || 0)}\n </Badge>\n )}\n </td>\n </tr>\n ))}\n <tr className='Layer__table Layer__ledger-account__entry-details__table__total-row'>\n <td className='Layer__table-cell'>Total</td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n ${centsToDollars(totalDebit || 0)}\n </td>\n <td className='Layer__table-cell Layer__table-cell--amount'>\n ${centsToDollars(totalCredit || 0)}\n </td>\n </tr>\n </tbody>\n </table>\n </Card>\n </div>\n ) : null}\n </div>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport classNames from 'classnames'\n\nexport interface CardProps {\n children: ReactNode\n className?: string\n}\n\nexport const Card = ({ children, className }: CardProps) => {\n return <div className={classNames('Layer__card', className)}>{children}</div>\n}\n", "import React from 'react'\nimport { DATE_FORMAT, TIME_FORMAT } from '../../config/general'\nimport { Text, TextSize, TextWeight } from '../Typography'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ninterface DateTimeProps {\n value: string\n format?: string\n dateFormat?: string\n timeFormat?: string\n onlyDate?: boolean\n onlyTime?: boolean\n}\n\nexport const DateTime = ({\n value,\n format,\n dateFormat,\n timeFormat,\n onlyDate,\n onlyTime,\n}: DateTimeProps) => {\n if (format) {\n return (\n <Text className='Layer__datetime'>\n {formatTime(parseISO(value), format)}\n </Text>\n )\n }\n\n const date = formatTime(parseISO(value), dateFormat ?? DATE_FORMAT)\n const time = formatTime(parseISO(value), timeFormat ?? TIME_FORMAT)\n\n return (\n <Text className='Layer__datetime'>\n {!onlyTime && (\n <Text\n as='span'\n weight={TextWeight.bold}\n size={TextSize.sm}\n className='Layer__datetime__date'\n >\n {date}\n </Text>\n )}\n {!onlyDate && (\n <Text\n as='span'\n weight={TextWeight.bold}\n size={TextSize.sm}\n className='Layer__datetime__time'\n >\n {time}\n </Text>\n )}\n </Text>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { Header } from '../Container'\nimport { Heading, HeadingSize } from '../Typography'\nimport classNames from 'classnames'\n\nexport interface DetailsListProps {\n title?: string\n className?: string\n children: ReactNode\n actions?: ReactNode\n}\n\nexport const DetailsList = ({\n title,\n children,\n className,\n actions,\n}: DetailsListProps) => {\n return (\n <div className={classNames('Layer__details-list', className)}>\n {title && (\n <Header>\n <Heading size={HeadingSize.secondary}>{title}</Heading>\n {actions && (\n <div className='Layer__details-list__actions'>{actions}</div>\n )}\n </Header>\n )}\n <ul className='Layer__details-list__list'>{children}</ul>\n </div>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { SkeletonLoader } from '../SkeletonLoader'\nimport { Text, TextSize, TextWeight } from '../Typography'\n\nexport interface DetailsListItemProps {\n label: string\n children: ReactNode | string\n isLoading?: boolean\n}\n\nconst renderValue = (value: ReactNode | string) => {\n if (typeof value === 'string') {\n return (\n <Text weight={TextWeight.bold} size={TextSize.sm}>\n {value}\n </Text>\n )\n }\n\n return value\n}\n\nexport const DetailsListItem = ({\n label,\n children,\n isLoading,\n}: DetailsListItemProps) => {\n return (\n <li className='Layer__details-list-item'>\n <label className='Layer__details-list-item__label'>{label}</label>\n <span className='Layer__details-list-item__value'>\n {isLoading ? <SkeletonLoader /> : renderValue(children)}\n </span>\n </li>\n )\n}\n", "import React, { useContext, useEffect, useState } from 'react'\nimport { DATE_FORMAT } from '../../config/general'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LedgerAccountsLine } from '../../types'\nimport { LedgerAccountsContext, View } from '../ChartOfAccounts/ChartOfAccounts'\nimport { Text, TextWeight } from '../Typography'\nimport classNames from 'classnames'\nimport { parseISO, format as formatTime } from 'date-fns'\n\nexport interface LedgerAccountRowProps {\n row: LedgerAccountsLine\n index: number\n initialLoad?: boolean\n view: View\n}\n\nexport const LedgerAccountRow = ({\n row,\n index,\n initialLoad,\n view,\n}: LedgerAccountRowProps) => {\n const { selectedEntryId, setSelectedEntryId, closeSelectedEntry } =\n useContext(LedgerAccountsContext)\n\n const [showComponent, setShowComponent] = useState(false)\n\n useEffect(() => {\n if (initialLoad) {\n const timeoutId = setTimeout(() => {\n setShowComponent(true)\n }, index * 10)\n\n return () => clearTimeout(timeoutId)\n } else {\n setShowComponent(true)\n }\n }, [])\n\n if (view === 'tablet') {\n return (\n <tr\n className={classNames(\n 'Layer__table-row',\n row.entry_id === selectedEntryId && 'Layer__table-row--active',\n initialLoad && 'initial-load',\n 'Layer__table-row--with-show',\n showComponent ? 'show' : 'Layer__table-row--anim-starting-state',\n )}\n style={{ transitionDelay: `${15 * index}ms` }}\n onClick={() => {\n if (selectedEntryId === row.entry_id) {\n closeSelectedEntry()\n } else {\n setSelectedEntryId(row.entry_id)\n }\n }}\n >\n <td className='Layer__table-cell Layer__ledger-account-table__tablet-main-col'>\n <span className='Layer__table-cell-content'>\n <div className='Layer__ledger-account-table__tablet-main-col__date'>\n <Text>\n {row.date && formatTime(parseISO(row.date), DATE_FORMAT)}\n </Text>\n <Text\n weight={TextWeight.bold}\n className='Layer__ledger_account-table__journal-id'\n >\n #123\n </Text>\n </div>\n <Text>Invoice (TBD null)</Text>\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n {row.direction === Direction.DEBIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n {row.direction === Direction.CREDIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n $X,XXX.XX\n </span>\n </td>\n </tr>\n )\n }\n\n if (view === 'mobile') {\n return (\n <tr\n className={classNames(\n 'Layer__table-row',\n row.entry_id === selectedEntryId && 'Layer__table-row--active',\n initialLoad && 'initial-load',\n 'Layer__table-row--with-show',\n showComponent ? 'show' : 'Layer__table-row--anim-starting-state',\n )}\n style={{ transitionDelay: `${15 * index}ms` }}\n onClick={() => {\n if (selectedEntryId === row.entry_id) {\n closeSelectedEntry()\n } else {\n setSelectedEntryId(row.entry_id)\n }\n }}\n >\n <td className='Layer__table-cell Layer__ledger-account-table__tablet-main-col'>\n <span className='Layer__table-cell-content'>\n <div className='Layer__ledger-account-table__tablet-main-col__date'>\n <Text>\n {row.date && formatTime(parseISO(row.date), DATE_FORMAT)}\n </Text>\n <Text\n weight={TextWeight.bold}\n className='Layer__ledger_account-table__journal-id'\n >\n #123\n </Text>\n </div>\n <Text>Invoice (TBD null)</Text>\n <div className='Layer__ledger_account-table__balances-mobile'>\n <div className='Layer__ledger_account-table__balance-item'>\n <span className='Layer__ledger_account-table__balances-mobile__label'>\n Debit\n </span>\n <span className='Layer__ledger_account-table__balances-mobile__value'>\n {' '}\n {row.direction === Direction.DEBIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </div>\n <div className='Layer__ledger_account-table__balance-item'>\n <span className='Layer__ledger_account-table__balances-mobile__label'>\n Credit\n </span>\n <span className='Layer__ledger_account-table__balances-mobile__value'>\n {row.direction === Direction.CREDIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </div>\n <div className='Layer__ledger_account-table__balance-item'>\n <span className='Layer__ledger_account-table__balances-mobile__label'>\n Running balance\n </span>\n <span className='Layer__ledger_account-table__balances-mobile__value'>\n $X,XXX.XX\n </span>\n </div>\n </div>\n </span>\n </td>\n </tr>\n )\n }\n\n return (\n <tr\n className={classNames(\n 'Layer__table-row',\n row.entry_id === selectedEntryId && 'Layer__table-row--active',\n initialLoad && 'initial-load',\n 'Layer__table-row--with-show',\n showComponent ? 'show' : 'Layer__table-row--anim-starting-state',\n )}\n style={{ transitionDelay: `${15 * index}ms` }}\n onClick={() => {\n if (selectedEntryId === row.entry_id) {\n closeSelectedEntry()\n } else {\n setSelectedEntryId(row.entry_id)\n }\n }}\n >\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>\n {row.date && formatTime(parseISO(row.date), DATE_FORMAT)}\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content'>#123</span>\n </td>\n <td className='Layer__table-cell'>\n <span className='Layer__table-cell-content'>Invoice (TBD null)</span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n {row.direction === Direction.DEBIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n {row.direction === Direction.CREDIT &&\n `$${centsToDollars(row?.amount || 0)}`}\n </span>\n </td>\n <td className='Layer__table-cell Layer__table-cell--primary'>\n <span className='Layer__table-cell-content Layer__table-cell--amount'>\n $X,XXX.XX\n </span>\n </td>\n </tr>\n )\n}\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 {\n ColorConfig,\n ColorsPaletteOption,\n LayerThemeConfig,\n} from '../../types/layer_context'\nimport { buildColorsPalette } from '../../utils/colors'\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 colors = buildColorsPalette(theme)\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 colors,\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 useSWR(\n businessId && auth?.access_token && `categories-${businessId}`,\n Layer.getCategories(apiUrl, auth?.access_token, { params: { businessId } }),\n {\n ...defaultSWRConfig,\n onSuccess: response => {\n if (response?.data?.categories?.length) {\n dispatch({\n type: Action.setCategories,\n payload: { categories: response.data.categories || [] },\n })\n }\n },\n },\n )\n\n const setTheme = (theme: LayerThemeConfig) =>\n dispatch({\n type: Action.setTheme,\n payload: { theme },\n })\n\n const setLightColor = (color?: ColorConfig) => {\n setTheme({\n ...(state.theme ?? {}),\n colors: {\n ...(state.theme?.colors ?? {}),\n light: color,\n },\n })\n }\n\n const setDarkColor = (color?: ColorConfig) => {\n setTheme({\n ...(state.theme ?? {}),\n colors: {\n ...(state.theme?.colors ?? {}),\n dark: color,\n },\n })\n }\n\n const setColors = (colors?: {\n dark?: ColorConfig\n light?: ColorConfig\n }) => {\n setTheme({\n ...(state.theme ?? {}),\n colors\n })\n }\n\n const getColor = (shade: number): ColorsPaletteOption | undefined => {\n if (colors && shade in colors) {\n return colors[shade]\n }\n\n return\n }\n\n return (\n <SWRConfig value={defaultSWRConfig}>\n <LayerContext.Provider\n value={{ ...state, setTheme, getColor, setLightColor, setDarkColor, setColors }}\n >\n {children}\n </LayerContext.Provider>\n </SWRConfig>\n )\n}\n", "import React from 'react'\nimport { Container, Header } from '../../components/Container'\nimport { ProfitAndLoss } from '../../components/ProfitAndLoss'\nimport { Heading, HeadingSize } from '../../components/Typography'\nimport { View } from '../../components/View'\n\nexport interface AccountingOverviewProps {\n title?: string\n}\n\nexport const AccountingOverview = ({\n title = 'Accounting overview',\n}: AccountingOverviewProps) => {\n return (\n <ProfitAndLoss asContainer={false}>\n <View title={title} headerControls={<ProfitAndLoss.DatePicker />}>\n <ProfitAndLoss.Summaries actionable={false} />\n <Container\n name='accounting-overview-profit-and-loss'\n asWidget\n elevated={true}\n >\n <Header>\n <Heading size={HeadingSize.secondary}>Profit & Loss</Heading>\n </Header>\n <ProfitAndLoss.Chart />\n </Container>\n <div className='accounting-overview-profit-and-loss-charts'>\n <Container name='accounting-overview-profit-and-loss-chart'>\n <ProfitAndLoss.DetailedCharts scope='revenue' hideClose={true} />\n </Container>\n <Container name='accounting-overview-profit-and-loss-chart'>\n <ProfitAndLoss.DetailedCharts scope='expenses' hideClose={true} />\n </Container>\n </div>\n </View>\n </ProfitAndLoss>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { ViewHeader } from '../../components/ViewHeader'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { parseStylesFromThemeConfig } from '../../utils/colors'\n\nexport interface ViewProps {\n children: ReactNode\n title?: string\n headerControls?: ReactNode\n}\n\nexport const View = ({ title, children, headerControls }: ViewProps) => {\n const { theme } = useLayerContext()\n\n const styles = parseStylesFromThemeConfig(theme)\n\n return (\n <div className='Layer__view' style={{ ...styles }}>\n <ViewHeader title={title} controls={headerControls} />\n <div className='Layer__view-main'>{children}</div>\n </div>\n )\n}\n", "import React, { ReactNode } from 'react'\nimport { Heading } from '../Typography'\n\nexport interface ViewHeaderProps {\n title?: string\n controls?: ReactNode\n}\n\nexport const ViewHeader = ({ title, controls }: ViewHeaderProps) => {\n return (\n <div className='Layer__view-header'>\n <div className='Layer__view-header__content'>\n <Heading>{title}</Heading>\n {controls && (\n <div className='Layer__view-header__controls'>{controls}</div>\n )}\n </div>\n </div>\n )\n}\n", "import React from 'react'\nimport { BankTransactions } from '../../components/BankTransactions'\nimport { LinkedAccounts } from '../../components/LinkedAccounts'\nimport { View } from '../../components/View'\n\nexport interface BankTransactionsWithLinkedAccountsProps {\n title?: string\n}\n\nexport const BankTransactionsWithLinkedAccounts = ({\n title = 'Bank transactions',\n}: BankTransactionsWithLinkedAccountsProps) => {\n return (\n <View title={title}>\n <LinkedAccounts elevated={true} />\n <BankTransactions asWidget />\n </View>\n )\n}\n", "import React, { RefObject, useContext, useRef } from 'react'\nimport { Container } from '../../components/Container'\nimport { Panel } from '../../components/Panel'\nimport { ProfitAndLoss } from '../../components/ProfitAndLoss'\nimport { Toggle } from '../../components/Toggle'\nimport { View } from '../../components/View'\n\nexport interface ReportsProps {\n title?: string\n}\n\nexport interface ReportsPanelProps {\n containerRef: RefObject<HTMLDivElement>\n}\n\nexport const Reports = ({ title = 'Reports' }: ReportsProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n\n return (\n <ProfitAndLoss asContainer={false}>\n <View title={title} headerControls={<ProfitAndLoss.DatePicker />}>\n <Toggle\n name='reports-tabs'\n options={[\n {\n value: 'profitAndLoss',\n label: 'Profit & loss',\n },\n {\n value: 'balanceSheet',\n label: 'Balance sheet',\n disabled: true,\n },\n ]}\n selected='profitAndLoss'\n onChange={() => null}\n />\n <Container name='reports' ref={containerRef}>\n <ReportsPanel containerRef={containerRef} />\n </Container>\n </View>\n </ProfitAndLoss>\n )\n}\n\nconst ReportsPanel = ({ containerRef }: ReportsPanelProps) => {\n const { sidebarScope } = useContext(ProfitAndLoss.Context)\n\n return (\n <Panel\n sidebar={<ProfitAndLoss.DetailedCharts />}\n sidebarIsOpen={Boolean(sidebarScope)}\n parentRef={containerRef}\n >\n <ProfitAndLoss.Table asContainer={false} />\n </Panel>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_react", "useSWR", "import_react", "React", "import_date_fns", "React", "import_react", "React", "React", "import_react", "React", "import_date_fns", "React", "import_react", "import_swr", "useSWR", "import_react", "import_react", "React", "import_react", "React", "React", "import_react", "import_react", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "React", "import_react", "import_react", "React", "import_react", "React", "TooltipTrigger", "TooltipContent", "import_classnames", "React", "classNames", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_classnames", "classNames", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "import_classnames", "import_date_fns", "React", "classNames", "formatTime", "Select", "import_react", "React", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_classnames", "classNames", "React", "import_react", "React", "React", "import_react", "import_react_select", "DropdownIndicator", "React", "Select", "ReactSelect", "import_react", "import_react", "import_date_fns", "React", "formatTime", "import_classnames", "import_date_fns", "React", "classNames", "formatTime", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "shift", "React", "import_react", "React", "timestamp", "React", "import_classnames", "categorizeBankTransaction", "matchBankTransaction", "index", "height", "React", "classNames", "import_react", "React", "import_classnames", "import_date_fns", "categorizeBankTransaction", "matchBankTransaction", "classNames", "React", "formatTime", "import_react", "import_date_fns", "React", "formatTime", "import_classnames", "import_date_fns", "isCredit", "categorizeBankTransaction", "matchBankTransaction", "classNames", "React", "formatTime", "import_react", "import_classnames", "classNames", "React", "import_react", "import_classnames", "classNames", "React", "import_react", "React", "import_react", "Loader", "React", "import_react", "import_react", "React", "React", "import_classnames", "React", "classnames", "React", "Loader", "import_react", "import_swr", "useSWR", "React", "import_react", "import_react", "import_swr", "useSWR", "linkToken", "unlinkPlaidItem", "React", "import_react", "import_react", "React", "import_react", "import_classnames", "classNames", "React", "React", "import_react", "React", "import_classnames", "React", "classNames", "import_classnames", "COMPONENT_NAME", "classNames", "React", "Loader", "import_react", "import_react", "item", "import_date_fns", "import_swr", "useSWR", "import_react", "import_react", "React", "import_date_fns", "React", "import_react", "import_date_fns", "React", "import_react", "React", "import_react", "import_recharts", "React", "ChartText", "import_react", "React", "import_classnames", "classNames", "React", "import_react", "import_react_select", "React", "Select", "import_date_fns", "React", "import_react", "import_react", "import_classnames", "classNames", "React", "import_react", "import_recharts", "React", "import_classnames", "React", "classNames", "import_react", "import_react", "React", "PieChart", "React", "import_classnames", "React", "classNames", "Loader", "import_date_fns", "React", "import_react", "import_react", "import_classnames", "React", "classNames", "COMPONENT_NAME", "React", "import_react", "import_react", "import_swr", "useSWR", "data", "import_react", "import_swr", "useSWR", "import_react", "import_react", "React", "import_classnames", "classNames", "React", "import_react", "import_react", "import_react", "React", "Select", "React", "COMPONENT_NAME", "React", "Loader", "import_react", "import_react", "import_react", "import_classnames", "React", "classNames", "import_react", "import_date_fns", "format", "React", "formatTime", "import_react", "import_classnames", "React", "classNames", "import_react", "React", "totalDebit", "totalCredit", "React", "import_react", "import_classnames", "import_date_fns", "React", "classNames", "formatTime", "import_classnames", "classNames", "React", "Loader", "React", "import_react", "import_date_fns", "import_swr", "useSWR", "theme", "colors", "React", "import_react", "import_react", "import_react", "React", "View", "React", "React", "View", "import_react", "React", "View", "import_react", "React", "View"]
7
7
  }