@layerfi/components 0.1.37 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1536,8 +1536,10 @@ declare module '@layerfi/components/components/DatePicker/DatePicker' {
1536
1536
  popperClassName?: string;
1537
1537
  currentDateOption?: boolean;
1538
1538
  minDate?: Date;
1539
+ maxDate?: Date;
1540
+ navigateArrows?: boolean;
1539
1541
  }
1540
- export const DatePicker: ({ selected, onChange, mode, dateFormat, timeIntervals, timeCaption, placeholderText, options, wrapperClassName, calendarClassName, popperClassName, minDate, currentDateOption, ...props }: DatePickerProps) => React.JSX.Element;
1542
+ export const DatePicker: ({ selected, onChange, mode, dateFormat, timeIntervals, timeCaption, placeholderText, options, wrapperClassName, calendarClassName, popperClassName, minDate, maxDate, currentDateOption, navigateArrows, ...props }: DatePickerProps) => React.JSX.Element;
1541
1543
  export {};
1542
1544
 
1543
1545
  }
@@ -3647,6 +3649,7 @@ declare module '@layerfi/components/hooks/useProfitAndLoss/useProfitAndLossLTM'
3647
3649
  loaded?: LoadedStatus;
3648
3650
  error?: any;
3649
3651
  pullData: (date: Date) => void;
3652
+ refetch: () => void;
3650
3653
  };
3651
3654
  /**
3652
3655
  * Hooks fetch Last Twelve Months sending 12 requests (one for each month).
@@ -4815,6 +4818,7 @@ declare module '@layerfi/components/types/profit_and_loss' {
4815
4818
  uncategorizedOutflows: number;
4816
4819
  operatingExpensesInverse?: number;
4817
4820
  uncategorizedOutflowsInverse?: number;
4821
+ uncategorized_transactions: number;
4818
4822
  }
4819
4823
  export interface ProfitAndLossSummaries {
4820
4824
  type: 'Profit_And_Loss_Summaries';
package/dist/index.js CHANGED
@@ -454,9 +454,9 @@ function useSizeClass() {
454
454
  const [width] = useWindowSize();
455
455
  const sizeClass = (0, import_react2.useMemo)(() => {
456
456
  switch (true) {
457
- case width < BREAKPOINTS.MOBILE:
457
+ case width <= BREAKPOINTS.MOBILE:
458
458
  return "mobile";
459
- case width < BREAKPOINTS.TABLET:
459
+ case width <= BREAKPOINTS.TABLET:
460
460
  return "tablet";
461
461
  default:
462
462
  return "desktop";
@@ -608,8 +608,25 @@ var DEPENDENCIES = {
608
608
  ["STATEMENT_OF_CASH_FLOWS" /* STATEMENT_OF_CASH_FLOWS */]: ALL_TOUCHABLE
609
609
  };
610
610
  var useDataSync = () => {
611
- const [syncTimestamps, setSyncTimestamps] = (0, import_react7.useState)({});
612
- const [readTimestamps, setReadTimestamps] = (0, import_react7.useState)({});
611
+ const initialTimestamp = Date.now();
612
+ const [syncTimestamps, setSyncTimestamps] = (0, import_react7.useState)({
613
+ ["BALANCE_SHEET" /* BALANCE_SHEET */]: initialTimestamp,
614
+ ["CHART_OF_ACCOUNTS" /* CHART_OF_ACCOUNTS */]: initialTimestamp,
615
+ ["JOURNAL" /* JOURNAL */]: initialTimestamp,
616
+ ["LEDGER_ACCOUNTS" /* LEDGER_ACCOUNTS */]: initialTimestamp,
617
+ ["LINKED_ACCOUNTS" /* LINKED_ACCOUNTS */]: initialTimestamp,
618
+ ["PROFIT_AND_LOSS" /* PROFIT_AND_LOSS */]: initialTimestamp,
619
+ ["STATEMENT_OF_CASH_FLOWS" /* STATEMENT_OF_CASH_FLOWS */]: initialTimestamp
620
+ });
621
+ const [readTimestamps, setReadTimestamps] = (0, import_react7.useState)({
622
+ ["BALANCE_SHEET" /* BALANCE_SHEET */]: initialTimestamp,
623
+ ["CHART_OF_ACCOUNTS" /* CHART_OF_ACCOUNTS */]: initialTimestamp,
624
+ ["JOURNAL" /* JOURNAL */]: initialTimestamp,
625
+ ["LEDGER_ACCOUNTS" /* LEDGER_ACCOUNTS */]: initialTimestamp,
626
+ ["LINKED_ACCOUNTS" /* LINKED_ACCOUNTS */]: initialTimestamp,
627
+ ["PROFIT_AND_LOSS" /* PROFIT_AND_LOSS */]: initialTimestamp,
628
+ ["STATEMENT_OF_CASH_FLOWS" /* STATEMENT_OF_CASH_FLOWS */]: initialTimestamp
629
+ });
613
630
  const touch = (model) => {
614
631
  setSyncTimestamps({
615
632
  ...syncTimestamps,
@@ -7709,7 +7726,7 @@ var DatePicker = ({
7709
7726
  selected,
7710
7727
  onChange,
7711
7728
  mode = "dayPicker",
7712
- dateFormat = mode === "monthPicker" || mode === "monthRangePicker" ? "MMMM, yyyy" : mode === "timePicker" ? "h:mm aa" : "MMMM d, yyyy",
7729
+ dateFormat = mode === "monthPicker" || mode === "monthRangePicker" ? "MMM, yyyy" : mode === "timePicker" ? "h:mm aa" : "MMM d, yyyy",
7713
7730
  timeIntervals = 15,
7714
7731
  timeCaption,
7715
7732
  placeholderText,
@@ -7718,11 +7735,15 @@ var DatePicker = ({
7718
7735
  calendarClassName,
7719
7736
  popperClassName,
7720
7737
  minDate,
7738
+ maxDate = /* @__PURE__ */ new Date(),
7721
7739
  currentDateOption = true,
7740
+ navigateArrows = mode === "monthPicker",
7722
7741
  ...props
7723
7742
  }) => {
7743
+ const pickerRef = (0, import_react86.useRef)(null);
7724
7744
  const [updatePickerDate, setPickerDate] = (0, import_react86.useState)(false);
7725
7745
  const [selectedDates, setSelectedDates] = (0, import_react86.useState)(selected);
7746
+ const { isDesktop } = useSizeClass();
7726
7747
  const [startDate, setStartDate] = (0, import_react86.useState)(
7727
7748
  getDefaultRangeDate("start", mode, selected) ?? /* @__PURE__ */ new Date()
7728
7749
  );
@@ -7762,7 +7783,8 @@ var DatePicker = ({
7762
7783
  }, [startDate, endDate]);
7763
7784
  const wrapperClassNames = (0, import_classnames38.default)(
7764
7785
  "Layer__datepicker__wrapper",
7765
- mode === "timePicker" && "Layer__datepicker__time__wrapper"
7786
+ mode === "timePicker" && "Layer__datepicker__time__wrapper",
7787
+ navigateArrows && "Layer__datepicker__wrapper--arrows"
7766
7788
  );
7767
7789
  const datePickerWrapperClassNames = (0, import_classnames38.default)(
7768
7790
  "Layer__datepicker",
@@ -7775,6 +7797,7 @@ var DatePicker = ({
7775
7797
  );
7776
7798
  const popperClassNames = (0, import_classnames38.default)(
7777
7799
  "Layer__datepicker__popper",
7800
+ mode === "timePicker" && "Layer__datepicker__time__popper",
7778
7801
  popperClassName
7779
7802
  );
7780
7803
  const handleDateChange = (date) => {
@@ -7805,9 +7828,35 @@ var DatePicker = ({
7805
7828
  );
7806
7829
  }
7807
7830
  };
7831
+ const isTodayOrAfter = Boolean(
7832
+ selectedDates instanceof Date && selectedDates >= /* @__PURE__ */ new Date()
7833
+ );
7834
+ const isBeforeMinDate = Boolean(
7835
+ minDate && selectedDates instanceof Date && selectedDates <= minDate
7836
+ );
7837
+ const changeDate = (value) => {
7838
+ if (mode === "dayPicker") {
7839
+ setSelectedDates(
7840
+ new Date(
7841
+ selectedDates.setDate(
7842
+ selectedDates.getDate() + value
7843
+ )
7844
+ )
7845
+ );
7846
+ } else if (mode === "monthPicker") {
7847
+ setSelectedDates(
7848
+ new Date(
7849
+ selectedDates.setMonth(
7850
+ selectedDates.getMonth() + value
7851
+ )
7852
+ )
7853
+ );
7854
+ }
7855
+ };
7808
7856
  return /* @__PURE__ */ import_react86.default.createElement("div", { className: wrapperClassNames }, /* @__PURE__ */ import_react86.default.createElement(
7809
7857
  import_react_datepicker.default,
7810
7858
  {
7859
+ ref: pickerRef,
7811
7860
  wrapperClassName: datePickerWrapperClassNames,
7812
7861
  startDate: isRangeMode(mode) ? startDate : void 0,
7813
7862
  endDate: isRangeMode(mode) ? endDate : void 0,
@@ -7823,10 +7872,33 @@ var DatePicker = ({
7823
7872
  renderDayContents: (day) => /* @__PURE__ */ import_react86.default.createElement("span", { className: "Layer__datepicker__day-contents" }, day),
7824
7873
  timeIntervals,
7825
7874
  timeCaption,
7875
+ timeFormat: "h mm aa",
7826
7876
  showTimeSelect: mode === "timePicker",
7827
7877
  showTimeSelectOnly: mode === "timePicker",
7828
7878
  minDate,
7829
- maxDate: /* @__PURE__ */ new Date(),
7879
+ maxDate,
7880
+ withPortal: !isDesktop,
7881
+ onCalendarOpen: () => {
7882
+ if (!isDesktop) {
7883
+ setTimeout(() => {
7884
+ document.getElementById("Layer__datepicker__portal")?.classList.remove("Layer__datepicker__portal--closed");
7885
+ document.getElementById("Layer__datepicker__portal")?.classList.add("Layer__datepicker__portal--opened");
7886
+ }, 10);
7887
+ }
7888
+ },
7889
+ onCalendarClose: () => {
7890
+ if (!isDesktop) {
7891
+ document.getElementById("Layer__datepicker__portal")?.classList.add("Layer__datepicker__portal--closed");
7892
+ document.getElementById("Layer__datepicker__portal")?.classList.remove("Layer__datepicker__portal--opened");
7893
+ }
7894
+ },
7895
+ portalId: "Layer__datepicker__portal",
7896
+ onFocus: (e) => e.target.readOnly = true,
7897
+ onInputClick: () => {
7898
+ if (pickerRef.current && !isDesktop) {
7899
+ pickerRef.current.setOpen(!pickerRef.current.isCalendarOpen);
7900
+ }
7901
+ },
7830
7902
  ...props
7831
7903
  },
7832
7904
  mode === "dayRangePicker" && /* @__PURE__ */ import_react86.default.createElement(
@@ -7836,7 +7908,39 @@ var DatePicker = ({
7836
7908
  setSelectedDate: setSelectedDates
7837
7909
  }
7838
7910
  )
7839
- ), currentDateOption && (mode === "dayPicker" || mode === "monthPicker") && /* @__PURE__ */ import_react86.default.createElement(
7911
+ ), navigateArrows && !isDesktop && /* @__PURE__ */ import_react86.default.createElement(import_react86.default.Fragment, null, /* @__PURE__ */ import_react86.default.createElement(
7912
+ Button,
7913
+ {
7914
+ "aria-label": "Previous Date",
7915
+ className: (0, import_classnames38.default)(
7916
+ "Layer__datepicker__prev-button",
7917
+ isBeforeMinDate && "Layer__datepicker__button--disabled"
7918
+ ),
7919
+ onClick: () => changeDate(-1),
7920
+ variant: "secondary" /* secondary */,
7921
+ disabled: isBeforeMinDate
7922
+ },
7923
+ /* @__PURE__ */ import_react86.default.createElement(ChevronLeft_default, { className: "Layer__datepicker__button-icon", size: 16 })
7924
+ ), /* @__PURE__ */ import_react86.default.createElement(
7925
+ Button,
7926
+ {
7927
+ "aria-label": "Next Date",
7928
+ variant: "secondary" /* secondary */,
7929
+ className: (0, import_classnames38.default)(
7930
+ "Layer__datepicker__next-button",
7931
+ isTodayOrAfter ? "Layer__datepicker__button--disabled" : void 0
7932
+ ),
7933
+ onClick: () => changeDate(1),
7934
+ disabled: isTodayOrAfter
7935
+ },
7936
+ /* @__PURE__ */ import_react86.default.createElement(
7937
+ ChevronRight_default,
7938
+ {
7939
+ className: "Layer__datepicker__button-icon",
7940
+ size: 16
7941
+ }
7942
+ )
7943
+ )), currentDateOption && (mode === "dayPicker" || mode === "monthPicker") && /* @__PURE__ */ import_react86.default.createElement(
7840
7944
  Button,
7841
7945
  {
7842
7946
  className: "Layer__datepicker__current-button",
@@ -8308,7 +8412,7 @@ var BankTransactionsContent = ({
8308
8412
  setDateRange: (v) => setDateRange(v)
8309
8413
  }
8310
8414
  ),
8311
- !listView && /* @__PURE__ */ import_react91.default.createElement(
8415
+ !listView && /* @__PURE__ */ import_react91.default.createElement("div", { className: "Layer__bank-transactions__table-wrapper" }, /* @__PURE__ */ import_react91.default.createElement(
8312
8416
  BankTransactionsTable,
8313
8417
  {
8314
8418
  categorizeView,
@@ -8321,7 +8425,7 @@ var BankTransactionsContent = ({
8321
8425
  showDescriptions,
8322
8426
  showReceiptUploads
8323
8427
  }
8324
- ),
8428
+ )),
8325
8429
  isLoading && !bankTransactions ? /* @__PURE__ */ import_react91.default.createElement("div", { className: "Layer__bank-transactions__loader-container" }, /* @__PURE__ */ import_react91.default.createElement(Loader2, null)) : null,
8326
8430
  !isLoading && listView && mobileComponent !== "mobileList" ? /* @__PURE__ */ import_react91.default.createElement(
8327
8431
  BankTransactionList,
@@ -8807,6 +8911,7 @@ var useProfitAndLossLTM = ({ currentDate, tagFilter, reportingBasis } = {
8807
8911
  totalExpenses: 0,
8808
8912
  uncategorizedInflows: 0,
8809
8913
  uncategorizedOutflows: 0,
8914
+ uncategorized_transactions: 0,
8810
8915
  isLoading: true
8811
8916
  });
8812
8917
  }
@@ -8857,12 +8962,16 @@ var useProfitAndLossLTM = ({ currentDate, tagFilter, reportingBasis } = {
8857
8962
  mutate();
8858
8963
  }
8859
8964
  }, [syncTimestamps]);
8965
+ const refetch = () => {
8966
+ mutate();
8967
+ };
8860
8968
  return {
8861
8969
  data,
8862
8970
  isLoading,
8863
8971
  loaded,
8864
8972
  error,
8865
- pullData
8973
+ pullData,
8974
+ refetch
8866
8975
  };
8867
8976
  };
8868
8977
 
@@ -14740,27 +14849,33 @@ var NotificationCard = ({
14740
14849
  };
14741
14850
 
14742
14851
  // src/components/TransactionToReviewCard/TransactionToReviewCard.tsx
14852
+ var import_date_fns34 = require("date-fns");
14743
14853
  var TransactionToReviewCard = ({
14744
14854
  onClick,
14745
14855
  usePnlDateRange
14746
14856
  }) => {
14747
- const {
14748
- data,
14749
- isLoading,
14750
- loadingStatus,
14751
- error,
14752
- refetch,
14753
- activate: activateBankTransactions
14754
- } = useBankTransactionsContext();
14755
14857
  const { dateRange: contextDateRange } = (0, import_react169.useContext)(ProfitAndLoss.Context);
14756
14858
  const dateRange = usePnlDateRange ? contextDateRange : void 0;
14859
+ const [toReview, setToReview] = (0, import_react169.useState)(0);
14860
+ const { data, loaded, error, refetch } = useProfitAndLossLTM({
14861
+ currentDate: dateRange ? dateRange.startDate : (0, import_date_fns34.startOfMonth)(/* @__PURE__ */ new Date())
14862
+ });
14757
14863
  (0, import_react169.useEffect)(() => {
14758
- activateBankTransactions();
14864
+ checkTransactionsToReview();
14759
14865
  }, []);
14760
- const toReview = (0, import_react169.useMemo)(
14761
- () => countTransactionsToReview({ transactions: data, dateRange }),
14762
- [data, isLoading, dateRange]
14763
- );
14866
+ (0, import_react169.useEffect)(() => {
14867
+ checkTransactionsToReview();
14868
+ }, [dateRange, loaded]);
14869
+ const checkTransactionsToReview = () => {
14870
+ if (data && dateRange) {
14871
+ const monthTx = data.filter(
14872
+ (x) => x.month - 1 === (0, import_date_fns34.getMonth)(dateRange.startDate) && x.year === (0, import_date_fns34.getYear)(dateRange.startDate)
14873
+ );
14874
+ if (monthTx.length > 0) {
14875
+ setToReview(monthTx[0].uncategorized_transactions);
14876
+ }
14877
+ }
14878
+ };
14764
14879
  return /* @__PURE__ */ import_react169.default.createElement(
14765
14880
  NotificationCard,
14766
14881
  {
@@ -14768,8 +14883,8 @@ var TransactionToReviewCard = ({
14768
14883
  onClick: () => onClick && onClick()
14769
14884
  },
14770
14885
  /* @__PURE__ */ import_react169.default.createElement(Text, { size: "sm" /* sm */ }, "Transactions to review"),
14771
- loadingStatus === "initial" || loadingStatus === "loading" ? /* @__PURE__ */ import_react169.default.createElement(BadgeLoader, null) : null,
14772
- loadingStatus === "complete" && error ? /* @__PURE__ */ import_react169.default.createElement(
14886
+ loaded === "initial" || loaded === "loading" ? /* @__PURE__ */ import_react169.default.createElement(BadgeLoader, null) : null,
14887
+ loaded === "complete" && error ? /* @__PURE__ */ import_react169.default.createElement(
14773
14888
  Badge,
14774
14889
  {
14775
14890
  variant: "error" /* ERROR */,
@@ -14779,7 +14894,7 @@ var TransactionToReviewCard = ({
14779
14894
  },
14780
14895
  "Refresh"
14781
14896
  ) : null,
14782
- loadingStatus === "complete" && !error && toReview > 0 ? /* @__PURE__ */ import_react169.default.createElement(
14897
+ loaded === "complete" && !error && toReview > 0 ? /* @__PURE__ */ import_react169.default.createElement(
14783
14898
  Badge,
14784
14899
  {
14785
14900
  variant: "warning" /* WARNING */,
@@ -14789,7 +14904,7 @@ var TransactionToReviewCard = ({
14789
14904
  toReview,
14790
14905
  " pending"
14791
14906
  ) : null,
14792
- loadingStatus === "complete" && !error && toReview === 0 ? /* @__PURE__ */ import_react169.default.createElement(
14907
+ loaded === "complete" && !error && toReview === 0 ? /* @__PURE__ */ import_react169.default.createElement(
14793
14908
  Badge,
14794
14909
  {
14795
14910
  variant: "success" /* SUCCESS */,