From fcb1bba7fa7ccad9d5cb4a4ff6d2a3d3b6571af8 Mon Sep 17 00:00:00 2001
From: Shazib Hussain <me@shazib.com>
Date: Sun, 18 Jun 2023 00:49:48 +0100
Subject: [PATCH] Removing Tutorial code (#1146)

---
 .../src/components/accounts/Account.js        |  1 -
 .../src/components/tutorial/AnimateIn.js      | 16 ----
 .../components/tutorial/BudgetCategories.js   | 47 ---------
 .../src/components/tutorial/BudgetInitial.js  | 49 ----------
 .../components/tutorial/BudgetNewIncome.js    | 48 ----------
 .../components/tutorial/BudgetNextMonth.js    | 63 ------------
 .../src/components/tutorial/BudgetSummary.js  | 56 -----------
 .../components/tutorial/CategoryBalance.js    | 32 -------
 .../components/tutorial/DeleteTransactions.js | 21 ----
 .../src/components/tutorial/Final.js          | 57 -----------
 .../src/components/tutorial/Intro.js          | 64 -------------
 .../src/components/tutorial/Navigation.js     | 39 --------
 .../src/components/tutorial/Overspending.js   | 95 -------------------
 .../src/components/tutorial/TransactionAdd.js | 48 ----------
 .../components/tutorial/TransactionEnter.js   | 28 ------
 .../tutorial/TransactionFinalize.js           | 31 ------
 .../src/components/tutorial/common.js         | 68 -------------
 packages/desktop-electron/index.js            |  6 +-
 packages/desktop-electron/menu.js             | 14 ---
 packages/loot-core/src/client/constants.ts    |  3 -
 .../loot-core/src/client/reducers/index.ts    |  2 -
 .../loot-core/src/client/reducers/tutorial.ts | 23 -----
 packages/loot-core/src/client/tutorial.ts     |  5 -
 .../loot-core/src/types/main-handlers.d.ts    |  3 -
 upcoming-release-notes/1146.md                |  6 ++
 25 files changed, 7 insertions(+), 818 deletions(-)
 delete mode 100644 packages/desktop-client/src/components/tutorial/AnimateIn.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/BudgetCategories.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/BudgetInitial.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/BudgetNewIncome.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/BudgetNextMonth.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/BudgetSummary.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/CategoryBalance.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/DeleteTransactions.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/Final.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/Intro.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/Navigation.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/Overspending.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/TransactionAdd.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/TransactionEnter.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/TransactionFinalize.js
 delete mode 100644 packages/desktop-client/src/components/tutorial/common.js
 delete mode 100644 packages/loot-core/src/client/reducers/tutorial.ts
 delete mode 100644 packages/loot-core/src/client/tutorial.ts
 create mode 100644 upcoming-release-notes/1146.md

diff --git a/packages/desktop-client/src/components/accounts/Account.js b/packages/desktop-client/src/components/accounts/Account.js
index 921799996..7c25affc3 100644
--- a/packages/desktop-client/src/components/accounts/Account.js
+++ b/packages/desktop-client/src/components/accounts/Account.js
@@ -2033,7 +2033,6 @@ export default function Account() {
     modalShowing: state.modals.modalStack.length > 0,
     accountsSyncing: state.account.accountsSyncing,
     lastUndoState: state.app.lastUndoState,
-    tutorialStage: state.tutorial.stage,
   }));
 
   let dispatch = useDispatch();
diff --git a/packages/desktop-client/src/components/tutorial/AnimateIn.js b/packages/desktop-client/src/components/tutorial/AnimateIn.js
deleted file mode 100644
index 21465e727..000000000
--- a/packages/desktop-client/src/components/tutorial/AnimateIn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component } from 'react';
-
-class AnimateIn extends Component {
-  state = { animating: false };
-
-  componentDidMount() {
-    setTimeout(() => this.setState({ animating: true }), this.props.delay || 0);
-  }
-
-  render() {
-    const { children } = this.props;
-    return children(this.state.animating);
-  }
-}
-
-export default AnimateIn;
diff --git a/packages/desktop-client/src/components/tutorial/BudgetCategories.js b/packages/desktop-client/src/components/tutorial/BudgetCategories.js
deleted file mode 100644
index c1ff56e30..000000000
--- a/packages/desktop-client/src/components/tutorial/BudgetCategories.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-
-import { colors } from '../../style';
-import { Tooltip, Pointer, P } from '../common';
-
-import { Title } from './common';
-import Navigation from './Navigation';
-
-function BudgetInitial({ targetRect, navigationProps }) {
-  return (
-    <Tooltip
-      targetRect={targetRect}
-      position="left-center"
-      width={300}
-      style={{
-        border: 'none',
-        backgroundColor: 'transparent',
-        boxShadow: 'none',
-        transform: 'translateX(-5px)',
-        fontSize: 14,
-      }}
-    >
-      <Pointer
-        backgroundColor="white"
-        color={colors.n1}
-        pointerPosition="center"
-        pointerDirection="right"
-        innerStyle={{ padding: 20 }}
-      >
-        <Title>This is where you budget money for the current month</Title>
-
-        <P>
-          As money comes in, you put it in categories. As money is spent, you
-          can see each categories’ balance.
-        </P>
-
-        <P isLast={true}>
-          Don’t overthink categories. If you haven’t budgeted before, start with
-          just a few.
-        </P>
-        <Navigation {...navigationProps} />
-      </Pointer>
-    </Tooltip>
-  );
-}
-
-export default BudgetInitial;
diff --git a/packages/desktop-client/src/components/tutorial/BudgetInitial.js b/packages/desktop-client/src/components/tutorial/BudgetInitial.js
deleted file mode 100644
index 56cedf0e2..000000000
--- a/packages/desktop-client/src/components/tutorial/BudgetInitial.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import React from 'react';
-import { connect } from 'react-redux';
-
-import { bindActionCreators } from 'redux';
-
-import * as actions from 'loot-core/src/client/actions';
-
-import { P, Button } from '../common';
-
-import { Title, Standalone, useMinimized } from './common';
-import Navigation from './Navigation';
-
-function BudgetInitial({ accounts, navigationProps }) {
-  let [minimized, toggle] = useMinimized();
-
-  return (
-    <Standalone>
-      <Title>Go ahead and budget your money</Title>
-      {!minimized && (
-        <>
-          <P>
-            You should see all of your current accounts’ balance available to
-            budget. Click on the budgeted column for a category create a budget.
-            Keep doing this until your “To Budget” amount is zero.
-          </P>
-          <P>
-            Don’t worry too much about your initial budget. Just guess. You’ll
-            learn more about your spending in the first couple months.
-          </P>
-        </>
-      )}
-      <Navigation
-        {...navigationProps}
-        leftContent={
-          <Button bare onClick={toggle}>
-            {minimized ? 'Show more' : 'Show less'}
-          </Button>
-        }
-      />
-    </Standalone>
-  );
-}
-
-export default connect(
-  state => ({
-    accounts: state.queries.accounts,
-  }),
-  dispatch => bindActionCreators(actions, dispatch),
-)(BudgetInitial);
diff --git a/packages/desktop-client/src/components/tutorial/BudgetNewIncome.js b/packages/desktop-client/src/components/tutorial/BudgetNewIncome.js
deleted file mode 100644
index cf20b997a..000000000
--- a/packages/desktop-client/src/components/tutorial/BudgetNewIncome.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import React from 'react';
-
-import { colors } from '../../style';
-import { Tooltip, Pointer, P } from '../common';
-
-import { Title } from './common';
-import Navigation from './Navigation';
-
-function BudgetSummary({ targetRect, navigationProps }) {
-  return (
-    <Tooltip
-      targetRect={targetRect}
-      position="bottom-center"
-      width={450}
-      style={{
-        border: 'none',
-        backgroundColor: 'transparent',
-        color: colors.n1,
-        boxShadow: 'none',
-        marginTop: 5,
-        fontSize: 14,
-      }}
-    >
-      <Pointer
-        backgroundColor="white"
-        color={colors.n1}
-        pointerPosition="center"
-        innerStyle={{ padding: 20 }}
-      >
-        <Title>More money!</Title>
-        <P>
-          If you added any deposit transactions, you’ll see that you have more
-          money to budget. Any income becomes{' '}
-          <strong>immediately available</strong> to budget. Hooray!
-        </P>
-
-        <P isLast={true}>
-          If you’ve already budgeted all you need this month, you can click the
-          “To Budget” amount and select “Hold for next month.” This puts the
-          money away for next month.
-        </P>
-        <Navigation {...navigationProps} showBack={false} />
-      </Pointer>
-    </Tooltip>
-  );
-}
-
-export default BudgetSummary;
diff --git a/packages/desktop-client/src/components/tutorial/BudgetNextMonth.js b/packages/desktop-client/src/components/tutorial/BudgetNextMonth.js
deleted file mode 100644
index 65bf0418d..000000000
--- a/packages/desktop-client/src/components/tutorial/BudgetNextMonth.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import React from 'react';
-import { connect } from 'react-redux';
-
-import { bindActionCreators } from 'redux';
-
-import * as actions from 'loot-core/src/client/actions';
-
-import { View, P, Button } from '../common';
-
-import { Standalone, Title, useMinimized } from './common';
-import Navigation from './Navigation';
-
-function BudgetNextMonth({ stepTwo, navigationProps }) {
-  let [minimized, toggle] = useMinimized();
-
-  return (
-    <Standalone width={500}>
-      <Title>Budgeting the next month</Title>
-      {!minimized &&
-        (!stepTwo ? (
-          <View>
-            <P>
-              When a new month comes around, you distribute money again to fund
-              each category for the new month. Move to the next month by
-              clicking the right arrow.
-            </P>
-
-            <P isLast={true}>
-              Tip: Show multiple months at once with the control in the top left
-              of the screen.
-            </P>
-          </View>
-        ) : (
-          <View>
-            <P>
-              It’s easier this time though! Just hover over the new month and
-              click 3 dots menu and select “Copy last month’s budget” to use the
-              same budget as last month.
-            </P>
-
-            <P isLast={true}>
-              You likely need to tweak the budget for the new month, depending
-              on overspending and other factors. That’s ok! Adjusting your
-              budget as life happens is crucial to a realistic budget.
-            </P>
-          </View>
-        ))}
-
-      <Navigation
-        {...navigationProps}
-        leftContent={
-          <Button bare onClick={toggle}>
-            {minimized ? 'Show more' : 'Show less'}
-          </Button>
-        }
-      />
-    </Standalone>
-  );
-}
-
-export default connect(null, dispatch => bindActionCreators(actions, dispatch))(
-  BudgetNextMonth,
-);
diff --git a/packages/desktop-client/src/components/tutorial/BudgetSummary.js b/packages/desktop-client/src/components/tutorial/BudgetSummary.js
deleted file mode 100644
index 4c3c4551b..000000000
--- a/packages/desktop-client/src/components/tutorial/BudgetSummary.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import React from 'react';
-
-import { colors } from '../../style';
-import { Tooltip, Pointer, P } from '../common';
-
-import { Title } from './common';
-import Navigation from './Navigation';
-
-function BudgetSummary({ fromYNAB, targetRect, navigationProps }) {
-  return (
-    <Tooltip
-      targetRect={targetRect}
-      position="bottom-center"
-      width={450}
-      style={{
-        border: 'none',
-        backgroundColor: 'transparent',
-        color: colors.n1,
-        boxShadow: 'none',
-        marginTop: 5,
-        fontSize: 14,
-      }}
-    >
-      <Pointer
-        backgroundColor="white"
-        pointerPosition="center"
-        innerStyle={{ padding: 20 }}
-      >
-        <Title>Budget Overview</Title>
-
-        <P>
-          Actual uses a system where{' '}
-          <strong>you can only budget money that you currently have</strong>.
-        </P>
-
-        <P isLast={!fromYNAB}>
-          This is a summary of what money you have to budget and how Actual
-          calculated it. It’s your current income (including anything leftover
-          from last month) minus any overspending from last month and any
-          already budgeted amount.
-        </P>
-
-        {fromYNAB && (
-          <P isLast={true}>
-            Since you’re coming from YNAB 4, an important distinction is that
-            money is always immediately available.
-          </P>
-        )}
-
-        <Navigation {...navigationProps} showBack={false} />
-      </Pointer>
-    </Tooltip>
-  );
-}
-
-export default BudgetSummary;
diff --git a/packages/desktop-client/src/components/tutorial/CategoryBalance.js b/packages/desktop-client/src/components/tutorial/CategoryBalance.js
deleted file mode 100644
index 198f0e0a5..000000000
--- a/packages/desktop-client/src/components/tutorial/CategoryBalance.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react';
-
-import { P, Button } from '../common';
-
-import { Standalone, Title, useMinimized } from './common';
-import Navigation from './Navigation';
-
-function CategoryBalance({ targetRect, navigationProps }) {
-  let [minimized, toggle] = useMinimized();
-
-  return (
-    <Standalone>
-      <Title>Tracking categories</Title>
-      {!minimized && (
-        <P isLast={true}>
-          If you categorized any expenses, the budget has updated to show the
-          amount spent in those categories and the new balance.
-        </P>
-      )}
-      <Navigation
-        {...navigationProps}
-        leftContent={
-          <Button bare onClick={toggle}>
-            {minimized ? 'Show more' : 'Show less'}
-          </Button>
-        }
-      />
-    </Standalone>
-  );
-}
-
-export default CategoryBalance;
diff --git a/packages/desktop-client/src/components/tutorial/DeleteTransactions.js b/packages/desktop-client/src/components/tutorial/DeleteTransactions.js
deleted file mode 100644
index 5d68fb04b..000000000
--- a/packages/desktop-client/src/components/tutorial/DeleteTransactions.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-
-import { P } from '../common';
-
-import { Standalone, Title } from './common';
-import Navigation from './Navigation';
-
-function DeleteTransactions({ targetRect, navigationProps }) {
-  return (
-    <Standalone width={500}>
-      <Title>Deleting transactions</Title>
-      <P isLast={true}>
-        Let’s cleanup the fake transactions we added. You can delete
-        transactions by hovering over them and clicking the “X” beside them.
-      </P>
-      <Navigation {...navigationProps} showBack={false} />
-    </Standalone>
-  );
-}
-
-export default DeleteTransactions;
diff --git a/packages/desktop-client/src/components/tutorial/Final.js b/packages/desktop-client/src/components/tutorial/Final.js
deleted file mode 100644
index 3070d812d..000000000
--- a/packages/desktop-client/src/components/tutorial/Final.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import React from 'react';
-
-import { P, ModalButtons, Button } from '../common';
-
-import { Standalone, Title, ExternalLink } from './common';
-
-function Final({ targetRect, navigationProps }) {
-  return (
-    <Standalone width={500}>
-      <Title>That’s it!</Title>
-      <P>
-        With that workflow you can have peace of mind that what you are looking
-        at reflects reality.{' '}
-        <span role="img" aria-label="Relieved smile" aria-hidden="true">
-          &#128524;
-        </span>{' '}
-        The amount of money in a category is cash that you can safely spend
-        right now.
-      </P>
-
-      <P>
-        You probably want to delete the transactions you added and clean up your
-        budget. If you have any questions or feedback, please get{' '}
-        <a
-          href="https://actualbudget.org/contact/"
-          target="_blank"
-          rel="noopener noreferrer"
-        >
-          in touch
-        </a>
-        .
-      </P>
-
-      <P isLast={true}>
-        Read{' '}
-        <ExternalLink asAnchor href="https://actualbudget.org/docs/budgeting/">
-          How it Works
-        </ExternalLink>{' '}
-        for an in-depth explanation of the budgeting workflow.
-      </P>
-
-      <ModalButtons style={{ marginTop: 20 }}>
-        <Button
-          style={{ marginRight: 10 }}
-          onClick={() => navigationProps.previousTutorialStage()}
-        >
-          Back
-        </Button>
-        <Button onClick={() => navigationProps.endTutorial()} primary>
-          End Tutorial
-        </Button>
-      </ModalButtons>
-    </Standalone>
-  );
-}
-
-export default Final;
diff --git a/packages/desktop-client/src/components/tutorial/Intro.js b/packages/desktop-client/src/components/tutorial/Intro.js
deleted file mode 100644
index e51db49b1..000000000
--- a/packages/desktop-client/src/components/tutorial/Intro.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import React from 'react';
-
-import { View, Text, P, ModalButtons, Button } from '../common';
-
-import { Standalone, Title, ExternalLink } from './common';
-
-function Intro({ fromYNAB, nextTutorialStage, closeTutorial }) {
-  return (
-    <Standalone width={500}>
-      <Title>Let’s get started</Title>
-      <P>
-        Welcome to Actual!{' '}
-        <span role="img" aria-label="Party" aria-hidden="true">
-          &#127881;
-        </span>{' '}
-        <strong>Learn the basic workflow with this quick tutorial.</strong> You
-        can always restart it from the File menu.
-      </P>
-
-      <P>We also recommend reading these articles:</P>
-
-      <View style={{ lineHeight: '1.5em' }}>
-        <Text>
-          <ExternalLink asAnchor href="https://actualbudget.org/docs/tour/">
-            Tour
-          </ExternalLink>
-          : A guide on what to do first
-        </Text>
-        <Text>
-          <ExternalLink
-            asAnchor
-            href="https://actualbudget.org/docs/budgeting/"
-          >
-            How it Works
-          </ExternalLink>
-          : An in-depth explanation of the budgeting workflow
-        </Text>
-      </View>
-
-      <ModalButtons style={{ marginTop: 20 }}>
-        <Button style={{ marginRight: 10 }} onClick={() => closeTutorial()}>
-          Skip
-        </Button>
-        <Button
-          primary
-          onClick={() => {
-            if (window.location.hash !== '#/budget') {
-              window.location.hash = '#/budget';
-              setTimeout(() => {
-                nextTutorialStage();
-              }, 500);
-            } else {
-              nextTutorialStage();
-            }
-          }}
-        >
-          Start Tutorial
-        </Button>
-      </ModalButtons>
-    </Standalone>
-  );
-}
-
-export default Intro;
diff --git a/packages/desktop-client/src/components/tutorial/Navigation.js b/packages/desktop-client/src/components/tutorial/Navigation.js
deleted file mode 100644
index f673d7cec..000000000
--- a/packages/desktop-client/src/components/tutorial/Navigation.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import React from 'react';
-
-import { Button, ModalButtons } from '../common';
-
-function Navigation({
-  nextTutorialStage,
-  previousTutorialStage,
-  closeTutorial,
-  showBack = true,
-  showNext = true,
-  leftContent,
-  disableNext,
-}) {
-  return (
-    <ModalButtons leftContent={leftContent} style={{ marginTop: 20 }}>
-      <Button onClick={() => closeTutorial()}>Close</Button>
-      {showBack && (
-        <Button
-          onClick={() => previousTutorialStage()}
-          style={{ marginLeft: 10 }}
-        >
-          Back
-        </Button>
-      )}
-      {showNext && (
-        <Button
-          primary
-          onClick={() => nextTutorialStage()}
-          disabled={disableNext}
-          style={{ marginLeft: 10 }}
-        >
-          Next
-        </Button>
-      )}
-    </ModalButtons>
-  );
-}
-
-export default Navigation;
diff --git a/packages/desktop-client/src/components/tutorial/Overspending.js b/packages/desktop-client/src/components/tutorial/Overspending.js
deleted file mode 100644
index 6ad541dca..000000000
--- a/packages/desktop-client/src/components/tutorial/Overspending.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import React from 'react';
-import { connect } from 'react-redux';
-
-import { bindActionCreators } from 'redux';
-
-import * as actions from 'loot-core/src/client/actions';
-import * as monthUtils from 'loot-core/src/shared/months';
-import { integerToCurrency } from 'loot-core/src/shared/util';
-
-import { P, View, Text, Button } from '../common';
-import NamespaceContext from '../spreadsheet/NamespaceContext';
-import SheetValue from '../spreadsheet/SheetValue';
-
-import { Standalone, Title, useMinimized } from './common';
-import Navigation from './Navigation';
-
-function Overspending({ navigationProps, stepTwo }) {
-  let currentMonth = monthUtils.currentMonth();
-  let sheetName = monthUtils.sheetForMonth(currentMonth);
-  let month = monthUtils.format(currentMonth, 'MMM');
-  let [minimized, toggle] = useMinimized();
-
-  return (
-    <NamespaceContext.Provider value={sheetName}>
-      <SheetValue binding={{ name: 'total-spent' }}>
-        {({ value: spentTotal }) => {
-          return (
-            <Standalone width={400}>
-              <Title>Overspending</Title>
-              {!minimized &&
-                (stepTwo ? (
-                  <View>
-                    <P>
-                      The category balance becomes negative. Next month will
-                      reset this balance to zero, and you’ll see it in
-                      “Overspent in {month}” in next month’s summary, which in
-                      turn takes it out of next month’s “To Budget” amount.{' '}
-                    </P>
-
-                    <P isLast={true}>
-                      <strong>
-                        When you overspend, it’s taken out of next month’s
-                        available budget.
-                      </strong>{' '}
-                      A simple workflow would be to just take it out of next
-                      month’s savings, or whatever you like.
-                    </P>
-                  </View>
-                ) : (
-                  <View>
-                    <P>
-                      What happens when you overspend? Let’s find out.
-                      {spentTotal === 0 && (
-                        <Text>
-                          You haven’t spent any money yet so add some expenses
-                          in your account to see it in action.
-                        </Text>
-                      )}
-                    </P>
-
-                    <P isLast={true}>
-                      {spentTotal !== 0 && (
-                        <Text>
-                          You’ve spent{' '}
-                          <strong>
-                            ${integerToCurrency(Math.abs(spentTotal))}
-                          </strong>
-                          .
-                        </Text>
-                      )}{' '}
-                      Try zeroing out a budget for a category that already has
-                      spent money in it. You’ll see how overspending works.
-                    </P>
-                  </View>
-                ))}
-
-              <Navigation
-                {...navigationProps}
-                leftContent={
-                  <Button bare onClick={toggle}>
-                    {minimized ? 'Show more' : 'Show less'}
-                  </Button>
-                }
-              />
-            </Standalone>
-          );
-        }}
-      </SheetValue>
-    </NamespaceContext.Provider>
-  );
-}
-
-export default connect(null, dispatch => bindActionCreators(actions, dispatch))(
-  Overspending,
-);
diff --git a/packages/desktop-client/src/components/tutorial/TransactionAdd.js b/packages/desktop-client/src/components/tutorial/TransactionAdd.js
deleted file mode 100644
index 081ca6836..000000000
--- a/packages/desktop-client/src/components/tutorial/TransactionAdd.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import React from 'react';
-
-import { colors } from '../../style';
-import { Tooltip, Pointer, P } from '../common';
-
-import { Title } from './common';
-import Navigation from './Navigation';
-
-function TransactionAdd({ targetRect, navigationProps }) {
-  return (
-    <Tooltip
-      targetRect={targetRect}
-      position="bottom-center"
-      width={400}
-      style={{
-        border: 'none',
-        backgroundColor: 'transparent',
-        color: colors.n1,
-        boxShadow: 'none',
-        marginTop: 5,
-        fontSize: 14,
-      }}
-    >
-      <Pointer
-        backgroundColor="white"
-        pointerPosition="center"
-        innerStyle={{ padding: 20 }}
-      >
-        <Title>Let’s add some transactions</Title>
-        <P>
-          You can add transactions in two ways: import files from your bank or
-          manually add individual transactions. You can usually download these
-          files straight from your online bank account. (QIF/OFX/QFX is
-          supported, sometimes called a “Quicken File”)
-        </P>
-
-        <P isLast={true}>
-          Try <strong>clicking “Add New”</strong> to see how adding transactions
-          affects your budget.
-        </P>
-
-        <Navigation {...navigationProps} showBack={false} />
-      </Pointer>
-    </Tooltip>
-  );
-}
-
-export default TransactionAdd;
diff --git a/packages/desktop-client/src/components/tutorial/TransactionEnter.js b/packages/desktop-client/src/components/tutorial/TransactionEnter.js
deleted file mode 100644
index 6f4eae659..000000000
--- a/packages/desktop-client/src/components/tutorial/TransactionEnter.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react';
-
-import { P } from '../common';
-
-import { Standalone, Title } from './common';
-import Navigation from './Navigation';
-
-function TransactionEnter({ navigationProps }) {
-  return (
-    <Standalone width={400}>
-      <Title>Add a transaction</Title>
-      <P>
-        Categorize the new transaction (you can use anything, try “Food”) and
-        enter any amount in the “payment” column. You’ll see how it affects the
-        budget.
-      </P>
-
-      <P>
-        Next, try adding an income transaction by categorizing a new transaction
-        as “Income” and entering an amount in the “deposit” column.
-      </P>
-
-      <Navigation {...navigationProps} />
-    </Standalone>
-  );
-}
-
-export default TransactionEnter;
diff --git a/packages/desktop-client/src/components/tutorial/TransactionFinalize.js b/packages/desktop-client/src/components/tutorial/TransactionFinalize.js
deleted file mode 100644
index 71a9fb998..000000000
--- a/packages/desktop-client/src/components/tutorial/TransactionFinalize.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react';
-
-import { css } from 'glamor';
-
-import { P } from '../common';
-
-import { Standalone } from './common';
-import Navigation from './Navigation';
-
-function TransactionFinalize({ navigationProps }) {
-  return (
-    <Standalone width={400}>
-      <P style={{ fontSize: 16 }}>All done!</P>
-      <P isLast={true}>
-        You can edit transactions by clicking anywhere on the table, or move
-        around with the keyboard. A few keybindings:
-        <ul {...css({ padding: '0 15px', '& li': { marginTop: 5 } })}>
-          <li>
-            Tab and enter are the same and will move right (holding shift will
-            move left).
-          </li>
-          <li>Alt or command with arrow keys will move in any direction.</li>
-        </ul>
-      </P>
-
-      <Navigation {...navigationProps} />
-    </Standalone>
-  );
-}
-
-export default TransactionFinalize;
diff --git a/packages/desktop-client/src/components/tutorial/common.js b/packages/desktop-client/src/components/tutorial/common.js
deleted file mode 100644
index f77426e6d..000000000
--- a/packages/desktop-client/src/components/tutorial/common.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import React, { forwardRef, useState } from 'react';
-
-import { colors } from '../../style';
-import { View, AnchorLink } from '../common';
-
-import AnimateIn from './AnimateIn';
-
-export function Title({ children }) {
-  return (
-    <View style={{ fontSize: 25, fontWeight: 700, marginBottom: 15 }}>
-      {children}
-    </View>
-  );
-}
-
-export function Standalone({ children, width = 320, skipAnimation = false }) {
-  return (
-    <AnimateIn>
-      {animating => (
-        <View
-          style={{
-            position: 'absolute',
-            bottom: 0,
-            right: 0,
-            transform: `translateY(${skipAnimation || animating ? 0 : 10}px)`,
-            opacity: skipAnimation || animating ? 1 : 0,
-            transition: 'opacity .2s, transform .2s',
-            padding: 20,
-            margin: 40,
-            backgroundColor: 'white',
-            width: width,
-            boxShadow: '0 2px 8px rgba(0, 0, 0, .3)',
-            borderRadius: 4,
-            zIndex: 1000,
-            fontSize: 14,
-          }}
-        >
-          {children}
-        </View>
-      )}
-    </AnimateIn>
-  );
-}
-
-export const ExternalLink = forwardRef((props, ref) => {
-  let { href, ...linkProps } = props;
-  return (
-    <AnchorLink
-      to="/"
-      {...linkProps}
-      style={{ fontSize: 14, color: colors.p4 }}
-      onClick={e => {
-        e.preventDefault();
-        window.Actual.openURLInBrowser(href);
-      }}
-    />
-  );
-});
-
-export function useMinimized() {
-  let [minimized, setMinimized] = useState(false);
-
-  function toggleContent() {
-    setMinimized(!minimized);
-  }
-
-  return [minimized, toggleContent];
-}
diff --git a/packages/desktop-electron/index.js b/packages/desktop-electron/index.js
index 898c42aa3..1b1a9a3ed 100644
--- a/packages/desktop-electron/index.js
+++ b/packages/desktop-electron/index.js
@@ -204,11 +204,7 @@ function updateMenu(isBudgetOpen) {
   const file = menu.items.filter(item => item.label === 'File')[0];
   const fileItems = file.submenu.items;
   fileItems
-    .filter(
-      item =>
-        item.label === 'Start Tutorial' || item.label === 'Load Backup...',
-    )
-
+    .filter(item => item.label === 'Load Backup...')
     .map(item => (item.enabled = isBudgetOpen));
 
   let tools = menu.items.filter(item => item.label === 'Tools')[0];
diff --git a/packages/desktop-electron/menu.js b/packages/desktop-electron/menu.js
index ff463b5db..f6a23e037 100644
--- a/packages/desktop-electron/menu.js
+++ b/packages/desktop-electron/menu.js
@@ -5,20 +5,6 @@ function getMenu(isDev, createWindow) {
     {
       label: 'File',
       submenu: [
-        // {
-        //   label: 'Start Tutorial',
-        //   enabled: false,
-        //   click(item, focusedWindow) {
-        //     if (
-        //       focusedWindow &&
-        //       focusedWindow.webContents.getTitle() === 'Actual'
-        //     ) {
-        //       focusedWindow.webContents.executeJavaScript(
-        //         '__actionsForMenu.startTutorial()'
-        //       );
-        //     }
-        //   }
-        // },
         {
           label: 'Load Backup...',
           enabled: false,
diff --git a/packages/loot-core/src/client/constants.ts b/packages/loot-core/src/client/constants.ts
index 528d2769c..1fbe8a11a 100644
--- a/packages/loot-core/src/client/constants.ts
+++ b/packages/loot-core/src/client/constants.ts
@@ -36,6 +36,3 @@ export const SET_ACCOUNTS_SYNCING = 'SET_ACCOUNTS_SYNCING';
 export const ACCOUNT_SYNC_STATUS = 'ACCOUNT_SYNC_STATUS';
 export const ACCOUNT_SYNC_FAILURES = 'ACCOUNT_SYNC_FAILURES';
 export const SIGN_OUT = 'SIGN_OUT';
-
-export const SET_TUTORIAL_STAGE = 'SET_TUTORIAL_STAGE';
-export const DEACTIVATE_TUTORIAL = 'DEACTIVATE_TUTORIAL';
diff --git a/packages/loot-core/src/client/reducers/index.ts b/packages/loot-core/src/client/reducers/index.ts
index 1253ce09e..17d0f7529 100644
--- a/packages/loot-core/src/client/reducers/index.ts
+++ b/packages/loot-core/src/client/reducers/index.ts
@@ -7,7 +7,6 @@ import notifications from './notifications';
 import prefs from './prefs';
 import profile from './profile';
 import queries from './queries';
-import tutorial from './tutorial';
 import user from './user';
 
 const reducers = {
@@ -20,7 +19,6 @@ const reducers = {
   modals,
   notifications,
   budgets,
-  tutorial,
   user,
 };
 export default reducers;
diff --git a/packages/loot-core/src/client/reducers/tutorial.ts b/packages/loot-core/src/client/reducers/tutorial.ts
deleted file mode 100644
index ea4bcc757..000000000
--- a/packages/loot-core/src/client/reducers/tutorial.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import * as constants from '../constants';
-
-const initialState = {
-  stage: null,
-  fromYNAB: false,
-};
-
-export default function update(state = initialState, action) {
-  switch (action.type) {
-    case constants.SET_TUTORIAL_STAGE:
-      return {
-        ...state,
-        deactivated: false,
-        stage: action.stage,
-        fromYNAB: 'fromYNAB' in action ? action.fromYNAB : state.fromYNAB,
-      };
-    case constants.DEACTIVATE_TUTORIAL:
-      return { ...state, stage: null };
-    default:
-  }
-
-  return state;
-}
diff --git a/packages/loot-core/src/client/tutorial.ts b/packages/loot-core/src/client/tutorial.ts
deleted file mode 100644
index 96c513a81..000000000
--- a/packages/loot-core/src/client/tutorial.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const stages = {
-  BUDGET: 'budget',
-};
-
-export const order = [stages.BUDGET];
diff --git a/packages/loot-core/src/types/main-handlers.d.ts b/packages/loot-core/src/types/main-handlers.d.ts
index 669d1acbc..79ff5d41d 100644
--- a/packages/loot-core/src/types/main-handlers.d.ts
+++ b/packages/loot-core/src/types/main-handlers.d.ts
@@ -229,7 +229,6 @@ export interface MainHandlers {
 
   'load-global-prefs': () => Promise<{
     floatingSidebar: boolean;
-    seenTutorial: boolean;
     maxMonths: number;
     autoUpdate: boolean;
     documentDir: string;
@@ -303,8 +302,6 @@ export interface MainHandlers {
     testBudgetId?;
   }) => Promise<unknown>;
 
-  'set-tutorial-seen': () => Promise<'ok'>;
-
   'import-budget': (arg: { filepath; type }) => Promise<{ error }>;
 
   'export-budget': () => Promise<unknown>;
diff --git a/upcoming-release-notes/1146.md b/upcoming-release-notes/1146.md
new file mode 100644
index 000000000..9c82768ef
--- /dev/null
+++ b/upcoming-release-notes/1146.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [Shazib]
+---
+
+Remove all legacy 'Tutorial' code
-- 
GitLab