@layerfi/components 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +339 -145
- package/dist/esm/index.js.map +4 -4
- package/dist/index.css +106 -0
- package/dist/index.css.map +7 -0
- package/dist/index.d.ts +41 -7
- package/dist/index.esm.css +106 -0
- package/dist/index.esm.css.map +7 -0
- package/dist/index.esm.js +252 -0
- package/dist/index.esm.js.map +7 -0
- package/dist/index.js +354 -160
- package/dist/index.js.map +4 -4
- package/dist/styles/index.css +64 -1
- package/dist/styles/index.css.map +3 -3
- package/package.json +1 -1
- package/index.d.ts +0 -1309
package/dist/index.css
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/* src/components/Hello/Hello.css */
|
|
2
|
+
.hello {
|
|
3
|
+
color: red;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* src/components/Transactions/Transactions.css */
|
|
7
|
+
.transactions {
|
|
8
|
+
--transaction-buttons-border-color: #D0D5DD;
|
|
9
|
+
--transaction-buttons-selected-background-color: #E0E9FF;
|
|
10
|
+
--transaction-table-background-color: white;
|
|
11
|
+
--transaction-table-border-color: #EAECF0;
|
|
12
|
+
--transaction-table-text-color: #101828;
|
|
13
|
+
}
|
|
14
|
+
.transactions {
|
|
15
|
+
margin: 3rem;
|
|
16
|
+
border-radius: 0.6rem;
|
|
17
|
+
border: 1px solid var(--transaction-table-border-color);
|
|
18
|
+
background-color: var(--transaction-table-background-color);
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
}
|
|
21
|
+
.transactions header {
|
|
22
|
+
display: flex;
|
|
23
|
+
padding: 1rem;
|
|
24
|
+
}
|
|
25
|
+
.transactions header h1 {
|
|
26
|
+
display: flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
flex: 1;
|
|
29
|
+
justify-content: flex-start;
|
|
30
|
+
font-size: 1.5rem;
|
|
31
|
+
font-style: normal;
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
line-height: 2rem;
|
|
34
|
+
margin: 0;
|
|
35
|
+
}
|
|
36
|
+
.transactions header div {
|
|
37
|
+
display: flex;
|
|
38
|
+
font-size: 1rem;
|
|
39
|
+
align-items: center;
|
|
40
|
+
flex: 1;
|
|
41
|
+
justify-content: flex-end;
|
|
42
|
+
}
|
|
43
|
+
.transactions .transaction-table {
|
|
44
|
+
display: grid;
|
|
45
|
+
grid-template-columns: auto repeat(4, 1fr) repeat(3, auto);
|
|
46
|
+
gap: 1px 0px;
|
|
47
|
+
background-color: var(--transaction-table-border-color);
|
|
48
|
+
border-top: 1px solid var(--transaction-table-border-color);
|
|
49
|
+
border-radius: 0.6rem;
|
|
50
|
+
}
|
|
51
|
+
.transactions .transaction-table div {
|
|
52
|
+
padding: 1rem;
|
|
53
|
+
background-color: white;
|
|
54
|
+
overflow: clip;
|
|
55
|
+
color: var(--transaction-table-text-color);
|
|
56
|
+
font-family: sans-serif;
|
|
57
|
+
font-size: 16px;
|
|
58
|
+
font-style: normal;
|
|
59
|
+
font-weight: 500;
|
|
60
|
+
line-height: 20px;
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: row;
|
|
63
|
+
align-items: center;
|
|
64
|
+
}
|
|
65
|
+
.transactions .transaction-table div select {
|
|
66
|
+
border: 2px solid var(--transaction-table-border-color);
|
|
67
|
+
border-radius: 0.6rem;
|
|
68
|
+
background-color: var(--transaction-table-background-color);
|
|
69
|
+
padding: 0.6rem 0.8rem;
|
|
70
|
+
}
|
|
71
|
+
.transactions .transaction-table div.header {
|
|
72
|
+
font-weight: bold;
|
|
73
|
+
}
|
|
74
|
+
.transactions .transaction-table div.expand-area {
|
|
75
|
+
grid-column: 1 / -1;
|
|
76
|
+
margin-top: -1px;
|
|
77
|
+
}
|
|
78
|
+
.transactions .transaction-table div.expand-content {
|
|
79
|
+
padding: 1rem;
|
|
80
|
+
text-align: center;
|
|
81
|
+
}
|
|
82
|
+
.transactions .radio-group {
|
|
83
|
+
}
|
|
84
|
+
.transactions .radio-group input {
|
|
85
|
+
position: absolute;
|
|
86
|
+
opacity: 0;
|
|
87
|
+
}
|
|
88
|
+
.transactions .radio-group div {
|
|
89
|
+
padding: 0.6rem 1rem;
|
|
90
|
+
border: 1px solid var(--transaction-buttons-border-color);
|
|
91
|
+
border-right: 0;
|
|
92
|
+
border-radius: 0;
|
|
93
|
+
}
|
|
94
|
+
.transactions .radio-group label:first-of-type div {
|
|
95
|
+
border-start-start-radius: 0.6rem;
|
|
96
|
+
border-end-start-radius: 0.6rem;
|
|
97
|
+
}
|
|
98
|
+
.transactions .radio-group label:last-of-type div {
|
|
99
|
+
border-right: 1px solid var(--transaction-buttons-border-color);
|
|
100
|
+
border-start-end-radius: 0.6rem;
|
|
101
|
+
border-end-end-radius: 0.6rem;
|
|
102
|
+
}
|
|
103
|
+
.transactions .radio-group input:checked + div {
|
|
104
|
+
background: var(--transaction-buttons-selected-background-color);
|
|
105
|
+
}
|
|
106
|
+
/*# sourceMappingURL=index.css.map */
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/Hello/Hello.css", "../src/components/Transactions/Transactions.css"],
|
|
4
|
+
"sourcesContent": [".hello {\n color: red;\n}\n", ".transactions {\n --transaction-buttons-border-color: #D0D5DD;\n --transaction-buttons-selected-background-color: #E0E9FF;\n --transaction-table-background-color: white;\n --transaction-table-border-color: #EAECF0;\n --transaction-table-text-color: #101828;\n}\n\n.transactions {\n margin: 3rem;\n border-radius: 0.6rem;\n border: 1px solid var(--transaction-table-border-color);\n background-color: var(--transaction-table-background-color);\n overflow: hidden;\n}\n\n.transactions header {\n display: flex;\n padding: 1rem;\n}\n\n.transactions header h1 {\n display: flex;\n align-items: center;\n flex: 1;\n justify-content: flex-start;\n font-size: 1.5rem;\n font-style: normal;\n font-weight: 600;\n line-height: 2rem;\n margin: 0;\n}\n\n.transactions header div {\n display: flex;\n font-size: 1rem;\n align-items: center;\n flex: 1;\n justify-content: flex-end;\n}\n\n.transactions .transaction-table {\n display: grid;\n grid-template-columns: auto repeat(4, 1fr) repeat(3, auto);\n gap: 1px 0px;\n background-color: var(--transaction-table-border-color);\n border-top: 1px solid var(--transaction-table-border-color);\n border-radius: 0.6rem;\n}\n\n.transactions .transaction-table div {\n padding: 1rem;\n background-color: white;\n overflow: clip;\n color: var(--transaction-table-text-color);\n font-family: sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n line-height: 20px;\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.transactions .transaction-table div select {\n border: 2px solid var(--transaction-table-border-color);\n border-radius: 0.6rem;\n background-color: var(--transaction-table-background-color);\n padding: 0.6rem 0.8rem;\n}\n\n.transactions .transaction-table div.header {\n font-weight: bold;\n}\n\n.transactions .transaction-table div.expand-area {\n grid-column: 1 / -1;\n margin-top: -1px;\n}\n\n.transactions .transaction-table div.expand-content {\n padding: 1rem;\n text-align: center;\n}\n\n.transactions .radio-group {\n}\n\n.transactions .radio-group input {\n position: absolute;\n opacity: 0;\n}\n\n.transactions .radio-group div {\n padding: 0.6rem 1rem;\n border: 1px solid var(--transaction-buttons-border-color);\n border-right: 0;\n border-radius: 0;\n}\n\n.transactions .radio-group label:first-of-type div {\n border-start-start-radius: 0.6rem;\n border-end-start-radius: 0.6rem;\n}\n\n.transactions .radio-group label:last-of-type div {\n border-right: 1px solid var(--transaction-buttons-border-color);\n border-start-end-radius: 0.6rem;\n border-end-end-radius: 0.6rem;\n}\n\n.transactions .radio-group input:checked + div {\n background: var(--transaction-buttons-selected-background-color);\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,CAAC;AACC,SAAO;AACT;;;ACFA,CAAC;AACC,sCAAoC;AACpC,mDAAiD;AACjD,wCAAsC;AACtC,oCAAkC;AAClC,kCAAgC;AAClC;AAEA,CARC;AASC,UAAQ;AACR,iBAAe;AACf,UAAQ,IAAI,MAAM,IAAI;AACtB,oBAAkB,IAAI;AACtB,YAAU;AACZ;AAEA,CAhBC,aAgBa;AACZ,WAAS;AACT,WAAS;AACX;AAEA,CArBC,aAqBa,OAAO;AACnB,WAAS;AACT,eAAa;AACb,QAAM;AACN,mBAAiB;AACjB,aAAW;AACX,cAAY;AACZ,eAAa;AACb,eAAa;AACb,UAAQ;AACV;AAEA,CAjCC,aAiCa,OAAO;AACnB,WAAS;AACT,aAAW;AACX,eAAa;AACb,QAAM;AACN,mBAAiB;AACnB;AAEA,CAzCC,aAyCa,CAAC;AACb,WAAS;AACT,yBAAuB,KAAK,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;AACrD,OAAK,IAAI;AACT,oBAAkB,IAAI;AACtB,cAAY,IAAI,MAAM,IAAI;AAC1B,iBAAe;AACjB;AAEA,CAlDC,aAkDa,CATC,kBASkB;AAC/B,WAAS;AACT,oBAAkB;AAClB,YAAU;AACV,SAAO,IAAI;AACX,eAAa;AACb,aAAW;AACX,cAAY;AACZ,eAAa;AACb,eAAa;AACb,WAAS;AACT,kBAAgB;AAChB,eAAa;AACf;AAEA,CAjEC,aAiEa,CAxBC,kBAwBkB,IAAI;AACnC,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,oBAAkB,IAAI;AACtB,WAAS,OAAO;AAClB;AAEA,CAxEC,aAwEa,CA/BC,kBA+BkB,GAAG,CAAC;AACnC,eAAa;AACf;AAEA,CA5EC,aA4Ea,CAnCC,kBAmCkB,GAAG,CAAC;AACnC,eAAa,EAAE,EAAE;AACjB,cAAY;AACd;AAEA,CAjFC,aAiFa,CAxCC,kBAwCkB,GAAG,CAAC;AACnC,WAAS;AACT,cAAY;AACd;AAEA,CAtFC,aAsFa,CAAC;AACf;AAEA,CAzFC,aAyFa,CAHC,YAGY;AACzB,YAAU;AACV,WAAS;AACX;AAEA,CA9FC,aA8Fa,CARC,YAQY;AACzB,WAAS,OAAO;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,gBAAc;AACd,iBAAe;AACjB;AAEA,CArGC,aAqGa,CAfC,YAeY,KAAK,eAAe;AAC7C,6BAA2B;AAC3B,2BAAyB;AAC3B;AAEA,CA1GC,aA0Ga,CApBC,YAoBY,KAAK,cAAc;AAC5C,gBAAc,IAAI,MAAM,IAAI;AAC5B,2BAAyB;AACzB,yBAAuB;AACzB;AAEA,CAhHC,aAgHa,CA1BC,YA0BY,KAAK,SAAS,EAAE;AACzC,cAAY,IAAI;AAClB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -233,7 +233,10 @@ declare module '@layerfi/components/components/BankTransactionRow/index' {
|
|
|
233
233
|
}
|
|
234
234
|
declare module '@layerfi/components/components/BankTransactions/BankTransactions' {
|
|
235
235
|
import React from 'react';
|
|
236
|
-
export
|
|
236
|
+
export interface BankTransactionsProps {
|
|
237
|
+
asWidget?: boolean;
|
|
238
|
+
}
|
|
239
|
+
export const BankTransactions: ({ asWidget, }: BankTransactionsProps) => React.JSX.Element;
|
|
237
240
|
|
|
238
241
|
}
|
|
239
242
|
declare module '@layerfi/components/components/BankTransactions/index' {
|
|
@@ -329,9 +332,10 @@ declare module '@layerfi/components/components/Container/Container' {
|
|
|
329
332
|
export interface ContainerProps {
|
|
330
333
|
name: string;
|
|
331
334
|
className?: string;
|
|
335
|
+
asWidget?: boolean;
|
|
332
336
|
children: ReactNode;
|
|
333
337
|
}
|
|
334
|
-
export const Container: ({ name, className, children }: ContainerProps) => React.JSX.Element;
|
|
338
|
+
export const Container: ({ name, className, children, asWidget, }: ContainerProps) => React.JSX.Element;
|
|
335
339
|
|
|
336
340
|
}
|
|
337
341
|
declare module '@layerfi/components/components/Container/Header' {
|
|
@@ -348,6 +352,26 @@ declare module '@layerfi/components/components/Container/index' {
|
|
|
348
352
|
export { Container } from '@layerfi/components/components/Container/Container';
|
|
349
353
|
export { Header } from '@layerfi/components/components/Container/Header';
|
|
350
354
|
|
|
355
|
+
}
|
|
356
|
+
declare module '@layerfi/components/components/DataState/DataState' {
|
|
357
|
+
import React from 'react';
|
|
358
|
+
export enum DataStateStatus {
|
|
359
|
+
allDone = "allDone",
|
|
360
|
+
failed = "failed"
|
|
361
|
+
}
|
|
362
|
+
export interface DataStateProps {
|
|
363
|
+
status: DataStateStatus;
|
|
364
|
+
title?: string;
|
|
365
|
+
description?: string;
|
|
366
|
+
onRefresh?: () => void;
|
|
367
|
+
isLoading?: boolean;
|
|
368
|
+
}
|
|
369
|
+
export const DataState: ({ status, title, description, onRefresh, isLoading, }: DataStateProps) => React.JSX.Element;
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
declare module '@layerfi/components/components/DataState/index' {
|
|
373
|
+
export { DataState, DataStateStatus } from '@layerfi/components/components/DataState/DataState';
|
|
374
|
+
|
|
351
375
|
}
|
|
352
376
|
declare module '@layerfi/components/components/ExpandedBankTransactionRow/ExpandedBankTransactionRow' {
|
|
353
377
|
import React from 'react';
|
|
@@ -357,7 +381,7 @@ declare module '@layerfi/components/components/ExpandedBankTransactionRow/Expand
|
|
|
357
381
|
close?: () => void;
|
|
358
382
|
isOpen?: boolean;
|
|
359
383
|
asListItem?: boolean;
|
|
360
|
-
|
|
384
|
+
submitBtnText?: string;
|
|
361
385
|
};
|
|
362
386
|
export type SaveHandle = {
|
|
363
387
|
save: () => void;
|
|
@@ -727,6 +751,7 @@ declare module '@layerfi/components/components/Typography/Heading' {
|
|
|
727
751
|
declare module '@layerfi/components/components/Typography/Text' {
|
|
728
752
|
import React, { ReactNode } from 'react';
|
|
729
753
|
export enum TextSize {
|
|
754
|
+
lg = "lg",
|
|
730
755
|
md = "md",
|
|
731
756
|
sm = "sm"
|
|
732
757
|
}
|
|
@@ -799,12 +824,14 @@ declare module '@layerfi/components/hooks/useBankTransactions/index' {
|
|
|
799
824
|
declare module '@layerfi/components/hooks/useBankTransactions/useBankTransactions' {
|
|
800
825
|
import { BankTransaction, CategoryUpdate, Metadata } from '@layerfi/components/types';
|
|
801
826
|
type UseBankTransactions = () => {
|
|
802
|
-
data
|
|
827
|
+
data?: BankTransaction[];
|
|
803
828
|
metadata: Metadata;
|
|
804
829
|
isLoading: boolean;
|
|
830
|
+
isValidating: boolean;
|
|
805
831
|
error: unknown;
|
|
806
832
|
categorize: (id: BankTransaction['id'], newCategory: CategoryUpdate) => Promise<void>;
|
|
807
833
|
updateOneLocal: (bankTransaction: BankTransaction) => void;
|
|
834
|
+
refetch: () => void;
|
|
808
835
|
};
|
|
809
836
|
export const useBankTransactions: UseBankTransactions;
|
|
810
837
|
export {};
|
|
@@ -872,6 +899,13 @@ declare module '@layerfi/components/icons/AlertCircle' {
|
|
|
872
899
|
const AlertCircle: ({ size, ...props }: IconSvgProps) => React.JSX.Element;
|
|
873
900
|
export default AlertCircle;
|
|
874
901
|
|
|
902
|
+
}
|
|
903
|
+
declare module '@layerfi/components/icons/AlertOctagon' {
|
|
904
|
+
import * as React from 'react';
|
|
905
|
+
import { IconSvgProps } from '@layerfi/components/icons/types';
|
|
906
|
+
const AlertOctagon: ({ size, ...props }: IconSvgProps) => React.JSX.Element;
|
|
907
|
+
export default AlertOctagon;
|
|
908
|
+
|
|
875
909
|
}
|
|
876
910
|
declare module '@layerfi/components/icons/Calendar' {
|
|
877
911
|
import * as React from 'react';
|
|
@@ -957,11 +991,11 @@ declare module '@layerfi/components/icons/RefreshCcw' {
|
|
|
957
991
|
export default RefreshCcw;
|
|
958
992
|
|
|
959
993
|
}
|
|
960
|
-
declare module '@layerfi/components/icons/
|
|
994
|
+
declare module '@layerfi/components/icons/Scissors' {
|
|
961
995
|
import * as React from 'react';
|
|
962
996
|
import { IconSvgProps } from '@layerfi/components/icons/types';
|
|
963
|
-
const
|
|
964
|
-
export default
|
|
997
|
+
const Scissors: ({ size, ...props }: IconSvgProps) => React.JSX.Element;
|
|
998
|
+
export default Scissors;
|
|
965
999
|
|
|
966
1000
|
}
|
|
967
1001
|
declare module '@layerfi/components/icons/UploadCloud' {
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/* src/components/Hello/Hello.css */
|
|
2
|
+
.hello {
|
|
3
|
+
color: red;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* src/components/Transactions/Transactions.css */
|
|
7
|
+
.transactions {
|
|
8
|
+
--transaction-buttons-border-color: #D0D5DD;
|
|
9
|
+
--transaction-buttons-selected-background-color: #E0E9FF;
|
|
10
|
+
--transaction-table-background-color: white;
|
|
11
|
+
--transaction-table-border-color: #EAECF0;
|
|
12
|
+
--transaction-table-text-color: #101828;
|
|
13
|
+
}
|
|
14
|
+
.transactions {
|
|
15
|
+
margin: 3rem;
|
|
16
|
+
border-radius: 0.6rem;
|
|
17
|
+
border: 1px solid var(--transaction-table-border-color);
|
|
18
|
+
background-color: var(--transaction-table-background-color);
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
}
|
|
21
|
+
.transactions header {
|
|
22
|
+
display: flex;
|
|
23
|
+
padding: 1rem;
|
|
24
|
+
}
|
|
25
|
+
.transactions header h1 {
|
|
26
|
+
display: flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
flex: 1;
|
|
29
|
+
justify-content: flex-start;
|
|
30
|
+
font-size: 1.5rem;
|
|
31
|
+
font-style: normal;
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
line-height: 2rem;
|
|
34
|
+
margin: 0;
|
|
35
|
+
}
|
|
36
|
+
.transactions header div {
|
|
37
|
+
display: flex;
|
|
38
|
+
font-size: 1rem;
|
|
39
|
+
align-items: center;
|
|
40
|
+
flex: 1;
|
|
41
|
+
justify-content: flex-end;
|
|
42
|
+
}
|
|
43
|
+
.transactions .transaction-table {
|
|
44
|
+
display: grid;
|
|
45
|
+
grid-template-columns: auto repeat(4, 1fr) repeat(3, auto);
|
|
46
|
+
gap: 1px 0px;
|
|
47
|
+
background-color: var(--transaction-table-border-color);
|
|
48
|
+
border-top: 1px solid var(--transaction-table-border-color);
|
|
49
|
+
border-radius: 0.6rem;
|
|
50
|
+
}
|
|
51
|
+
.transactions .transaction-table div {
|
|
52
|
+
padding: 1rem;
|
|
53
|
+
background-color: white;
|
|
54
|
+
overflow: clip;
|
|
55
|
+
color: var(--transaction-table-text-color);
|
|
56
|
+
font-family: sans-serif;
|
|
57
|
+
font-size: 16px;
|
|
58
|
+
font-style: normal;
|
|
59
|
+
font-weight: 500;
|
|
60
|
+
line-height: 20px;
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: row;
|
|
63
|
+
align-items: center;
|
|
64
|
+
}
|
|
65
|
+
.transactions .transaction-table div select {
|
|
66
|
+
border: 2px solid var(--transaction-table-border-color);
|
|
67
|
+
border-radius: 0.6rem;
|
|
68
|
+
background-color: var(--transaction-table-background-color);
|
|
69
|
+
padding: 0.6rem 0.8rem;
|
|
70
|
+
}
|
|
71
|
+
.transactions .transaction-table div.header {
|
|
72
|
+
font-weight: bold;
|
|
73
|
+
}
|
|
74
|
+
.transactions .transaction-table div.expand-area {
|
|
75
|
+
grid-column: 1 / -1;
|
|
76
|
+
margin-top: -1px;
|
|
77
|
+
}
|
|
78
|
+
.transactions .transaction-table div.expand-content {
|
|
79
|
+
padding: 1rem;
|
|
80
|
+
text-align: center;
|
|
81
|
+
}
|
|
82
|
+
.transactions .radio-group {
|
|
83
|
+
}
|
|
84
|
+
.transactions .radio-group input {
|
|
85
|
+
position: absolute;
|
|
86
|
+
opacity: 0;
|
|
87
|
+
}
|
|
88
|
+
.transactions .radio-group div {
|
|
89
|
+
padding: 0.6rem 1rem;
|
|
90
|
+
border: 1px solid var(--transaction-buttons-border-color);
|
|
91
|
+
border-right: 0;
|
|
92
|
+
border-radius: 0;
|
|
93
|
+
}
|
|
94
|
+
.transactions .radio-group label:first-of-type div {
|
|
95
|
+
border-start-start-radius: 0.6rem;
|
|
96
|
+
border-end-start-radius: 0.6rem;
|
|
97
|
+
}
|
|
98
|
+
.transactions .radio-group label:last-of-type div {
|
|
99
|
+
border-right: 1px solid var(--transaction-buttons-border-color);
|
|
100
|
+
border-start-end-radius: 0.6rem;
|
|
101
|
+
border-end-end-radius: 0.6rem;
|
|
102
|
+
}
|
|
103
|
+
.transactions .radio-group input:checked + div {
|
|
104
|
+
background: var(--transaction-buttons-selected-background-color);
|
|
105
|
+
}
|
|
106
|
+
/*# sourceMappingURL=index.esm.css.map */
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/Hello/Hello.css", "../src/components/Transactions/Transactions.css"],
|
|
4
|
+
"sourcesContent": [".hello {\n color: red;\n}\n", ".transactions {\n --transaction-buttons-border-color: #D0D5DD;\n --transaction-buttons-selected-background-color: #E0E9FF;\n --transaction-table-background-color: white;\n --transaction-table-border-color: #EAECF0;\n --transaction-table-text-color: #101828;\n}\n\n.transactions {\n margin: 3rem;\n border-radius: 0.6rem;\n border: 1px solid var(--transaction-table-border-color);\n background-color: var(--transaction-table-background-color);\n overflow: hidden;\n}\n\n.transactions header {\n display: flex;\n padding: 1rem;\n}\n\n.transactions header h1 {\n display: flex;\n align-items: center;\n flex: 1;\n justify-content: flex-start;\n font-size: 1.5rem;\n font-style: normal;\n font-weight: 600;\n line-height: 2rem;\n margin: 0;\n}\n\n.transactions header div {\n display: flex;\n font-size: 1rem;\n align-items: center;\n flex: 1;\n justify-content: flex-end;\n}\n\n.transactions .transaction-table {\n display: grid;\n grid-template-columns: auto repeat(4, 1fr) repeat(3, auto);\n gap: 1px 0px;\n background-color: var(--transaction-table-border-color);\n border-top: 1px solid var(--transaction-table-border-color);\n border-radius: 0.6rem;\n}\n\n.transactions .transaction-table div {\n padding: 1rem;\n background-color: white;\n overflow: clip;\n color: var(--transaction-table-text-color);\n font-family: sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n line-height: 20px;\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.transactions .transaction-table div select {\n border: 2px solid var(--transaction-table-border-color);\n border-radius: 0.6rem;\n background-color: var(--transaction-table-background-color);\n padding: 0.6rem 0.8rem;\n}\n\n.transactions .transaction-table div.header {\n font-weight: bold;\n}\n\n.transactions .transaction-table div.expand-area {\n grid-column: 1 / -1;\n margin-top: -1px;\n}\n\n.transactions .transaction-table div.expand-content {\n padding: 1rem;\n text-align: center;\n}\n\n.transactions .radio-group {\n}\n\n.transactions .radio-group input {\n position: absolute;\n opacity: 0;\n}\n\n.transactions .radio-group div {\n padding: 0.6rem 1rem;\n border: 1px solid var(--transaction-buttons-border-color);\n border-right: 0;\n border-radius: 0;\n}\n\n.transactions .radio-group label:first-of-type div {\n border-start-start-radius: 0.6rem;\n border-end-start-radius: 0.6rem;\n}\n\n.transactions .radio-group label:last-of-type div {\n border-right: 1px solid var(--transaction-buttons-border-color);\n border-start-end-radius: 0.6rem;\n border-end-end-radius: 0.6rem;\n}\n\n.transactions .radio-group input:checked + div {\n background: var(--transaction-buttons-selected-background-color);\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,CAAC;AACC,SAAO;AACT;;;ACFA,CAAC;AACC,sCAAoC;AACpC,mDAAiD;AACjD,wCAAsC;AACtC,oCAAkC;AAClC,kCAAgC;AAClC;AAEA,CARC;AASC,UAAQ;AACR,iBAAe;AACf,UAAQ,IAAI,MAAM,IAAI;AACtB,oBAAkB,IAAI;AACtB,YAAU;AACZ;AAEA,CAhBC,aAgBa;AACZ,WAAS;AACT,WAAS;AACX;AAEA,CArBC,aAqBa,OAAO;AACnB,WAAS;AACT,eAAa;AACb,QAAM;AACN,mBAAiB;AACjB,aAAW;AACX,cAAY;AACZ,eAAa;AACb,eAAa;AACb,UAAQ;AACV;AAEA,CAjCC,aAiCa,OAAO;AACnB,WAAS;AACT,aAAW;AACX,eAAa;AACb,QAAM;AACN,mBAAiB;AACnB;AAEA,CAzCC,aAyCa,CAAC;AACb,WAAS;AACT,yBAAuB,KAAK,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;AACrD,OAAK,IAAI;AACT,oBAAkB,IAAI;AACtB,cAAY,IAAI,MAAM,IAAI;AAC1B,iBAAe;AACjB;AAEA,CAlDC,aAkDa,CATC,kBASkB;AAC/B,WAAS;AACT,oBAAkB;AAClB,YAAU;AACV,SAAO,IAAI;AACX,eAAa;AACb,aAAW;AACX,cAAY;AACZ,eAAa;AACb,eAAa;AACb,WAAS;AACT,kBAAgB;AAChB,eAAa;AACf;AAEA,CAjEC,aAiEa,CAxBC,kBAwBkB,IAAI;AACnC,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,oBAAkB,IAAI;AACtB,WAAS,OAAO;AAClB;AAEA,CAxEC,aAwEa,CA/BC,kBA+BkB,GAAG,CAAC;AACnC,eAAa;AACf;AAEA,CA5EC,aA4Ea,CAnCC,kBAmCkB,GAAG,CAAC;AACnC,eAAa,EAAE,EAAE;AACjB,cAAY;AACd;AAEA,CAjFC,aAiFa,CAxCC,kBAwCkB,GAAG,CAAC;AACnC,WAAS;AACT,cAAY;AACd;AAEA,CAtFC,aAsFa,CAAC;AACf;AAEA,CAzFC,aAyFa,CAHC,YAGY;AACzB,YAAU;AACV,WAAS;AACX;AAEA,CA9FC,aA8Fa,CARC,YAQY;AACzB,WAAS,OAAO;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,gBAAc;AACd,iBAAe;AACjB;AAEA,CArGC,aAqGa,CAfC,YAeY,KAAK,eAAe;AAC7C,6BAA2B;AAC3B,2BAAyB;AAC3B;AAEA,CA1GC,aA0Ga,CApBC,YAoBY,KAAK,cAAc;AAC5C,gBAAc,IAAI,MAAM,IAAI;AAC5B,2BAAyB;AACzB,yBAAuB;AACzB;AAEA,CAhHC,aAgHa,CA1BC,YA0BY,KAAK,SAAS,EAAE;AACzC,cAAY,IAAI;AAClB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// src/components/Hello/Hello.tsx
|
|
2
|
+
import React from "react";
|
|
3
|
+
import useSWR from "swr";
|
|
4
|
+
var fetcher = (url) => fetch(url).then((res) => res.json());
|
|
5
|
+
var Hello = ({ user }) => {
|
|
6
|
+
const { data, isLoading } = useSWR(
|
|
7
|
+
`https://api.github.com/users/${user || "jyurek"}`,
|
|
8
|
+
fetcher
|
|
9
|
+
);
|
|
10
|
+
const name = (isLoading ? "..." : data?.name) || "User";
|
|
11
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: "hello" }, "Hello, ", name, "!"));
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// src/components/Transactions/Transactions.tsx
|
|
15
|
+
import React7, { useState as useState2, useContext as useContext3 } from "react";
|
|
16
|
+
|
|
17
|
+
// src/contexts/LayerContext/LayerContext.tsx
|
|
18
|
+
import { createContext } from "react";
|
|
19
|
+
var LayerContext = createContext({
|
|
20
|
+
auth: void 0,
|
|
21
|
+
businessId: "",
|
|
22
|
+
categories: []
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// src/components/RadioButtonGroup/RadioButtonGroup.tsx
|
|
26
|
+
import React3 from "react";
|
|
27
|
+
|
|
28
|
+
// src/components/RadioButtonGroup/RadioButton.tsx
|
|
29
|
+
import React2 from "react";
|
|
30
|
+
var RadioButton = ({
|
|
31
|
+
checked,
|
|
32
|
+
label,
|
|
33
|
+
name,
|
|
34
|
+
onChange,
|
|
35
|
+
value
|
|
36
|
+
}) => {
|
|
37
|
+
return /* @__PURE__ */ React2.createElement("label", null, /* @__PURE__ */ React2.createElement(
|
|
38
|
+
"input",
|
|
39
|
+
{
|
|
40
|
+
type: "radio",
|
|
41
|
+
checked,
|
|
42
|
+
name,
|
|
43
|
+
onChange,
|
|
44
|
+
value
|
|
45
|
+
}
|
|
46
|
+
), /* @__PURE__ */ React2.createElement("div", null, label));
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// src/components/RadioButtonGroup/RadioButtonGroup.tsx
|
|
50
|
+
var RadioButtonGroup = ({
|
|
51
|
+
name,
|
|
52
|
+
buttons,
|
|
53
|
+
onChange,
|
|
54
|
+
selected
|
|
55
|
+
}) => {
|
|
56
|
+
const selectedValue = selected || buttons[0].value;
|
|
57
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "radio-group" }, buttons.map((button) => /* @__PURE__ */ React3.createElement(
|
|
58
|
+
RadioButton,
|
|
59
|
+
{
|
|
60
|
+
...button,
|
|
61
|
+
key: button.value,
|
|
62
|
+
name,
|
|
63
|
+
checked: selectedValue === button.value,
|
|
64
|
+
onChange
|
|
65
|
+
}
|
|
66
|
+
)));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/components/Transactions/TransactionRow.tsx
|
|
70
|
+
import React6 from "react";
|
|
71
|
+
|
|
72
|
+
// src/models/Money.ts
|
|
73
|
+
var format = ({ amount, direction }) => (direction === "CREDIT" ? "+" : "-") + Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(
|
|
74
|
+
amount / 100
|
|
75
|
+
);
|
|
76
|
+
var Money = {
|
|
77
|
+
format
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// src/components/CategoryMenu/CategoryMenu.tsx
|
|
81
|
+
import React5, { useContext as useContext2 } from "react";
|
|
82
|
+
|
|
83
|
+
// src/components/CategoryMenu/CategoryMenuItem.tsx
|
|
84
|
+
import React4 from "react";
|
|
85
|
+
var CategoryMenuItem = ({
|
|
86
|
+
selectedCategory,
|
|
87
|
+
category,
|
|
88
|
+
maxDepth = 1
|
|
89
|
+
}) => {
|
|
90
|
+
if (category.hasOwnProperty("subCategories") && maxDepth > 0) {
|
|
91
|
+
return /* @__PURE__ */ React4.createElement("optgroup", { label: category.display_name }, category.subCategories.map((category2) => /* @__PURE__ */ React4.createElement(
|
|
92
|
+
CategoryMenuItem,
|
|
93
|
+
{
|
|
94
|
+
category: category2,
|
|
95
|
+
selectedCategory,
|
|
96
|
+
maxDepth: maxDepth - 1
|
|
97
|
+
}
|
|
98
|
+
)));
|
|
99
|
+
} else {
|
|
100
|
+
return /* @__PURE__ */ React4.createElement(
|
|
101
|
+
"option",
|
|
102
|
+
{
|
|
103
|
+
key: category.category,
|
|
104
|
+
value: category.category,
|
|
105
|
+
selected: selectedCategory === category.category
|
|
106
|
+
},
|
|
107
|
+
category.display_name
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/components/CategoryMenu/CategoryMenu.tsx
|
|
113
|
+
var CategoryMenu = ({ selectedCategory }) => {
|
|
114
|
+
const { categories } = useContext2(LayerContext);
|
|
115
|
+
return /* @__PURE__ */ React5.createElement("select", null, categories.map((category) => /* @__PURE__ */ React5.createElement(
|
|
116
|
+
CategoryMenuItem,
|
|
117
|
+
{
|
|
118
|
+
category,
|
|
119
|
+
selectedCategory
|
|
120
|
+
}
|
|
121
|
+
)));
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// src/components/Transactions/TransactionRow.tsx
|
|
125
|
+
import { parseISO, format as formatTime } from "date-fns";
|
|
126
|
+
var TransactionRow = ({
|
|
127
|
+
dateFormat: dateFormat2,
|
|
128
|
+
transaction,
|
|
129
|
+
isOpen,
|
|
130
|
+
toggleOpen
|
|
131
|
+
}) => /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement("div", null, /* @__PURE__ */ React6.createElement("input", { type: "checkbox" })), /* @__PURE__ */ React6.createElement("div", null, formatTime(parseISO(transaction.date), dateFormat2)), /* @__PURE__ */ React6.createElement("div", null, Money.format(transaction)), /* @__PURE__ */ React6.createElement("div", null, "Business Checking"), /* @__PURE__ */ React6.createElement("div", null, transaction.counterparty_name), /* @__PURE__ */ React6.createElement("div", { "data-selected": transaction?.category?.category }, /* @__PURE__ */ React6.createElement(CategoryMenu, { selectedCategory: transaction?.category?.category })), /* @__PURE__ */ React6.createElement("div", null), /* @__PURE__ */ React6.createElement(
|
|
132
|
+
"div",
|
|
133
|
+
{
|
|
134
|
+
onClick: () => toggleOpen(transaction.id),
|
|
135
|
+
style: { cursor: "pointer" }
|
|
136
|
+
},
|
|
137
|
+
"\u{1F3AF}"
|
|
138
|
+
), isOpen && /* @__PURE__ */ React6.createElement("div", { className: "expand-area" }, /* @__PURE__ */ React6.createElement("div", { className: "expand-content" }, "Hello!")));
|
|
139
|
+
|
|
140
|
+
// src/components/Transactions/Transactions.tsx
|
|
141
|
+
import useSWR2 from "swr";
|
|
142
|
+
var dateFormat = "MM/dd/yyyy";
|
|
143
|
+
var fetchTransactions = (accessToken) => (url) => fetch(url, {
|
|
144
|
+
headers: {
|
|
145
|
+
Authorization: "Bearer " + accessToken,
|
|
146
|
+
"Content-Type": "application/json"
|
|
147
|
+
},
|
|
148
|
+
method: "GET"
|
|
149
|
+
}).then((res) => res.json());
|
|
150
|
+
var filterVisibility = (display) => (transaction) => {
|
|
151
|
+
const categorized = [
|
|
152
|
+
"CATEGORIZED" /* CATEGORIZED */,
|
|
153
|
+
"JOURNALING" /* JOURNALING */,
|
|
154
|
+
"SPLIT" /* SPLIT */
|
|
155
|
+
].includes(transaction.categorization_status);
|
|
156
|
+
const inReview = [
|
|
157
|
+
"READY_FOR_INPUT" /* READY_FOR_INPUT */,
|
|
158
|
+
"LAYER_REVIEW" /* LAYER_REVIEW */
|
|
159
|
+
].includes(transaction.categorization_status);
|
|
160
|
+
return display === "review" && inReview || display === "categorized" && categorized;
|
|
161
|
+
};
|
|
162
|
+
var Transactions = (props) => {
|
|
163
|
+
const { auth, businessId } = useContext3(LayerContext);
|
|
164
|
+
const [display, setDisplay] = useState2("review");
|
|
165
|
+
const { data, isLoading } = useSWR2(
|
|
166
|
+
auth?.access_token && `https://sandbox.layerfi.com/v1/businesses/${businessId}/bank-transactions`,
|
|
167
|
+
fetchTransactions(auth?.access_token)
|
|
168
|
+
);
|
|
169
|
+
const transactions = (!isLoading && data?.data || []).filter(
|
|
170
|
+
filterVisibility(display)
|
|
171
|
+
);
|
|
172
|
+
const onCategorizationDisplayChange = (event) => setDisplay(event.target.value);
|
|
173
|
+
const [openRows, setOpenRows] = useState2({});
|
|
174
|
+
const toggleOpen = (id) => setOpenRows({ ...openRows, [id]: !openRows[id] });
|
|
175
|
+
return /* @__PURE__ */ React7.createElement("div", { className: "transactions", "data-display": display }, /* @__PURE__ */ React7.createElement("header", null, /* @__PURE__ */ React7.createElement("h1", null, "Transactions"), /* @__PURE__ */ React7.createElement(
|
|
176
|
+
RadioButtonGroup,
|
|
177
|
+
{
|
|
178
|
+
name: "transaction-display",
|
|
179
|
+
buttons: [
|
|
180
|
+
{ label: "To Review", value: "review" },
|
|
181
|
+
{ label: "Categorized", value: "categorized" }
|
|
182
|
+
],
|
|
183
|
+
selected: display,
|
|
184
|
+
onChange: onCategorizationDisplayChange
|
|
185
|
+
}
|
|
186
|
+
)), /* @__PURE__ */ React7.createElement("div", { className: "transaction-table" }, /* @__PURE__ */ React7.createElement("div", { className: "header" }, /* @__PURE__ */ React7.createElement("input", { type: "checkbox" })), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Date"), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Transaction"), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Account"), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Amount"), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Category"), /* @__PURE__ */ React7.createElement("div", { className: "header" }, "Action"), /* @__PURE__ */ React7.createElement("div", { className: "header" }), transactions.map((transaction) => /* @__PURE__ */ React7.createElement(
|
|
187
|
+
TransactionRow,
|
|
188
|
+
{
|
|
189
|
+
key: transaction.id,
|
|
190
|
+
dateFormat,
|
|
191
|
+
transaction,
|
|
192
|
+
isOpen: openRows[transaction.id],
|
|
193
|
+
toggleOpen
|
|
194
|
+
}
|
|
195
|
+
))));
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// src/providers/LayerProvider/LayerProvider.tsx
|
|
199
|
+
import React8 from "react";
|
|
200
|
+
import useSWR3 from "swr";
|
|
201
|
+
var appId = "1pskub33qd9qt19406hi4d1j6f";
|
|
202
|
+
var appSecret = "1k7up1ia2m0ino8el6md2l1isq3t7fdj1eq6firmkui8757lk6r6";
|
|
203
|
+
async function getAccessToken() {
|
|
204
|
+
var details = {
|
|
205
|
+
grant_type: "client_credentials",
|
|
206
|
+
scope: "https://sandbox.layerfi.com/sandbox",
|
|
207
|
+
client_id: "canaryAppId"
|
|
208
|
+
};
|
|
209
|
+
const formBody = Object.entries(details).map((key) => encodeURIComponent(key[0]) + "=" + encodeURIComponent(key[1])).join("&");
|
|
210
|
+
const authRequest = fetch("https://auth.layerfi.com/oauth2/token", {
|
|
211
|
+
method: "POST",
|
|
212
|
+
headers: {
|
|
213
|
+
Authorization: "Basic " + btoa(appId + ":" + appSecret),
|
|
214
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
215
|
+
},
|
|
216
|
+
body: formBody
|
|
217
|
+
});
|
|
218
|
+
return await (await authRequest).json();
|
|
219
|
+
}
|
|
220
|
+
var getCategories = (accessToken) => (url) => fetch(url, {
|
|
221
|
+
headers: {
|
|
222
|
+
Authorization: "Bearer " + accessToken,
|
|
223
|
+
"Content-Type": "application/json"
|
|
224
|
+
},
|
|
225
|
+
method: "GET"
|
|
226
|
+
}).then((res) => res.json());
|
|
227
|
+
var LayerProvider = ({
|
|
228
|
+
businessId,
|
|
229
|
+
children
|
|
230
|
+
}) => {
|
|
231
|
+
const { data: auth } = useSWR3(
|
|
232
|
+
"https://auth.layerfi.com/oauth2/token",
|
|
233
|
+
getAccessToken
|
|
234
|
+
);
|
|
235
|
+
const { data: categories } = useSWR3(
|
|
236
|
+
businessId && auth?.access_token && `https://sandbox.layerfi.com/v1/businesses/${businessId}/categories`,
|
|
237
|
+
getCategories(auth?.access_token)
|
|
238
|
+
);
|
|
239
|
+
const value = {
|
|
240
|
+
auth,
|
|
241
|
+
businessId,
|
|
242
|
+
categories: categories?.data?.categories || []
|
|
243
|
+
};
|
|
244
|
+
return /* @__PURE__ */ React8.createElement(LayerContext.Provider, { value }, children);
|
|
245
|
+
};
|
|
246
|
+
export {
|
|
247
|
+
Hello,
|
|
248
|
+
LayerContext,
|
|
249
|
+
LayerProvider,
|
|
250
|
+
Transactions
|
|
251
|
+
};
|
|
252
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/Hello/Hello.tsx", "../src/components/Transactions/Transactions.tsx", "../src/contexts/LayerContext/LayerContext.tsx", "../src/components/RadioButtonGroup/RadioButtonGroup.tsx", "../src/components/RadioButtonGroup/RadioButton.tsx", "../src/components/Transactions/TransactionRow.tsx", "../src/models/Money.ts", "../src/components/CategoryMenu/CategoryMenu.tsx", "../src/components/CategoryMenu/CategoryMenuItem.tsx", "../src/providers/LayerProvider/LayerProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport './Hello.css'\nimport useSWR from 'swr'\n\ntype Props = {\n user?: string | undefined\n}\n\nconst fetcher = url => 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, { useState, useContext } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\nimport { Transaction, CategorizationStatus } from '../../types'\nimport { RadioButtonGroup } from '../RadioButtonGroup'\nimport { TransactionRow } from './TransactionRow'\nimport './Transactions.css'\nimport useSWR from 'swr'\n\nconst dateFormat = 'MM/dd/yyyy'\n\nconst fetchTransactions = (accessToken: string) => (url: string) =>\n fetch(url, {\n headers: {\n Authorization: 'Bearer ' + accessToken,\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n }).then(res => res.json())\n\nconst filterVisibility = (display: Display) => (transaction: Transaction) => {\n const categorized = [\n CategorizationStatus.CATEGORIZED,\n CategorizationStatus.JOURNALING,\n CategorizationStatus.SPLIT,\n ].includes(transaction.categorization_status)\n const inReview = [\n CategorizationStatus.READY_FOR_INPUT,\n CategorizationStatus.LAYER_REVIEW,\n ].includes(transaction.categorization_status)\n return (\n (display === 'review' && inReview) ||\n (display === 'categorized' && categorized)\n )\n}\n\ntype Props = {}\n\nexport const Transactions = (props: Props) => {\n const { auth, businessId } = useContext(LayerContext)\n const [display, setDisplay] = useState<'review' | 'categorized'>('review')\n const { data, isLoading } = useSWR(\n auth?.access_token &&\n `https://sandbox.layerfi.com/v1/businesses/${businessId}/bank-transactions`,\n fetchTransactions(auth?.access_token),\n )\n const transactions = ((!isLoading && data?.data) || []).filter(\n filterVisibility(display),\n )\n const onCategorizationDisplayChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => setDisplay(event.target.value)\n const [openRows, setOpenRows] = useState<Record<string, boolean>>({})\n const toggleOpen = (id: string) =>\n setOpenRows({ ...openRows, [id]: !openRows[id] })\n return (\n <div className=\"transactions\" data-display={display}>\n <header>\n <h1>Transactions</h1>\n <RadioButtonGroup\n name=\"transaction-display\"\n buttons={[\n { label: 'To Review', value: 'review' },\n { label: 'Categorized', value: 'categorized' },\n ]}\n selected={display}\n onChange={onCategorizationDisplayChange}\n />\n </header>\n <div className=\"transaction-table\">\n <div className=\"header\">\n <input type=\"checkbox\" />\n </div>\n <div className=\"header\">Date</div>\n <div className=\"header\">Transaction</div>\n <div className=\"header\">Account</div>\n <div className=\"header\">Amount</div>\n <div className=\"header\">Category</div>\n <div className=\"header\">Action</div>\n <div className=\"header\"></div>\n {transactions.map(transaction => (\n <TransactionRow\n key={transaction.id}\n dateFormat={dateFormat}\n transaction={transaction}\n isOpen={openRows[transaction.id]}\n toggleOpen={toggleOpen}\n />\n ))}\n </div>\n </div>\n )\n}\n", "import { createContext } from 'react'\nimport { LayerExecutionContext } from '../../types'\n\nexport const LayerContext = createContext<LayerExecutionContext>({\n auth: undefined,\n businessId: '',\n categories: [],\n})\n", "import React, { useState } from 'react'\nimport { RadioButton } from './RadioButton'\n\nexport type RadioButtonLabel = {\n label: string\n value: string\n}\n\ntype Props = {\n name: string\n buttons: RadioButtonLabel[]\n selected?: Pick<RadioButtonLabel, 'value'>\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n}\n\nexport const RadioButtonGroup = ({\n name,\n buttons,\n onChange,\n selected,\n}: Props) => {\n const selectedValue = selected || buttons[0].value\n return (\n <div className=\"radio-group\">\n {buttons.map(button => (\n <RadioButton\n {...button}\n key={button.value}\n name={name}\n checked={selectedValue === button.value}\n onChange={onChange}\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}\n\nexport const RadioButton = ({\n checked,\n label,\n name,\n onChange,\n value,\n}: Props) => {\n return (\n <label>\n <input\n type=\"radio\"\n checked={checked}\n name={name}\n onChange={onChange}\n value={value}\n />\n <div>{label}</div>\n </label>\n )\n}\n", "import React from 'react'\nimport { Money } from '../../models/Money'\nimport { Transaction } from '../../types'\nimport { CategoryMenu } from '../CategoryMenu'\nimport { parseISO, format as formatTime } from 'date-fns'\n\ntype Props = {\n dateFormat: string\n transaction: Transaction\n isOpen: boolean\n toggleOpen: (id: string) => void\n}\n\nexport const TransactionRow = ({\n dateFormat,\n transaction,\n isOpen,\n toggleOpen,\n}: Props) => (\n <>\n <div>\n <input type=\"checkbox\" />\n </div>\n <div>{formatTime(parseISO(transaction.date), dateFormat)}</div>\n <div>{Money.format(transaction)}</div>\n <div>Business Checking</div>\n <div>{transaction.counterparty_name}</div>\n <div data-selected={transaction?.category?.category}>\n <CategoryMenu selectedCategory={transaction?.category?.category} />\n </div>\n <div></div>\n <div\n onClick={() => toggleOpen(transaction.id)}\n style={{ cursor: 'pointer' }}\n >\n 🎯\n </div>\n {isOpen && (\n <div className=\"expand-area\">\n <div className=\"expand-content\">Hello!</div>\n </div>\n )}\n </>\n)\n", "import { Transaction } from '../types'\n\ntype FormatParameters = Pick<Transaction, 'amount'> &\n Pick<Partial<Transaction>, 'direction'>\nconst format = ({ amount, direction }: FormatParameters) =>\n (direction === 'CREDIT' ? '+' : '-') +\n Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(\n amount / 100,\n )\n\nexport const Money = {\n format,\n}\n", "import React, { useContext } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\nimport { CategoryMenuItem } from './CategoryMenuItem'\n\ntype Props = {\n selectedCategory: string\n}\n\nexport const CategoryMenu = ({ selectedCategory }: Props) => {\n const { categories } = useContext(LayerContext)\n return (\n <select>\n {categories.map(category => (\n <CategoryMenuItem\n category={category}\n selectedCategory={selectedCategory}\n />\n ))}\n </select>\n )\n}\n", "import React, { useContext } from 'react'\nimport { Category } from '../../types'\n\ntype Props = {\n selectedCategory: string\n category: Category\n maxDepth?: number\n}\n\nexport const CategoryMenuItem = ({\n selectedCategory,\n category,\n maxDepth = 1,\n}: Props) => {\n if (category.hasOwnProperty('subCategories') && maxDepth > 0) {\n return (\n <optgroup label={category.display_name}>\n {category.subCategories.map(category => (\n <CategoryMenuItem\n category={category}\n selectedCategory={selectedCategory}\n maxDepth={maxDepth - 1}\n />\n ))}\n </optgroup>\n )\n } else {\n return (\n <option\n key={category.category}\n value={category.category}\n selected={selectedCategory === category.category}\n >\n {category.display_name}\n </option>\n )\n }\n}\n", "import React, { PropsWithChildren } from 'react'\nimport { LayerContext } from '../../contexts/LayerContext'\nimport { LayerExecutionContext } from '../../types'\nimport useSWR from 'swr'\n\nconst appId = '1pskub33qd9qt19406hi4d1j6f'\nconst appSecret = '1k7up1ia2m0ino8el6md2l1isq3t7fdj1eq6firmkui8757lk6r6'\n\nexport async function getAccessToken(): Promise<OAuthResponse> {\n var details = {\n grant_type: 'client_credentials',\n scope: 'https://sandbox.layerfi.com/sandbox',\n client_id: 'canaryAppId',\n }\n\n const formBody = Object.entries(details)\n .map(key => encodeURIComponent(key[0]) + '=' + encodeURIComponent(key[1]))\n .join('&')\n const authRequest = fetch('https://auth.layerfi.com/oauth2/token', {\n method: 'POST',\n headers: {\n Authorization: 'Basic ' + btoa(appId + ':' + appSecret),\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formBody,\n })\n return (await (await authRequest).json()) as OAuthResponse\n}\n\nconst getCategories = (accessToken: string) => (url: string) =>\n fetch(url, {\n headers: {\n Authorization: 'Bearer ' + accessToken,\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n }).then(res => res.json())\n\ntype Props = {\n businessId: string\n}\n\nexport const LayerProvider = ({\n businessId,\n children,\n}: PropsWithChildren<Props>) => {\n const { data: auth } = useSWR(\n 'https://auth.layerfi.com/oauth2/token',\n getAccessToken,\n )\n const { data: categories } = useSWR(\n businessId &&\n auth?.access_token &&\n `https://sandbox.layerfi.com/v1/businesses/${businessId}/categories`,\n getCategories(auth?.access_token),\n )\n const value: LayerExecutionContext = {\n auth,\n businessId,\n categories: categories?.data?.categories || [],\n }\n return <LayerContext.Provider value={value}>{children}</LayerContext.Provider>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useState", "useContext", "React", "React", "React", "React", "React", "useContext", "React", "category", "useContext", "React", "dateFormat", "React", "useSWR", "useContext", "useState", "React", "React", "useSWR", "React"]
|
|
7
|
+
}
|