From a5a3abdaea9e723b077d7b37acfe688dd8bd0770 Mon Sep 17 00:00:00 2001 From: Miciah Henderson <48624788+kiahjh@users.noreply.github.com> Date: Wed, 6 Dec 2023 11:38:48 -0500 Subject: [PATCH 1/2] appviews: designed new error screen for when app is launched outside applications dir --- appviews/src/Onboarding/Onboarding.tsx | 4 +++ appviews/src/Onboarding/StepSwitcher.tsx | 1 + .../Steps/AppNotInApplicationsDir.tsx | 26 +++++++++++++++++++ appviews/src/Onboarding/Steps/index.ts | 1 + appviews/src/Onboarding/onboarding-store.ts | 1 + .../src/macos-app/Onboarding.stories.tsx | 5 ++++ .../macos-app/OnboardingStatefulSwitcher.tsx | 7 +++++ 7 files changed, 45 insertions(+) create mode 100644 appviews/src/Onboarding/Steps/AppNotInApplicationsDir.tsx diff --git a/appviews/src/Onboarding/Onboarding.tsx b/appviews/src/Onboarding/Onboarding.tsx index 590f6156..e4f12129 100644 --- a/appviews/src/Onboarding/Onboarding.tsx +++ b/appviews/src/Onboarding/Onboarding.tsx @@ -41,6 +41,10 @@ export const Onboarding: React.FC = ({ > } /> + } + /> } diff --git a/appviews/src/Onboarding/StepSwitcher.tsx b/appviews/src/Onboarding/StepSwitcher.tsx index 500de1f0..e4814552 100644 --- a/appviews/src/Onboarding/StepSwitcher.tsx +++ b/appviews/src/Onboarding/StepSwitcher.tsx @@ -16,6 +16,7 @@ const StepSwitcher: React.FC = ({ children, ready }) => { const progressStep = (() => { switch (currentStep) { case `welcome`: + case `appNotInApplicationsDir`: case `confirmGertrudeAccount`: case `noGertrudeAccount`: return 1; diff --git a/appviews/src/Onboarding/Steps/AppNotInApplicationsDir.tsx b/appviews/src/Onboarding/Steps/AppNotInApplicationsDir.tsx new file mode 100644 index 00000000..154b0806 --- /dev/null +++ b/appviews/src/Onboarding/Steps/AppNotInApplicationsDir.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import ExpandableContent from '../ExpandableContent'; +import * as Onboarding from '../UtilityComponents'; + +const AppNotInApplicationsDir: React.FC = () => ( + +
+ + Hmm, something's not quite right... + + + Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore + culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim + cupidatat excepteur officia. + + Quit Gertrude +
+ +
+); + +export default AppNotInApplicationsDir; diff --git a/appviews/src/Onboarding/Steps/index.ts b/appviews/src/Onboarding/Steps/index.ts index b6f08ed9..bec03df4 100644 --- a/appviews/src/Onboarding/Steps/index.ts +++ b/appviews/src/Onboarding/Steps/index.ts @@ -1,4 +1,5 @@ export { default as Welcome } from './Welcome'; +export { default as AppNotInApplicationsDir } from './AppNotInApplicationsDir'; export { default as ConfirmGertrudeAccount } from './ConfirmGertrudeAccount'; export { default as GetConnectionCode } from './GetConnectionCode'; export { default as NoGertrudeAccount } from './NoGertrudeAccount'; diff --git a/appviews/src/Onboarding/onboarding-store.ts b/appviews/src/Onboarding/onboarding-store.ts index 53e39185..fbe7c797 100644 --- a/appviews/src/Onboarding/onboarding-store.ts +++ b/appviews/src/Onboarding/onboarding-store.ts @@ -10,6 +10,7 @@ export type RequestState = // begin codegen export type OnboardingStep = | 'welcome' + | 'appNotInApplicationsDir' | 'confirmGertrudeAccount' | 'noGertrudeAccount' | 'macosUserAccountType' diff --git a/storybook/src/macos-app/Onboarding.stories.tsx b/storybook/src/macos-app/Onboarding.stories.tsx index 260f07d6..0a3ac682 100644 --- a/storybook/src/macos-app/Onboarding.stories.tsx +++ b/storybook/src/macos-app/Onboarding.stories.tsx @@ -27,6 +27,11 @@ export const Welcome: Story = props({ receivedAppState: true, }); +export const AppNotInApplicationsDir: Story = props({ + ...Welcome.args, + step: `appNotInApplicationsDir`, +}); + export const ConfirmGertrudeAcct: Story = props({ ...Welcome.args, step: `confirmGertrudeAccount`, diff --git a/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx b/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx index 3a9c0fdd..5797c5e6 100644 --- a/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx +++ b/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx @@ -18,6 +18,9 @@ const OnboardingStatefulSwitcher: React.FC = () => { case `welcome`: setTimeout(() => setStep(`confirmGertrudeAccount`), 1000); // this is handled in the component, but need to simulate it here break; + case `appNotInApplicationsDir`: + setStep(`confirmGertrudeAccount`); + break; case `confirmGertrudeAccount`: setStep(`noGertrudeAccount`); break; @@ -95,6 +98,10 @@ const OnboardingStatefulSwitcher: React.FC = () => { > } /> + } + /> } From d2170ad871f852eb7d4670814db68d6d2ff8fe2e Mon Sep 17 00:00:00 2001 From: Miciah Henderson <48624788+kiahjh@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:06:21 -0500 Subject: [PATCH 2/2] appview: made page for exempting other users --- .../screens/ExemptUsersScreen.tsx | 33 +++++++++++------ appviews/src/Onboarding/Onboarding.tsx | 2 + appviews/src/Onboarding/OnboardingContext.ts | 10 ++++- appviews/src/Onboarding/Steps/ExemptUsers.tsx | 37 +++++++++++++++++++ appviews/src/Onboarding/Steps/index.ts | 1 + appviews/src/Onboarding/onboarding-store.ts | 1 + .../src/macos-app/Onboarding.stories.tsx | 6 +++ .../macos-app/OnboardingStatefulSwitcher.tsx | 4 ++ 8 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 appviews/src/Onboarding/Steps/ExemptUsers.tsx diff --git a/appviews/src/Administrate/screens/ExemptUsersScreen.tsx b/appviews/src/Administrate/screens/ExemptUsersScreen.tsx index 66dd0a7e..810f754f 100644 --- a/appviews/src/Administrate/screens/ExemptUsersScreen.tsx +++ b/appviews/src/Administrate/screens/ExemptUsersScreen.tsx @@ -62,10 +62,11 @@ const ExemptUsersScreen: React.FC = ({ users, emit }) => {
    {users.value.map((user) => ( - emit({ case: `setUserExemption`, @@ -93,31 +94,41 @@ const ExemptUsersScreen: React.FC = ({ users, emit }) => { ); }; -interface UserProps { +interface ExemptUserProps { name: string; isExempt: boolean; onToggle(): unknown; + isAdmin?: boolean; } -const User: React.FC = ({ name, isExempt, onToggle }) => ( +export const ExemptUser: React.FC = ({ + name, + isExempt, + isAdmin, + onToggle, +}) => (
    -
    -

    {name}

    - +
    +
    +

    {name}

    + {isAdmin && ( + + admin + + )} +
    + {isExempt ? `exempt from filtering - unrestricted internet access` : ``}
    diff --git a/appviews/src/Onboarding/Onboarding.tsx b/appviews/src/Onboarding/Onboarding.tsx index e4f12129..c4181e47 100644 --- a/appviews/src/Onboarding/Onboarding.tsx +++ b/appviews/src/Onboarding/Onboarding.tsx @@ -37,6 +37,7 @@ export const Onboarding: React.FC = ({ os === `venturaOrLater` ? `System Settings` : `System Preferences`, emit, dispatch, + otherUsers: users.filter((user) => user.id !== currentUser?.id), }} > @@ -134,6 +135,7 @@ export const Onboarding: React.FC = ({ component={} confetti /> + } /> } /> } /> } /> diff --git a/appviews/src/Onboarding/OnboardingContext.ts b/appviews/src/Onboarding/OnboardingContext.ts index 4de9edd9..72461eca 100644 --- a/appviews/src/Onboarding/OnboardingContext.ts +++ b/appviews/src/Onboarding/OnboardingContext.ts @@ -1,13 +1,21 @@ import { createContext } from 'react'; -import type { AppEvent, OnboardingStep, OSGroup, ViewAction } from './onboarding-store'; +import type { + AppEvent, + MacOSUser, + OnboardingStep, + OSGroup, + ViewAction, +} from './onboarding-store'; const OnboardingContext = createContext<{ + otherUsers: MacOSUser[]; currentStep: OnboardingStep; os: OSGroup; systemSettingsName: string; emit(event: AppEvent): unknown; dispatch(event: ViewAction): unknown; }>({ + otherUsers: [], currentStep: `welcome`, os: `venturaOrLater`, systemSettingsName: `System Settings`, diff --git a/appviews/src/Onboarding/Steps/ExemptUsers.tsx b/appviews/src/Onboarding/Steps/ExemptUsers.tsx new file mode 100644 index 00000000..d444a76b --- /dev/null +++ b/appviews/src/Onboarding/Steps/ExemptUsers.tsx @@ -0,0 +1,37 @@ +import { inflect } from '@shared/string'; +import React, { useContext } from 'react'; +import { ExemptUser } from '../../Administrate/screens/ExemptUsersScreen'; +import OnboardingContext from '../OnboardingContext'; +import * as Onboarding from '../UtilityComponents'; + +const ExemptUsers: React.FC = () => { + const { otherUsers } = useContext(OnboardingContext); + return ( + + Grant other users internet access + + For safety, Gertrude will block all internet access for other users unless you + explicitly exempt them from filtering. You have {otherUsers.length} other{` `} + {inflect(`user`, otherUsers.length)} on this computer; if you want them to have + access to the internet, click the corresponding checkbox below. Make sure your + child doesn't know the password for these unpretected users. + +
    + {otherUsers.map((user) => ( + alert(`TODO`)} + isAdmin={user.isAdmin} + /> + ))} +
    + + Continue + + +
    + ); +}; + +export default ExemptUsers; diff --git a/appviews/src/Onboarding/Steps/index.ts b/appviews/src/Onboarding/Steps/index.ts index bec03df4..39ea7589 100644 --- a/appviews/src/Onboarding/Steps/index.ts +++ b/appviews/src/Onboarding/Steps/index.ts @@ -9,6 +9,7 @@ export { default as AllowScreenshots } from './AllowScreenshots'; export { default as AllowNotifications } from './AllowNotifications'; export { default as AllowKeylogging } from './AllowKeylogging'; export { default as InstallSysExt } from './InstallSysExt'; +export { default as ExemptUsers } from './ExemptUsers'; export { default as LocateMenuBarIcon } from './LocateMenuBarIcon'; export { default as ViewHealthCheck } from './ViewHealthCheck'; export { default as HowToUseGertrude } from './HowToUseGertrude'; diff --git a/appviews/src/Onboarding/onboarding-store.ts b/appviews/src/Onboarding/onboarding-store.ts index fbe7c797..e12ce6fa 100644 --- a/appviews/src/Onboarding/onboarding-store.ts +++ b/appviews/src/Onboarding/onboarding-store.ts @@ -30,6 +30,7 @@ export type OnboardingStep = | 'installSysExt_allow' | 'installSysExt_failed' | 'installSysExt_success' + | 'exemptUsers' | 'locateMenuBarIcon' | 'viewHealthCheck' | 'howToUseGertrude' diff --git a/storybook/src/macos-app/Onboarding.stories.tsx b/storybook/src/macos-app/Onboarding.stories.tsx index 0a3ac682..8fa0f6a1 100644 --- a/storybook/src/macos-app/Onboarding.stories.tsx +++ b/storybook/src/macos-app/Onboarding.stories.tsx @@ -19,6 +19,7 @@ export const Welcome: Story = props({ keyloggingPermissionGranted: false, currentUser: { id: 502, name: `Suzy`, isAdmin: false }, users: [ + { id: 503, name: `Little Jimmy`, isAdmin: false }, { id: 501, name: `Bob McParent`, isAdmin: true }, { id: 502, name: `Suzy`, isAdmin: false }, ], @@ -186,6 +187,11 @@ export const InstallSysExtSuccess: Story = props({ step: `installSysExt_success`, }); +export const ExemptUsers: Story = props({ + ...Welcome.args, + step: `exemptUsers`, +}); + export const LocateMenuBarIcon: Story = props({ ...Welcome.args, step: `locateMenuBarIcon`, diff --git a/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx b/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx index 5797c5e6..25a893bb 100644 --- a/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx +++ b/storybook/src/macos-app/OnboardingStatefulSwitcher.tsx @@ -79,6 +79,9 @@ const OnboardingStatefulSwitcher: React.FC = () => { setStep(`installSysExt_success`); break; case `installSysExt_success`: + setStep(`exemptUsers`); + break; + case `exemptUsers`: setStep(`locateMenuBarIcon`); break; case `locateMenuBarIcon`: @@ -193,6 +196,7 @@ const OnboardingStatefulSwitcher: React.FC = () => { component={} confetti /> + } /> } /> } /> } />