@layerfi/components 0.1.0
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/README.md +70 -0
- package/dist/esm/index.js +1615 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/index.d.ts +595 -0
- package/dist/index.js +1647 -0
- package/dist/index.js.map +7 -0
- package/dist/styles/index.css +596 -0
- package/dist/styles/index.css.map +7 -0
- package/package.json +90 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/BalanceSheet/BalanceSheet.tsx", "../../src/api/util.ts", "../../src/api/layer/authenticate.ts", "../../src/api/layer/balance_sheet.json", "../../src/api/layer/balance_sheet.ts", "../../src/api/layer/authenticated_http.ts", "../../src/api/layer/bankTransactions.ts", "../../src/api/layer/categories.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/icons/ChevronRight.tsx", "../../src/models/Money.ts", "../../src/components/BankTransactions/BankTransactions.tsx", "../../src/hooks/useBankTransactions/useBankTransactions.tsx", "../../src/components/BankTransactionRow/BankTransactionRow.tsx", "../../src/icons/CheckedCircle.tsx", "../../src/icons/ChevronUp.tsx", "../../src/components/CategoryMenu/CategoryMenu.tsx", "../../src/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow.tsx", "../../src/icons/Link.tsx", "../../src/icons/LinkBroken.tsx", "../../src/components/RadioButtonGroup/RadioButtonGroup.tsx", "../../src/components/RadioButtonGroup/RadioButton.tsx", "../../src/components/Pill/Pill.tsx", "../../src/components/Hello/Hello.tsx", "../../src/components/ProfitAndLoss/ProfitAndLoss.tsx", "../../src/hooks/useProfitAndLoss/useProfitAndLoss.tsx", "../../src/components/ProfitAndLossChart/ProfitAndLossChart.tsx", "../../src/components/ProfitAndLossChart/Indicator.tsx", "../../src/components/ProfitAndLossDatePicker/ProfitAndLossDatePicker.tsx", "../../src/icons/ChevronLeft.tsx", "../../src/components/ProfitAndLossSummaries/ProfitAndLossSummaries.tsx", "../../src/components/ProfitAndLossTable/ProfitAndLossTable.tsx", "../../src/components/ProfitAndLossRow/ProfitAndLossRow.tsx", "../../src/providers/LayerProvider/LayerProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState } from 'react'\nimport { useBalanceSheet } from '../../hooks/useBalanceSheet'\nimport DownloadCloud from '../../icons/DownloadCloud'\nimport { BalanceSheetDatePicker } from '../BalanceSheetDatePicker'\nimport { BalanceSheetRow } from '../BalanceSheetRow'\nimport { 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__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>Loading</div>\n ) : (\n <div className=\"Layer__balance-sheet__table\">\n <BalanceSheetRow key={assets.name} lineItem={assets} />\n <BalanceSheetRow key={lne.name} lineItem={lne} />\n </div>\n )}\n </div>\n )\n}\n", "export const formStringFromObject = (object: Object): 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 clientId: string\n scope: string\n}\nexport const authenticate =\n ({\n appId,\n appSecret,\n authenticationUrl = 'https://auth.layerfi.com/oauth2/token',\n clientId,\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: clientId,\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 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 const getBalanceSheet = (_token: string, _params: any) => () => Data\n", "export 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 (accessToken: string | undefined, options?: { params?: Params }) =>\n (): Promise<Return> =>\n fetch(url(options?.params || ({} as Params)), {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n }).then(res => res.json() as Promise<Return>)\n\nexport const put =\n <\n Body extends Record<string, unknown> = Record<string, unknown>,\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 accessToken: string | undefined,\n options?: {\n params?: Params\n body?: Body\n },\n ): Promise<Return> =>\n fetch(url(options?.params || ({} as Params)), {\n headers: {\n Authorization: 'Bearer ' + (accessToken || ''),\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n method: 'PUT',\n body: JSON.stringify(options?.body),\n }).then(res => res.json() as Promise<Return>)\n", "import { CategoryUpdate, BankTransaction, Metadata } from '../../types'\nimport { get, put } from './authenticated_http'\n\ntype GetBankTransactionsReturn = {\n data?: BankTransaction[]\n meta?: Metadata\n error?: unknown\n}\ninterface GetBankTransactionsParams 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 `https://sandbox.layerfi.com/v1/businesses/${businessId}/bank-transactions?sort_by=${sortBy}&sort_order=${sortOrder}`,\n)\n\nexport const categorizeBankTransaction = put<\n CategoryUpdate,\n { data: BankTransaction; error: unknown }\n>(\n ({ businessId, bankTransactionId }) =>\n `https://sandbox.layerfi.com/v1/businesses/${businessId}/bank-transactions/${bankTransactionId}/categorize`,\n)\n", "import { Category } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getCategories = get<{\n data: {\n type: 'Category_List'\n categories: Category[]\n }\n}>(\n ({ businessId }) =>\n `https://sandbox.layerfi.com/v1/businesses/${businessId}/categories`,\n)\n", "import { ProfitAndLoss } from '../../types'\nimport { get } from './authenticated_http'\n\nexport const getProfitAndLoss = get<{\n data?: ProfitAndLoss\n error?: unknown\n}>(\n ({ businessId, startDate, endDate }) =>\n `https://sandbox.layerfi.com/v1/businesses/${businessId}/reports/profit-and-loss?start_date=${startDate}&end_date=${endDate}`,\n)\n", "import { authenticate } from './layer/authenticate'\nimport { getBalanceSheet } from './layer/balance_sheet'\nimport {\n getBankTransactions,\n categorizeBankTransaction,\n} from './layer/bankTransactions'\nimport { getCategories } from './layer/categories'\nimport { getProfitAndLoss } from './layer/profit_and_loss'\n\nexport const Layer = {\n authenticate,\n categorizeBankTransaction,\n getBalanceSheet,\n getBankTransactions,\n getCategories,\n getProfitAndLoss,\n}\n", "import { useContext } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\n\nexport const useLayerContext = () => useContext(LayerContext)\n", "import { createContext } from 'react'\nimport { LayerContextValues } from '../../types'\n\nexport const LayerContext = createContext<LayerContextValues>({\n auth: { access_token: '', expires_in: -1, token_type: '' },\n businessId: '',\n categories: [],\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 = {\n data: BalanceSheet | undefined\n isLoading: boolean\n error: unknown\n}\n\nexport const useBalanceSheet = (date?: Date): UseBalanceSheet => {\n const { auth, businessId } = useLayerContext()\n const dateString = format(startOfDay(date), 'yyyy-mm-dd')\n\n const { data, isLoading, error } = useSWR(\n businessId &&\n dateString &&\n auth?.access_token &&\n `balance-sheet-${businessId}-${dateString}`,\n Layer.getBalanceSheet(auth?.access_token, {\n params: { businessId, date: dateString },\n }),\n )\n\n return { data, isLoading, error }\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst DownloadCloud = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24}\n height={24}\n fill=\"none\"\n {...props}\n >\n <path\n stroke=\"#000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16.242A4.5 4.5 0 0 1 6.08 8.02a6.002 6.002 0 0 1 11.84 0A4.5 4.5 0 0 1 20 16.242M8 17l4 4m0 0 4-4m-4 4v-9\"\n />\n </svg>\n)\nexport default DownloadCloud\n", "import React, { useRef } from 'react'\nimport CalendarIcon from '../../icons/Calendar'\nimport { format } from 'date-fns'\n\ntype Props = {\n value: Date\n onChange: React.ChangeEventHandler<HTMLInputElement>\n}\n\nexport const BalanceSheetDatePicker = ({ value, onChange }: Props) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const showPicker = () => inputRef.current && inputRef.current.showPicker()\n return (\n <span className=\"Layer__balance-sheet-date-picker\">\n <button onClick={showPicker}>\n <CalendarIcon />\n {format(value, 'LLLL dd, yyyy')}\n <input\n type=\"date\"\n ref={inputRef}\n value={format(value, 'yyyy-MM-dd')}\n onChange={onChange}\n />\n </button>\n </span>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst Calendar = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={20}\n height={22}\n fill=\"none\"\n {...props}\n >\n <path\n stroke=\"#000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9H1m13-8v4M6 1v4m-.2 16h8.4c1.68 0 2.52 0 3.162-.327a3 3 0 0 0 1.311-1.311C19 18.72 19 17.88 19 16.2V7.8c0-1.68 0-2.52-.327-3.162a3 3 0 0 0-1.311-1.311C16.72 3 15.88 3 14.2 3H5.8c-1.68 0-2.52 0-3.162.327a3 3 0 0 0-1.311 1.311C1 5.28 1 6.12 1 7.8v8.4c0 1.68 0 2.52.327 3.162a3 3 0 0 0 1.311 1.311C3.28 21 4.12 21 5.8 21Z\"\n />\n </svg>\n)\nexport default Calendar\n", "import React, { useState } from 'react'\nimport ChevronDown from '../../icons/ChevronDown'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { centsToDollars } from '../../models/Money'\nimport { LineItem } from '../../types'\n\ntype Props = {\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n}\n\nexport const BalanceSheetRow = ({\n lineItem,\n depth = 0,\n maxDepth = 2,\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 const toggleExpanded = () => setExpanded(!expanded)\n const canGoDeeper = depth < maxDepth\n const hasChildren = line_items?.length > 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 return (\n <>\n <div className={labelClasses.join(' ')} onClick={toggleExpanded}>\n {expanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n {display_name}\n </div>\n <div className={valueClasses.join(' ')}>{!!value && amountString}</div>\n {canGoDeeper &&\n hasChildren &&\n expanded &&\n (line_items || []).map(line_item => (\n <BalanceSheetRow\n key={line_item.display_name}\n lineItem={line_item}\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n ))}\n </>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\nconst ChevronDown = ({ size = 24, ...props }: Props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m6 9 6 6 6-6\"\n />\n </svg>\n)\nexport default ChevronDown\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\n\nconst ChavronRight = ({ strokeColor, size, ...props }: Props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size || 24}\n height={size || 24}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke={strokeColor ?? '#000'}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m9 18 6-6-6-6\"\n />\n </svg>\n)\nexport default ChavronRight\n", "const formatter = new Intl.NumberFormat('en-US', {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n})\n\nexport const centsToDollars = (cents: number): string =>\n 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, { useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport { BankTransaction, CategorizationStatus } from '../../types'\nimport { BankTransactionRow } from '../BankTransactionRow'\nimport { RadioButtonGroup } from '../RadioButtonGroup'\n\nconst dateFormat = 'MM/dd/yyyy'\n\nenum DisplayState {\n review = 'review',\n categorized = 'categorized',\n}\n\nconst CategorizedCategories = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n]\nconst ReviewCategories = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n]\n\nconst filterVisibility =\n (display: DisplayState) => (bankTransaction: BankTransaction) => {\n const categorized = CategorizedCategories.includes(\n bankTransaction.categorization_status,\n )\n const inReview = ReviewCategories.includes(\n bankTransaction.categorization_status,\n )\n return (\n (display === DisplayState.review && inReview) ||\n (display === DisplayState.categorized && categorized)\n )\n }\n\nexport const BankTransactions = () => {\n const [display, setDisplay] = useState<DisplayState>(DisplayState.review)\n const { data } = useBankTransactions()\n const bankTransactions = data.filter(filterVisibility(display))\n const onCategorizationDisplayChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) =>\n setDisplay(\n event.target.value === DisplayState.categorized\n ? DisplayState.categorized\n : DisplayState.review,\n )\n const [openRows, setOpenRows] = useState<Record<string, boolean>>({})\n const toggleOpen = (id: string) =>\n setOpenRows({ ...openRows, [id]: !openRows[id] })\n return (\n <div className=\"Layer__bank-transactions\" data-display={display}>\n <header className=\"Layer__bank-transactions__header\">\n <h2 className=\"Layer__bank-transactions__title\">Transactions</h2>\n <RadioButtonGroup\n name=\"bank-transaction-display\"\n buttons={[\n { label: 'To Review', value: DisplayState.review },\n { label: 'Categorized', value: DisplayState.categorized },\n ]}\n selected={display}\n onChange={onCategorizationDisplayChange}\n />\n </header>\n <div className=\"Layer__bank-transactions__table\">\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header\">\n Date\n </div>\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header\">\n Transaction\n </div>\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header\">\n Account\n </div>\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header Layer__bank-transactions__table-cell--header-amount\">\n Amount\n </div>\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header\">\n Category\n </div>\n <div className=\"Layer__bank-transactions__table-cell Layer__bank-transactions__table-cell--header\">\n Actions\n </div>\n {bankTransactions.map((bankTransaction: BankTransaction) => (\n <BankTransactionRow\n key={bankTransaction.id}\n dateFormat={dateFormat}\n bankTransaction={bankTransaction}\n isOpen={openRows[bankTransaction.id]}\n toggleOpen={toggleOpen}\n editable={display === DisplayState.review}\n />\n ))}\n </div>\n </div>\n )\n}\n", "import { Layer } from '../../api/layer'\nimport { BankTransaction, CategoryUpdate, Metadata } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport useSWR from 'swr'\n\ntype UseBankTransactionsReturn = {\n data: BankTransaction[]\n metadata: Metadata\n isLoading: boolean\n error: unknown\n categorize: (\n id: BankTransaction['id'],\n newCategory: CategoryUpdate,\n ) => Promise<void>\n}\n\nexport const useBankTransactions = (): UseBankTransactionsReturn => {\n const { auth, businessId } = useLayerContext()\n\n const {\n data: responseData,\n isLoading,\n error: responseError,\n mutate,\n } = useSWR(\n businessId && auth?.access_token && `bank-transactions-${businessId}`,\n Layer.getBankTransactions(auth?.access_token, { params: { businessId } }),\n )\n const {\n data = [],\n meta: metadata = {},\n error = undefined,\n } = responseData || {}\n\n const categorize = (id: BankTransaction['id'], newCategory: CategoryUpdate) =>\n Layer.categorizeBankTransaction(auth.access_token, {\n params: { businessId, bankTransactionId: id },\n body: newCategory,\n }).then(({ data: transaction, error }) => {\n if (transaction) {\n mutate()\n }\n if (error) {\n console.error(error)\n throw error\n }\n })\n\n return { data, metadata, isLoading, error, categorize }\n}\n", "import React, { useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport CheckedCircle from '../../icons/CheckedCircle'\nimport ChevronDown from '../../icons/ChevronDown'\nimport ChevronUp from '../../icons/ChevronUp'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { BankTransaction, CategorizationType, Direction } from '../../types'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { ExpandedBankTransactionRow } from '../ExpandedBankTransactionRow'\nimport { Pill } from '../Pill'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n bankTransaction: BankTransaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n editable: boolean\n}\n\nconst isCredit = ({ direction }: Pick<BankTransaction, 'direction'>) =>\n direction === Direction.CREDIT\n\nexport const BankTransactionRow = ({\n dateFormat,\n bankTransaction,\n isOpen,\n toggleOpen,\n editable,\n}: Props) => {\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [selectedCategory, setSelectedCategory] = useState(\n bankTransaction.categorization_flow.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? bankTransaction.categorization_flow.suggestions[0]\n : undefined,\n )\n const className = 'Layer__bank-transaction-row__table-cell'\n const openClassName = isOpen ? `${className}--expanded` : ''\n\n const save = () =>\n categorizeBankTransaction(bankTransaction.id, {\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n selectedCategory?.stable_name || selectedCategory?.category || '',\n },\n })\n\n return (\n <>\n <div className={`${className} ${openClassName} ${className}--date`}>\n {formatTime(parseISO(bankTransaction.date), dateFormat)}\n </div>\n <div className={`${className} ${openClassName}`}>\n {bankTransaction.counterparty_name}\n </div>\n <div className={`${className} ${openClassName}`}>Business Checking</div>\n <div\n className={`${className} ${openClassName} ${className}--amount-${\n isCredit(bankTransaction) ? 'credit' : 'debit'\n }`}\n >\n {formatMoney(bankTransaction.amount)}\n </div>\n {isOpen ? (\n <div className={`${className} ${openClassName}`}></div>\n ) : (\n <div className={`${className} ${openClassName}`}>\n {editable ? (\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${bankTransaction.id}`}\n value={selectedCategory}\n onChange={setSelectedCategory}\n />\n ) : (\n <Pill>{bankTransaction?.category?.display_name}</Pill>\n )}\n </div>\n )}\n <div className={`${className} ${openClassName} ${className}--actions`}>\n <div\n className=\"Layer__bank-transaction-row__save-button\"\n onClick={() => save()}\n >\n {editable && !isOpen && (\n <CheckedCircle\n size={28}\n strokeColor=\"#0C48E5\"\n fillColor=\"#e0e9ff\"\n />\n )}\n </div>\n <div\n onClick={() => toggleOpen(bankTransaction.id)}\n className=\"Layer__bank-transaction-row__expand-button\"\n >\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </div>\n </div>\n {isOpen && (\n <ExpandedBankTransactionRow\n bankTransaction={bankTransaction}\n close={() => toggleOpen(bankTransaction.id)}\n />\n )}\n </>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n fillColor: string\n strokeColor: string\n}\n\nconst CheckedCircle = ({\n fillColor = 'none',\n strokeColor = '#000',\n size = 24,\n ...props\n}: Props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={fillColor}\n {...props}\n >\n <path\n stroke={strokeColor}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m7.5 12 3 3 6-6m5.5 3c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2s10 4.477 10 10Z\"\n />\n </svg>\n)\nexport default CheckedCircle\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst ChevronUp = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24}\n height={24}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke=\"#000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m18 15-6-6-6 6\"\n />\n </svg>\n)\n\nexport default ChevronUp\n", "import React from 'react'\nimport Select from 'react-select'\nimport { useLayerContext } from '../../hooks/useLayerContext'\nimport { BankTransaction, CategorizationType, Category } from '../../types'\n\ntype Props = {\n name?: string\n bankTransaction: BankTransaction\n value: Category | undefined\n onChange: (newValue: Category) => void\n}\n\nexport const CategoryMenu = ({\n bankTransaction,\n name,\n value,\n onChange,\n}: Props) => {\n const { categories } = useLayerContext()\n\n const suggestedOptions =\n bankTransaction?.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS\n ? [\n {\n label: 'Suggested',\n options: bankTransaction.categorization_flow.suggestions,\n },\n ]\n : []\n\n const categoryOptions = (categories || [])\n .map(category => {\n if (category?.subCategories && category?.subCategories?.length > 0) {\n return {\n label: category.display_name,\n options: category.subCategories,\n }\n }\n return {\n label: category.display_name,\n options: [category],\n }\n })\n .filter(x => x)\n\n const options = [...suggestedOptions, ...categoryOptions]\n\n // The menu does not show in all cases unless the\n // menuPortalTarget and styles lines exist\n // See: https://stackoverflow.com/questions/55830799/how-to-change-zindex-in-react-select-drowpdown\n return (\n <Select<Category>\n name={name}\n className=\"Layer__category-menu\"\n options={options}\n isSearchable={true}\n value={value}\n onChange={newValue => newValue && onChange(newValue)}\n getOptionLabel={category => category.display_name}\n getOptionValue={category => category.stable_name || category.category}\n menuPortalTarget={document.body}\n styles={{ menuPortal: base => ({ ...base, zIndex: 9999 }) }}\n />\n )\n}\n", "import React, { useState } from 'react'\nimport { useBankTransactions } from '../../hooks/useBankTransactions'\nimport Link from '../../icons/Link'\nimport Unlink from '../../icons/LinkBroken'\nimport {\n centsToDollars as formatMoney,\n dollarsToCents as parseMoney,\n} from '../../models/Money'\nimport {\n BankTransaction,\n SplitCategoryUpdate,\n SingleCategoryUpdate,\n Category,\n CategorizationType,\n} from '../../types'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { RadioButtonGroup } from '../RadioButtonGroup'\n\ntype Props = {\n bankTransaction: BankTransaction\n close?: () => void\n}\n\ntype Split = {\n amount: number\n inputValue: string\n category: Category | undefined\n}\n\ntype RowState = {\n splits: Split[]\n description: string\n file: unknown\n}\n\nenum Purpose {\n categorize = 'categorize',\n match = 'match',\n}\n\nexport const ExpandedBankTransactionRow = ({\n bankTransaction,\n close,\n}: Props) => {\n const { categorize: categorizeBankTransaction } = useBankTransactions()\n const [purpose, setPurpose] = useState<Purpose>(Purpose.categorize)\n\n const defaultCategory =\n bankTransaction.category ||\n (bankTransaction.categorization_flow?.type ===\n CategorizationType.ASK_FROM_SUGGESTIONS &&\n bankTransaction.categorization_flow?.suggestions?.[0])\n const [rowState, updateRowState] = useState<RowState>({\n splits: [\n {\n amount: bankTransaction.amount,\n inputValue: formatMoney(bankTransaction.amount),\n category: defaultCategory,\n },\n ],\n description: '',\n file: undefined,\n })\n\n const addSplit = () =>\n updateRowState({\n ...rowState,\n splits: [\n ...rowState.splits,\n { amount: 0, inputValue: '0.00', category: defaultCategory },\n ],\n })\n\n const removeSplit = () =>\n updateRowState({\n ...rowState,\n splits: rowState.splits.slice(0, -1),\n })\n\n const updateAmounts =\n (rowNumber: number) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const newAmount = parseMoney(event.target.value) || 0\n const newDisplaying = event.target.value\n const splitTotal = rowState.splits\n .slice(0, -1)\n .reduce((sum, split, index) => {\n const amount = index === rowNumber ? newAmount : split.amount\n return sum + amount\n }, 0)\n const remaining = bankTransaction.amount - splitTotal\n rowState.splits[rowNumber].amount = newAmount\n rowState.splits[rowNumber].inputValue = newDisplaying\n rowState.splits[rowState.splits.length - 1].amount = remaining\n rowState.splits[rowState.splits.length - 1].inputValue =\n formatMoney(remaining)\n updateRowState({ ...rowState })\n }\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n const [_, index] = event.target.name.split('-')\n rowState.splits[parseInt(index)].inputValue = '0.00'\n updateRowState({ ...rowState })\n }\n }\n\n const onChangePurpose = (event: React.ChangeEvent<HTMLInputElement>) =>\n setPurpose(\n event.target.value === Purpose.match ? Purpose.match : Purpose.categorize,\n )\n\n const changeCategory = (index: number, newValue: Category) => {\n rowState.splits[index].category = newValue\n updateRowState({ ...rowState })\n }\n\n const save = () =>\n categorizeBankTransaction(\n bankTransaction.id,\n rowState.splits.length === 1\n ? ({\n type: 'Category',\n category: {\n type: 'StableName',\n stable_name:\n rowState?.splits[0].category?.stable_name ||\n rowState?.splits[0].category?.category,\n },\n } as SingleCategoryUpdate)\n : ({\n type: 'Split',\n entries: rowState.splits.map(split => ({\n category: split.category?.stable_name || split.category?.category,\n amount: split.amount,\n })),\n } as SplitCategoryUpdate),\n ).then(close)\n\n const className = 'Layer__expanded-bank-transaction-row'\n return (\n <div className={className}>\n <div className={`${className}__purpose-button`}>\n <RadioButtonGroup\n name={`purpose-${bankTransaction.id}`}\n size=\"small\"\n buttons={[\n { value: 'categorize', label: 'Categorize' },\n { value: 'match', label: 'Match', disabled: true },\n ]}\n selected={purpose}\n onChange={onChangePurpose}\n />\n </div>\n <div\n className={`${className}__content`}\n id={`expanded-${bankTransaction.id}`}\n >\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n ></div>\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n >\n Category\n </div>\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n >\n Description\n </div>\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n >\n Receipt\n </div>\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n ></div>\n <div\n className={`${className}__table-cell ${className}__table-cell--header`}\n ></div>\n\n <div className={`${className}__table-cell`}>\n {rowState.splits.length === 1 ? (\n <div className={`${className}__button--split`} onClick={addSplit}>\n <Unlink className={`${className}__svg`} size={18} />\n Split\n </div>\n ) : (\n <div\n className={`${className}__button--merge`}\n onClick={removeSplit}\n >\n <Link className={`${className}__svg`} size={18} />\n Merge\n </div>\n )}\n </div>\n <div className={`${className}__table-cell`}>\n {rowState.splits.map((split, index) => (\n <div\n className={`${className}__table-cell--split-entry`}\n key={`split-${index}`}\n >\n <CategoryMenu\n bankTransaction={bankTransaction}\n name={`category-${index}`}\n value={split.category}\n onChange={value => changeCategory(index, value)}\n />\n {rowState.splits.length > 1 && (\n <input\n type=\"text\"\n name={`split-${index}`}\n disabled={index + 1 === rowState.splits.length}\n onChange={updateAmounts(index)}\n value={split.inputValue}\n onBlur={onBlur}\n className={`${className}__split-amount${\n split.amount < 0 ? '--negative' : ''\n }`}\n />\n )}\n </div>\n ))}\n </div>\n <div\n className={`${className}__table-cell ${className}__table-cell--description`}\n >\n <textarea></textarea>\n </div>\n <div className={`${className}__table-cell`}>\n <input type=\"file\" />\n </div>\n <div className={`${className}__table-cell`}></div>\n <div className={`${className}__table-cell`}>\n <button onClick={save} className={`${className}__button--save`}>\n Save\n </button>\n </div>\n </div>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\n\nconst Link = ({ size = 24, ...props }: Props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke=\"#000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m12.708 18.364-1.415 1.414a5 5 0 1 1-7.07-7.07l1.413-1.415m12.728 1.414 1.415-1.414a5 5 0 0 0-7.071-7.071l-1.415 1.414M8.5 15.5l7-7\"\n />\n </svg>\n)\nexport default Link\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = SVGProps<SVGSVGElement> & {\n size: SVGProps<SVGSVGElement>['width']\n}\n\nconst LinkBroken = ({ size = 24, ...props }: Props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke=\"#000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m8.5 15.5 7-7M9 4V2m6 18v2M4 9H2m18 6h2M4.914 4.914 3.5 3.5m15.586 15.586L20.5 20.5M12 17.657l-2.121 2.121a4 4 0 1 1-5.657-5.657L6.343 12m11.314 0 2.121-2.121a4 4 0 0 0-5.657-5.657L12 6.343\"\n />\n </svg>\n)\nexport default LinkBroken\n", "import React, { useState } from 'react'\nimport { RadioButton } from './RadioButton'\n\nexport type RadioButtonLabel = {\n label: string\n value: string\n disabled?: boolean\n}\n\ntype Props = {\n name: string\n size?: 'small' | 'large'\n buttons: RadioButtonLabel[]\n selected?: RadioButtonLabel['value']\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n}\n\nexport const RadioButtonGroup = ({\n name,\n size = 'large',\n buttons,\n onChange,\n selected,\n}: Props) => {\n const selectedValue = selected || buttons[0].value\n return (\n <div\n className={`Layer__radio-button-group Layer__radio-button-group--size-${size}`}\n >\n {buttons.map(button => (\n <RadioButton\n {...button}\n key={button.value}\n name={name}\n size={size}\n checked={selectedValue === button.value}\n onChange={onChange}\n disabled={button.disabled ?? false}\n />\n ))}\n </div>\n )\n}\n", "import React from 'react'\n\ntype Props = {\n checked: boolean\n label: string\n name: string\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n value: string\n disabled?: boolean\n size: 'small' | 'large'\n}\n\nexport const RadioButton = ({\n checked,\n label,\n name,\n onChange,\n value,\n disabled,\n size,\n}: Props) => {\n return (\n <label\n className={`Layer__radio-button-group__radio-button Layer__radio-button-group__radio-button--size-${size}`}\n >\n <input\n type=\"radio\"\n checked={checked}\n name={name}\n onChange={onChange}\n value={value}\n disabled={disabled ?? false}\n />\n <div>{label}</div>\n </label>\n )\n}\n", "import React, { PropsWithChildren } from 'react'\n\nexport const Pill = ({ children }: PropsWithChildren) => (\n <span className=\"Layer__pill\">{children}</span>\n)\n", "import React from 'react'\nimport useSWR from 'swr'\n\ntype Props = {\n user?: string | undefined\n}\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json())\n\nexport const Hello = ({ user }: Props) => {\n const { data, isLoading } = useSWR(\n `https://api.github.com/users/${user || 'jyurek'}`,\n fetcher,\n )\n const name = (isLoading ? '...' : data?.name) || 'User'\n return (\n <>\n <div className=\"hello\">Hello, {name}!</div>\n </>\n )\n}\n", "import React, { PropsWithChildren, createContext } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLossChart } from '../ProfitAndLossChart'\nimport { ProfitAndLossDatePicker } from '../ProfitAndLossDatePicker'\nimport { ProfitAndLossSummaries } from '../ProfitAndLossSummaries'\nimport { ProfitAndLossTable } from '../ProfitAndLossTable'\nimport { endOfMonth, startOfMonth } from 'date-fns'\n\ntype PNLContextType = ReturnType<typeof useProfitAndLoss>\nconst PNLContext = createContext<PNLContextType>({\n data: undefined,\n isLoading: true,\n error: undefined,\n dateRange: {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n changeDateRange: () => {},\n})\n\nconst ProfitAndLoss = ({ children }: PropsWithChildren) => {\n const contextData = useProfitAndLoss()\n return (\n <PNLContext.Provider value={contextData}>\n <div className=\"Layer__profit-and-loss\">\n <h2 className=\"Layer__profit-and-loss__title\">Profit & Loss</h2>\n {children}\n </div>\n </PNLContext.Provider>\n )\n}\n\nProfitAndLoss.Chart = ProfitAndLossChart\nProfitAndLoss.Context = PNLContext\nProfitAndLoss.DatePicker = ProfitAndLossDatePicker\nProfitAndLoss.Summaries = ProfitAndLossSummaries\nProfitAndLoss.Table = ProfitAndLossTable\nexport { ProfitAndLoss }\n", "import { useState } from 'react'\nimport { Layer } from '../../api/layer'\nimport { ProfitAndLoss, DateRange } from '../../types'\nimport { useLayerContext } from '../useLayerContext'\nimport { startOfMonth, endOfMonth, formatISO } from 'date-fns'\nimport useSWR from 'swr'\n\ntype UseProfitAndLoss = {\n data: ProfitAndLoss | undefined\n isLoading: boolean\n error: unknown\n dateRange: DateRange\n changeDateRange: (dateRange: Partial<DateRange>) => void\n}\n\ntype Props = DateRange\n\nexport const useProfitAndLoss = (\n { startDate: initialStartDate, endDate: initialEndDate }: Props = {\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date()),\n },\n): UseProfitAndLoss => {\n const { auth, businessId } = useLayerContext()\n const [startDate, setStartDate] = useState(\n initialStartDate || startOfMonth(Date.now()),\n )\n const [endDate, setEndDate] = useState(\n initialEndDate || endOfMonth(Date.now()),\n )\n\n const {\n data: rawData,\n isLoading,\n error: rawError,\n } = useSWR(\n businessId &&\n startDate &&\n endDate &&\n auth?.access_token &&\n `profit-and-loss-${businessId}-${startDate.valueOf()}-${endDate.valueOf()}`,\n Layer.getProfitAndLoss(auth?.access_token, {\n params: {\n businessId,\n startDate: formatISO(startDate),\n endDate: formatISO(endDate),\n },\n }),\n )\n const { data, error } = rawData || {}\n\n const changeDateRange = ({\n startDate: newStartDate,\n endDate: newEndDate,\n }: Partial<DateRange>) => {\n newStartDate && setStartDate(newStartDate)\n newEndDate && setEndDate(newEndDate)\n }\n\n return {\n data,\n isLoading,\n error: error || rawError,\n dateRange: { startDate, endDate },\n changeDateRange,\n }\n}\n", "import React, { useContext, useMemo, useRef, useState } from 'react'\nimport { useProfitAndLoss } from '../../hooks/useProfitAndLoss'\nimport { ProfitAndLoss } from '../../types'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { Indicator } from './Indicator'\nimport { endOfMonth, format, parseISO, startOfMonth, sub } from 'date-fns'\nimport {\n BarChart,\n XAxis,\n Cell,\n Bar,\n LabelList,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n} from 'recharts'\nimport { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart'\n\nconst barGap = 4\nconst barSize = 20\n\nexport const ProfitAndLossChart = () => {\n const { changeDateRange, dateRange } = useContext(PNL.Context)\n const thisMonth = startOfMonth(Date.now())\n\n const startSelectionMonth = dateRange.startDate.getMonth()\n const endSelectionMonth = dateRange.endDate.getMonth()\n\n // Yes, this looks weird, but we have to load all the data from the\n // last 12 months as we don't have a single endpoint yet. And we\n // can't use hooks in a loop.\n const monthData: (ProfitAndLoss | undefined)[] = []\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 11 })),\n endDate: endOfMonth(sub(thisMonth, { months: 11 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 10 })),\n endDate: endOfMonth(sub(thisMonth, { months: 10 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 9 })),\n endDate: endOfMonth(sub(thisMonth, { months: 9 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 8 })),\n endDate: endOfMonth(sub(thisMonth, { months: 8 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 7 })),\n endDate: endOfMonth(sub(thisMonth, { months: 7 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 6 })),\n endDate: endOfMonth(sub(thisMonth, { months: 6 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 5 })),\n endDate: endOfMonth(sub(thisMonth, { months: 5 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 4 })),\n endDate: endOfMonth(sub(thisMonth, { months: 4 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 3 })),\n endDate: endOfMonth(sub(thisMonth, { months: 3 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 2 })),\n endDate: endOfMonth(sub(thisMonth, { months: 2 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: startOfMonth(sub(thisMonth, { months: 1 })),\n endDate: endOfMonth(sub(thisMonth, { months: 1 })),\n })?.data,\n )\n monthData.push(\n useProfitAndLoss({\n startDate: thisMonth,\n endDate: endOfMonth(thisMonth),\n })?.data,\n )\n\n const getMonthName = (pnl: ProfitAndLoss | undefined) =>\n !!pnl ? format(parseISO(pnl.start_date), 'LLL') : ''\n\n const summarizePnL = (pnl: ProfitAndLoss | undefined) => ({\n name: getMonthName(pnl),\n revenue: pnl?.income.value || 0,\n expenses: (pnl?.income.value || 0) - (pnl?.net_profit || 0),\n selected:\n !!pnl &&\n parseISO(pnl.start_date).getMonth() >= startSelectionMonth &&\n parseISO(pnl.end_date).getMonth() <= endSelectionMonth,\n })\n\n const onClick: CategoricalChartFunc = ({ activeTooltipIndex }) => {\n const selection = monthData[activeTooltipIndex || -1]\n if (selection) {\n const { start_date: startDate, end_date: endDate } = selection\n changeDateRange({\n startDate: parseISO(startDate),\n endDate: parseISO(endDate),\n })\n }\n }\n\n // If net profit doesn't change, we're probably still the same.\n const data = useMemo(\n () => monthData.map(summarizePnL),\n [\n startSelectionMonth,\n endSelectionMonth,\n ...monthData.map(m => m?.net_profit),\n ],\n )\n\n const [animateFrom, setAnimateFrom] = useState(-1)\n\n return (\n <ResponsiveContainer width=\"100%\" height={250}>\n <BarChart\n margin={{ left: 24, right: 24, bottom: 24 }}\n data={data}\n onClick={onClick}\n barGap={barGap}\n className=\"Layer__profit-and-loss-chart\"\n >\n <CartesianGrid vertical={false} />\n <Legend\n verticalAlign=\"top\"\n align=\"left\"\n payload={[\n { value: 'Income', type: 'circle', id: 'IncomeLegend' },\n { value: 'Expenses', type: 'circle', id: 'ExpensesLegend' },\n ]}\n />\n <XAxis dataKey=\"name\" tickLine={false} />\n <Bar\n dataKey=\"revenue\"\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className=\"Layer__profit-and-loss-chart__bar--income\"\n >\n <LabelList\n content={\n <Indicator\n animateFrom={animateFrom}\n setAnimateFrom={setAnimateFrom}\n />\n }\n />\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n <Bar\n dataKey=\"expenses\"\n barSize={barSize}\n isAnimationActive={false}\n radius={[barSize / 4, barSize / 4, 0, 0]}\n className=\"Layer__profit-and-loss-chart__bar--expenses\"\n >\n {data.map(entry => (\n <Cell\n key={entry.name}\n className={\n entry.selected\n ? 'Layer__profit-and-loss-chart__cell--selected'\n : ''\n }\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n )\n}\n", "import React, { useEffect, useLayoutEffect } 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 selected\n// month changes on the chart. As a result, the coordinates are not persistent\n// and so resist CSS animation. That way we ork around this is by telling the\n// parent component what its X value is. The parent renders using that X as the\n// \"animateFrom\" value. This then tells the paren its new X, which becomes the\n// new \"animateFrom\", set using useState setter, which causes a render, which\n// causes the new `animateFrom` to be passed in, which causes a change in the\n// X coordinate, which causes a transition to trigger.\n\ntype Props = BaseProps & {\n animateFrom: number\n setAnimateFrom: (x: number) => void\n}\nconst emptyViewBox = { x: 0, y: 0, width: 0, height: 0 }\nexport const Indicator = ({\n viewBox = {},\n className,\n animateFrom,\n setAnimateFrom,\n}: Props) => {\n if (!className?.match(/selected/)) {\n return null\n }\n\n const {\n x: animateTo = 0,\n y = 0,\n width = 0,\n height = 0,\n } = 'x' in viewBox ? viewBox : emptyViewBox\n const boxWidth = width * 2 + 4 // the bar gap is 4\n const multiplier = 1.5\n const xOffset = (boxWidth * multiplier - boxWidth) / 2\n\n // useEffect callbacks run after the browser paints\n useEffect(() => {\n setAnimateFrom(animateTo)\n }, [animateTo])\n\n const actualX = animateFrom === -1 ? animateTo : animateFrom\n return (\n <rect\n className=\"Layer__profit-and-loss-chart__selection-indicator\"\n style={{\n width: `${boxWidth * multiplier}px`,\n x: actualX - xOffset,\n y: y + height,\n }}\n />\n )\n}\n", "import React, { useState, useContext } from 'react'\nimport ChevronLeft from '../../icons/ChevronLeft'\nimport ChevronRight from '../../icons/ChevronRight'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { add, endOfMonth, format, startOfMonth, Duration } from 'date-fns'\n\nexport const ProfitAndLossDatePicker = () => {\n const { changeDateRange, dateRange } = useContext(ProfitAndLoss.Context)\n const date = dateRange.startDate\n const label = format(date, 'LLLL y')\n const change = (duration: Duration) => {\n const newDate = add(date, duration)\n changeDateRange({\n startDate: startOfMonth(newDate),\n endDate: endOfMonth(newDate),\n })\n }\n const previousMonth = () => change({ months: -1 })\n const nextMonth = () => change({ months: 1 })\n return (\n <div className=\"Layer__profit-and-loss-date-picker\">\n <button\n aria-label=\"View Previous Month\"\n className=\"Layer__profit-and-loss-date-picker__button\"\n onClick={previousMonth}\n >\n <ChevronLeft\n className=\"Layer__profit-and-loss-date-picker__button-icon\"\n size={18}\n />\n </button>\n <span className=\"Layer__profit-and-loss-date-picker__label\">{label}</span>\n <button\n aria-label=\"View Next Month\"\n className=\"Layer__profit-and-loss-date-picker__button\"\n onClick={nextMonth}\n >\n <ChevronRight\n className=\"Layer__profit-and-loss-date-picker__button-icon\"\n size={18}\n />\n </button>\n </div>\n )\n}\n", "import * as React from 'react'\nimport { SVGProps } from 'react'\n\ntype Props = {\n strokeColor?: string\n size?: number\n}\n\nconst ChevronLeft = ({\n strokeColor,\n size,\n ...props\n}: Props & SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size || 24}\n height={size || 24}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke={strokeColor ?? '#000'}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m15 18-6-6 6-6\"\n />\n </svg>\n)\nexport default ChevronLeft\n", "import React, { useContext } from 'react'\nimport { centsToDollars as formatMoney } from '../../models/Money'\nimport { ProfitAndLoss as PNL } from '../ProfitAndLoss'\nimport { format as formatDate, parseISO } from 'date-fns'\n\nexport const ProfitAndLossSummaries = () => {\n const { data } = useContext(PNL.Context)\n if (!data) {\n return null\n }\n\n const monthName = formatDate(parseISO(data?.start_date), 'LLLL')\n\n return (\n <div className=\"Layer__profit-and-loss-summaries\">\n <div className=\"Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--income\">\n <span className=\"Layer__profit-and-loss-summaries__title\">Revenue</span>\n <span className=\"Layer__profit-and-loss-summaries__amount\">\n {formatMoney(data.income.value)}\n </span>\n </div>\n <div className=\"Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--expenses\">\n <span className=\"Layer__profit-and-loss-summaries__title\">\n Expenses\n </span>\n <span className=\"Layer__profit-and-loss-summaries__amount\">\n {formatMoney(Math.abs(data.income.value - data.net_profit))}\n </span>\n </div>\n <div className=\"Layer__profit-and-loss-summaries__summary Layer__profit-and-loss-summaries__summary--net-profit\">\n <span className=\"Layer__profit-and-loss-summaries__title\">\n Net Profit\n </span>\n <span className=\"Layer__profit-and-loss-summaries__amount\">\n {formatMoney(data.net_profit)}\n </span>\n </div>\n </div>\n )\n}\n", "import React, { useContext } from 'react'\nimport { Direction } from '../../types'\nimport { ProfitAndLoss } from '../ProfitAndLoss'\nimport { ProfitAndLossRow } from '../ProfitAndLossRow'\n\nexport const ProfitAndLossTable = () => {\n const { data, isLoading } = useContext(ProfitAndLoss.Context)\n return (\n <div className=\"Layer__profit-and-loss-table\">\n {!data || isLoading ? (\n <div>Loading</div>\n ) : (\n <>\n <ProfitAndLossRow\n lineItem={data.income}\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow\n lineItem={data.cost_of_goods_sold}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.gross_profit,\n display_name: 'Gross Profit',\n }}\n variant=\"GROSS\"\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow\n lineItem={data.expenses}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={{\n value: data.profit_before_taxes,\n display_name: 'Profit Before Taxes',\n }}\n variant=\"BEFORETAX\"\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow lineItem={data.taxes} direction={Direction.DEBIT} />\n <ProfitAndLossRow\n lineItem={{\n value: data.net_profit,\n display_name: 'Net Profit',\n }}\n variant=\"NETPROFIT\"\n direction={Direction.CREDIT}\n />\n <ProfitAndLossRow\n lineItem={data.other_outflows}\n direction={Direction.DEBIT}\n />\n <ProfitAndLossRow\n lineItem={data.personal_expenses}\n direction={Direction.DEBIT}\n />\n </>\n )}\n </div>\n )\n}\n", "import React from 'react'\nimport { centsToDollars } from '../../models/Money'\nimport { Direction, LineItem } from '../../types'\n\ntype Props = {\n variant?: string\n depth?: number\n maxDepth?: number\n lineItem?: LineItem | null\n direction?: Direction\n}\n\nexport const ProfitAndLossRow = ({\n variant,\n lineItem,\n depth = 0,\n maxDepth = 1,\n direction = Direction.DEBIT,\n}: Props) => {\n if (!lineItem) {\n return null\n }\n const { value, display_name, line_items, name } = lineItem\n const variantName = variant || name\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 valueClasses.push(\n direction === Direction.CREDIT\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 variantName &&\n labelClasses.push(\n `Layer__profit-and-loss-row__label--variant-${variantName}`,\n )\n variantName &&\n valueClasses.push(\n `Layer__profit-and-loss-row__value--variant-${variantName}`,\n )\n return (\n <>\n <div className={labelClasses.join(' ')}>{display_name}</div>\n <div className={valueClasses.join(' ')}>{amountString}</div>\n {depth < maxDepth &&\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 </>\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 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 return { ...state, ...action.payload }\n default:\n return state\n }\n}\n\ntype LayerEnvironmentConfig = {\n url: string\n scope: string\n}\nexport const LayerEnvironment: Record<string, LayerEnvironmentConfig> = {\n production: {\n url: 'not defined yet',\n scope: 'not defined yet',\n },\n staging: {\n url: 'https://auth.layerfi.com/oauth2/token',\n scope: 'https://sandbox.layerfi.com/sandbox',\n },\n}\n\ntype Props = {\n businessId: string\n appId: string\n appSecret: string\n clientId: string\n environment?: keyof typeof LayerEnvironment\n}\n\nexport const LayerProvider = ({\n appId,\n appSecret,\n businessId,\n children,\n clientId,\n environment = 'production',\n}: PropsWithChildren<Props>) => {\n const defaultSWRConfig = {\n revalidateInterval: 0,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n revalidateIfStale: false,\n }\n\n const { url, scope } = LayerEnvironment[environment]\n const [state, dispatch] = useReducer(reducer, {\n auth: { access_token: '', token_type: '', expires_in: 0 },\n businessId,\n categories: [],\n })\n\n const { data: auth } = useSWR(\n 'authenticate',\n Layer.authenticate({\n appId,\n appSecret,\n authenticationUrl: url,\n scope,\n clientId,\n }),\n defaultSWRConfig,\n )\n useEffect(() => {\n if (!!auth?.access_token) {\n dispatch({ type: Action.setAuth, payload: { auth } })\n }\n }, [auth?.access_token])\n\n const { data: categories } = useSWR(\n businessId && auth?.access_token && `categories-${businessId}`,\n Layer.getCategories(auth?.access_token, { params: { businessId } }),\n defaultSWRConfig,\n )\n useEffect(() => {\n if (!!categories?.data?.categories?.length) {\n dispatch({\n type: Action.setCategories,\n payload: { categories: categories.data.categories || [] },\n })\n }\n }, [categories?.data?.categories?.length])\n\n return (\n <SWRConfig value={defaultSWRConfig}>\n <LayerContext.Provider value={state}>{children}</LayerContext.Provider>\n </SWRConfig>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useState", "React", "React", "format", "React", "React", "React", "React", "React", "format", "useState", "React", "React", "useState", "useSWR", "error", "React", "useState", "React", "React", "React", "React", "React", "useState", "React", "React", "React", "React", "React", "categorizeBankTransaction", "useState", "React", "React", "parseISO", "dateFormat", "categorizeBankTransaction", "useState", "React", "useState", "React", "React", "useSWR", "React", "createContext", "useState", "useSWR", "useState", "React", "useContext", "useState", "React", "endOfMonth", "format", "parseISO", "startOfMonth", "useContext", "useState", "React", "React", "useContext", "React", "endOfMonth", "format", "startOfMonth", "useContext", "React", "React", "useContext", "parseISO", "useContext", "React", "React", "useContext", "React", "React", "useContext", "React", "endOfMonth", "startOfMonth", "createContext", "React", "React", "useEffect", "useSWR", "useEffect", "React"]
|
|
7
|
+
}
|