Adding api automation workflow

This commit is contained in:
blaisadmin
2026-05-01 00:14:17 -04:00
parent 45fd507eeb
commit 5a3ca9021a
2 changed files with 279 additions and 14 deletions
+185 -12
View File
@@ -194,12 +194,21 @@ type MemorializeBirdFormState = {
notifyOnMemorialDay: boolean;
};
type RescueOnboardingFormState = {
name: string;
city: string;
state: string;
ein: string;
website: string;
};
type WorkspaceFormState = {
name: string;
workspaceType: WorkspaceType;
billingEmail: string;
billingPlan: HouseholdBillingPlan;
billingInterval: BillingInterval;
rescueOnboarding: RescueOnboardingFormState;
};
type WorkspaceMemberFormState = {
@@ -214,6 +223,7 @@ type WorkspaceCreateFormState = {
billingEmail: string;
billingPlan: HouseholdBillingPlan;
billingInterval: BillingInterval;
rescueOnboarding: RescueOnboardingFormState;
};
type AuthFormState = {
@@ -320,12 +330,21 @@ const emptyMemorializeBirdForm = (): MemorializeBirdFormState => ({
notifyOnMemorialDay: false,
});
const emptyRescueOnboardingForm = (): RescueOnboardingFormState => ({
name: '',
city: '',
state: '',
ein: '',
website: '',
});
const emptyWorkspaceForm: WorkspaceFormState = {
name: 'My Flock',
workspaceType: 'standard',
billingEmail: '',
billingPlan: 'household_basic',
billingInterval: 'monthly',
rescueOnboarding: emptyRescueOnboardingForm(),
};
const emptyWorkspaceMemberForm: WorkspaceMemberFormState = {
@@ -340,6 +359,7 @@ const emptyWorkspaceCreateForm: WorkspaceCreateFormState = {
billingEmail: '',
billingPlan: 'household_basic',
billingInterval: 'monthly',
rescueOnboarding: emptyRescueOnboardingForm(),
};
const emptyAuthForm: AuthFormState = {
@@ -1594,6 +1614,7 @@ function App() {
billingEmail: session.activeWorkspace.billingEmail ?? '',
billingPlan: isHouseholdPlan(session.activeWorkspace.billingPlan) ? session.activeWorkspace.billingPlan : 'household_basic',
billingInterval: session.activeWorkspace.billingInterval,
rescueOnboarding: emptyRescueOnboardingForm(),
});
setWorkspaceCreateForm((current) => ({
...current,
@@ -2250,6 +2271,7 @@ function App() {
billingEmail: workspaceCreateForm.billingEmail,
billingPlan: workspaceCreateForm.workspaceType === 'rescue' ? undefined : workspaceCreateForm.billingPlan,
billingInterval: workspaceCreateForm.workspaceType === 'rescue' ? undefined : workspaceCreateForm.billingInterval,
rescueOnboarding: workspaceCreateForm.workspaceType === 'rescue' ? workspaceCreateForm.rescueOnboarding : undefined,
}),
});
@@ -3123,6 +3145,7 @@ function App() {
...workspaceForm,
billingPlan: workspaceForm.workspaceType === 'rescue' ? undefined : workspaceForm.billingPlan,
billingInterval: workspaceForm.workspaceType === 'rescue' ? undefined : workspaceForm.billingInterval,
rescueOnboarding: workspace?.workspaceType === 'standard' && workspaceForm.workspaceType === 'rescue' ? workspaceForm.rescueOnboarding : undefined,
}),
});
@@ -3156,6 +3179,7 @@ function App() {
billingEmail: savedWorkspace.billingEmail ?? '',
billingPlan: isHouseholdPlan(savedWorkspace.billingPlan) ? savedWorkspace.billingPlan : 'household_basic',
billingInterval: savedWorkspace.billingInterval,
rescueOnboarding: emptyRescueOnboardingForm(),
});
return savedWorkspace;
@@ -3259,6 +3283,7 @@ function App() {
billingEmail: savedWorkspace.billingEmail ?? '',
billingPlan: isHouseholdPlan(savedWorkspace.billingPlan) ? savedWorkspace.billingPlan : 'household_basic',
billingInterval: savedWorkspace.billingInterval,
rescueOnboarding: emptyRescueOnboardingForm(),
});
} catch (workspaceError) {
setError(workspaceError instanceof Error ? workspaceError.message : 'Unable to cancel rescue status request.');
@@ -4547,12 +4572,20 @@ function App() {
Flock type
<select
value={workspaceForm.workspaceType}
onChange={(event) =>
onChange={(event) => {
const workspaceType = event.target.value as WorkspaceFormState['workspaceType'];
setWorkspaceForm({
...workspaceForm,
workspaceType: event.target.value as WorkspaceFormState['workspaceType'],
})
}
workspaceType,
rescueOnboarding:
workspaceType === 'rescue'
? {
...workspaceForm.rescueOnboarding,
name: workspaceForm.rescueOnboarding.name || workspaceForm.name,
}
: workspaceForm.rescueOnboarding,
});
}}
>
<option value="standard">Standard household</option>
<option value="rescue">Rescue</option>
@@ -4567,6 +4600,72 @@ function App() {
</span>
</article>
) : null}
{workspace?.workspaceType === 'standard' && workspaceForm.workspaceType === 'rescue' ? (
<section className="settings-nested-card">
<h3>Rescue onboarding</h3>
<label>
Rescue Name
<input
value={workspaceForm.rescueOnboarding.name}
onChange={(event) =>
setWorkspaceForm({
...workspaceForm,
rescueOnboarding: { ...workspaceForm.rescueOnboarding, name: event.target.value },
})
}
/>
</label>
<label>
City
<input
value={workspaceForm.rescueOnboarding.city}
onChange={(event) =>
setWorkspaceForm({
...workspaceForm,
rescueOnboarding: { ...workspaceForm.rescueOnboarding, city: event.target.value },
})
}
/>
</label>
<label>
State
<input
value={workspaceForm.rescueOnboarding.state}
onChange={(event) =>
setWorkspaceForm({
...workspaceForm,
rescueOnboarding: { ...workspaceForm.rescueOnboarding, state: event.target.value },
})
}
/>
</label>
<label>
EIN
<input
value={workspaceForm.rescueOnboarding.ein}
onChange={(event) =>
setWorkspaceForm({
...workspaceForm,
rescueOnboarding: { ...workspaceForm.rescueOnboarding, ein: event.target.value },
})
}
/>
</label>
<label>
Website
<input
type="url"
value={workspaceForm.rescueOnboarding.website}
onChange={(event) =>
setWorkspaceForm({
...workspaceForm,
rescueOnboarding: { ...workspaceForm.rescueOnboarding, website: event.target.value },
})
}
/>
</label>
</section>
) : null}
{workspaceForm.workspaceType === 'rescue' ? (
<article className="summary-card">
<strong>{formatBillingPlanName('rescue_free')}</strong>
@@ -4958,12 +5057,20 @@ function App() {
Flock type
<select
value={workspaceCreateForm.workspaceType}
onChange={(event) =>
onChange={(event) => {
const workspaceType = event.target.value as WorkspaceCreateFormState['workspaceType'];
setWorkspaceCreateForm({
...workspaceCreateForm,
workspaceType: event.target.value as WorkspaceCreateFormState['workspaceType'],
})
}
workspaceType,
rescueOnboarding:
workspaceType === 'rescue'
? {
...workspaceCreateForm.rescueOnboarding,
name: workspaceCreateForm.rescueOnboarding.name || workspaceCreateForm.name,
}
: workspaceCreateForm.rescueOnboarding,
});
}}
>
<option value="standard">Standard household</option>
<option value="rescue">Rescue</option>
@@ -5011,10 +5118,76 @@ function App() {
</article>
</>
) : (
<article className="summary-card">
<strong>{formatBillingPlanName('rescue_free')}</strong>
<span>No billing is applied to rescue flocks.</span>
</article>
<>
<section className="settings-nested-card">
<h3>Rescue onboarding</h3>
<label>
Rescue Name
<input
value={workspaceCreateForm.rescueOnboarding.name}
onChange={(event) =>
setWorkspaceCreateForm({
...workspaceCreateForm,
rescueOnboarding: { ...workspaceCreateForm.rescueOnboarding, name: event.target.value },
})
}
/>
</label>
<label>
City
<input
value={workspaceCreateForm.rescueOnboarding.city}
onChange={(event) =>
setWorkspaceCreateForm({
...workspaceCreateForm,
rescueOnboarding: { ...workspaceCreateForm.rescueOnboarding, city: event.target.value },
})
}
/>
</label>
<label>
State
<input
value={workspaceCreateForm.rescueOnboarding.state}
onChange={(event) =>
setWorkspaceCreateForm({
...workspaceCreateForm,
rescueOnboarding: { ...workspaceCreateForm.rescueOnboarding, state: event.target.value },
})
}
/>
</label>
<label>
EIN
<input
value={workspaceCreateForm.rescueOnboarding.ein}
onChange={(event) =>
setWorkspaceCreateForm({
...workspaceCreateForm,
rescueOnboarding: { ...workspaceCreateForm.rescueOnboarding, ein: event.target.value },
})
}
/>
</label>
<label>
Website
<input
type="url"
value={workspaceCreateForm.rescueOnboarding.website}
onChange={(event) =>
setWorkspaceCreateForm({
...workspaceCreateForm,
rescueOnboarding: { ...workspaceCreateForm.rescueOnboarding, website: event.target.value },
})
}
/>
</label>
</section>
<article className="summary-card">
<strong>{formatBillingPlanName('rescue_free')}</strong>
<span>No billing is applied to rescue flocks.</span>
</article>
</>
)}
<label>
Billing contact email