Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e9463c5
Fetch orcid, get orcid account id
Aug 19, 2025
f8b10b5
One time donation support scaffolding for ORCIDs
Aug 25, 2025
5dc5686
Ensure serialization of ORCID entity
Aug 25, 2025
c3eb74e
Refine ORCID badge, icon
Aug 25, 2025
5e72087
Initial support for ORCID iDs in list editor; fix circular import of …
Aug 26, 2025
8976c59
Ensure list editor item can render ORCID iD
Aug 26, 2025
58d41d2
Allow csv to theoretically support orcids
Aug 26, 2025
56d5a13
Solve various type errors relating to splits and orcids
Aug 26, 2025
944392c
Allow app host with local development
Aug 26, 2025
639fc2a
blueprints (wip)
efstajas Aug 28, 2025
f0fda88
Adjust e2e temp
Aug 28, 2025
aa1e398
temporarily disable ownership check
efstajas Sep 12, 2025
22ab142
Resolves problems raised during execution of dev environment
Dec 16, 2025
43b0330
Typescript fixes for simple errors
Dec 16, 2025
4e585a6
Fix '$$_tuoyaLpetSwolFenoladnatS0.$$slot_def' is of type 'unknown'
Dec 16, 2025
90f103d
Fix Argument of type '"click"' is not assignable to parameter of type…
Dec 16, 2025
9050366
Resolve remaining typescript errors
Dec 16, 2025
a99a770
Preserve changes from main branch
Dec 17, 2025
f19b71c
Remove duplicate reviver
Dec 17, 2025
d710125
Begin to create blueprint e2e test
Dec 17, 2025
686158c
Create e2e test for blueprint creation
Dec 17, 2025
173961e
Remove commented-out code
Dec 17, 2025
a232a6f
Don't export things that aren't used
Dec 18, 2025
1ce3468
Use blueprint types more consistently, follow existing patterns for s…
Dec 18, 2025
be5a439
Remove previously removed drip list flow step
Dec 18, 2025
ed5e50c
Update src/routes/api/list-blueprints/+server.ts
mhgbrown Dec 18, 2025
f433977
Update src/routes/api/list-blueprints/[blueprintId]/+server.ts
mhgbrown Dec 18, 2025
4397c85
Update src/routes/(pages)/app/(flows)/funder-onboarding/+page.server.ts
mhgbrown Dec 18, 2025
52ec249
Add errors when we encounter them in the blueprint
Dec 18, 2025
b122006
Add errors for invalid blueprint recipients; DRY recipient addition l…
Dec 18, 2025
006ce2c
Fix use of any when adding item during blueprint population
Dec 18, 2025
11d21d8
Merge branch 'main' into jason/blueprints
efstajas Jan 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion src/lib/components/progress-bar/progress-bar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@
progressFn: ProgressFn;
updateFrequencyMs?: number;
errorMessage?: string | undefined;
centeredProgressText?: boolean;
}

let { progressFn, updateFrequencyMs = 10, errorMessage = undefined }: Props = $props();
let {
progressFn,
updateFrequencyMs = 10,
errorMessage = undefined,
centeredProgressText = true,
}: Props = $props();

let interval: ReturnType<typeof setInterval> | undefined = $state();

Expand Down Expand Up @@ -86,13 +92,18 @@
{/if}
</div>
</div>

{#if remainingText || done}
<p
style:margin-top="0.25rem"
style:width="100%"
style:min-height="2rem"
style:display="flex"
style:text-align={centeredProgressText ? 'center' : 'left'}
style:justify-content={centeredProgressText ? 'center' : 'flex-start'}
style:align-items="center"
style:gap="0.125rem"
style:font-feature-settings="'tnum'"
class="typo-text"
style:color={textColor}
transition:slide={{ duration: 300 }}
Expand All @@ -112,7 +123,11 @@

<style>
.progress-bar-wrapper {
min-width: 16rem;
color: var(--color-foreground-level-6);
display: flex;
flex-direction: column;
justify-content: center;
}

.progress-bar-container {
Expand Down
15 changes: 15 additions & 0 deletions src/lib/components/stepper/components/await-step.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import { createEventDispatcher, onMount, type Component } from 'svelte';
import type { UpdateAwaitStepFn } from '../types';
import { isHttpError } from '@sveltejs/kit';
import type { ProgressFn } from '$lib/components/progress-bar/progress-bar.svelte';
import ProgressBar from '$lib/components/progress-bar/progress-bar.svelte';

const dispatch = createEventDispatcher<{ result: Result }>();

Expand All @@ -25,6 +27,12 @@
link?: { url: string; label: string } | undefined;
icon?: { component: Component; props: Record<string, unknown> } | undefined;
promise: (updateFn: UpdateAwaitStepFn) => Promise<unknown>;
progressBar?:
| {
progressFn: ProgressFn;
centeredProgressText?: boolean;
}
| undefined;
}

let {
Expand All @@ -33,6 +41,7 @@
link = $bindable(),
icon = $bindable(),
promise,
progressBar = $bindable(),
}: Props = $props();

const updateFn: UpdateAwaitStepFn = (params) => {
Expand Down Expand Up @@ -87,7 +96,13 @@
{/if}
<p>{message}</p>
{#if subtitle}<p class="subtitle typo-text-small">{subtitle}</p>{/if}

{#if progressBar}
<ProgressBar {...progressBar} />
{/if}

{#if link}
<!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
<a class="typo-link" href={link.url} target="_blank" rel="noreferrer">{link.label}</a>
{/if}
</div>
Expand Down
9 changes: 9 additions & 0 deletions src/lib/components/stepper/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { SendTransactionsResponse } from '@safe-global/safe-apps-sdk';
import type { TransactionLike, TypedDataDomain, TypedDataField } from 'ethers';
import type { TransactionReceipt } from 'ethers';
import type { Component, ComponentProps } from 'svelte';
import type { ProgressFn } from '../progress-bar/progress-bar.svelte';

export type TransactionWrapper = {
title: string;
Expand Down Expand Up @@ -93,6 +94,14 @@ export interface AwaitPendingPayload extends UpdateAwaitStepParams {
* and text displayed on the await step before the promise resolves.
*/
promise: (updateFn: UpdateAwaitStepFn) => Promise<unknown>;
/**
* Optional function to report progress of the awaited promise.
* If provided, a progress bar is shown below the message.
*/
progressBar?: {
progressFn: ProgressFn;
centeredProgressText?: boolean;
};
}

export interface MovePayload {
Expand Down
20 changes: 19 additions & 1 deletion src/lib/flows/create-drip-list-flow/create-drip-list-flow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import type { AddItemError } from '$lib/components/list-editor/errors';
import walletStore from '$lib/stores/wallet/wallet.store';
import dismissablesStore from '$lib/stores/dismissables/dismissables.store';
import DripList from '$lib/components/illustrations/drip-list.svelte';
import type { BlueprintOrBlueprintError } from '../../utils/blueprints/schemas';
import PopulateBlueprint from './steps/populate-blueprint/populate-blueprint.svelte';

export interface State {
dripList: DripListConfig;
Expand Down Expand Up @@ -53,11 +55,27 @@ const staticHeaderComponent = {
},
};

export const steps = (state: Writable<State>, skipWalletConnect = false, isModal = false) => [
export const steps = (
state: Writable<State>,
skipWalletConnect = false,
isModal = false,
blueprintOrBlueprintError: BlueprintOrBlueprintError | undefined,
) => [
...(blueprintOrBlueprintError
? [
makeStep({
component: PopulateBlueprint,
props: {
blueprintOrBlueprintError,
},
}),
]
: []),
makeStep({
component: ChooseCreationMode,
props: {
canCancel: isModal,
blueprintMode: !!blueprintOrBlueprintError,
},
staticHeaderComponent,
}),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
<script lang="ts">
import Stepper from '$lib/components/stepper/stepper.svelte';
import { flowState, steps } from './create-drip-list-flow';
import type { BlueprintOrBlueprintError } from '../../utils/blueprints/schemas';

interface Props {
skipWalletConnect?: boolean;
isModal?: boolean;
displaySlots?: boolean;
blueprintOrBlueprintError: BlueprintOrBlueprintError | undefined;
}

let { skipWalletConnect = false, isModal = false }: Props = $props();
let { skipWalletConnect = false, isModal = false, blueprintOrBlueprintError }: Props = $props();

let currentStepIndex = $state(0);

Expand All @@ -18,6 +21,6 @@
bind:currentStepIndex
on:stepChange={() => window.scrollTo({ top: 0 })}
context={() => myState}
steps={steps(myState, skipWalletConnect, isModal)}
steps={steps(myState, skipWalletConnect, isModal, blueprintOrBlueprintError)}
minHeightPx={128}
/>
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
} from '$lib/flows/import-from-csv/csv-import-helpers';
import importFromCSVSteps from '$lib/flows/import-from-csv/import-from-csv-steps';
import CustodialWarning from '$lib/components/annotation-box/custodial-warning.svelte';
import type { AccountId } from '$lib/utils/common-types';

const dispatch = createEventDispatcher<StepComponentEvents>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@
import TextInput from '$lib/components/text-input/text-input.svelte';
import TextArea from '$lib/components/text-area/text-area.svelte';
import type { TextInputValidationState } from '$lib/components/text-input/text-input';
import AnnotationBox from '$lib/components/annotation-box/annotation-box.svelte';

const dispatch = createEventDispatcher<StepComponentEvents>();

interface Props {
context: Writable<State>;
canCancel?: boolean;
blueprintMode?: boolean;
}

let { context, canCancel = false }: Props = $props();
let { context, canCancel = false, blueprintMode = false }: Props = $props();

let textAreaValidationState: TextInputValidationState = $derived(
!$context.dripList.description
Expand All @@ -46,6 +48,13 @@
headline="Create a Drip List"
description="Choose your new list's name and description, and decide how you'd like to add recipients."
>
{#if blueprintMode}
<AnnotationBox type="info">
You are creating a Drip List based on an externally-created blueprint. You can review the
recipients of your Drip List in the next step.
</AnnotationBox>
{/if}

<FormField title="Title*">
<TextInput bind:value={$context.dripList.title} />
</FormField>
Expand All @@ -57,47 +66,51 @@
validationState={textAreaValidationState}
/>
</FormField>
<FormField title="Recipients*">
<TwoBigOptions
bind:selected={$context.selectedCreationMode}
option1={{
emoji: '🧐',
title: 'Choose by yourself',
attributes: [
{
icon: DripList,
text: 'Decide on recipients yourself',
},
{
icon: TokenStreams,
text: 'Still publicly available for donations',
},
{
icon: Proposals,
text: 'Decide to collaborate anytime later',
},
],
}}
option2={{
emoji: '👪',
title: 'Collaborate on recipients',
attributes: [
{
icon: DripList,
text: 'Invite collaborators to decide together',
},
{
icon: Proposals,
text: 'Set a voting period',
},
{
icon: ArrowUp,
text: 'Publish your list after voting',
},
],
}}
/>
</FormField>

{#if !blueprintMode}
<FormField title="Recipients*">
<TwoBigOptions
bind:selected={$context.selectedCreationMode}
option1={{
emoji: '🧐',
title: 'Choose by yourself',
attributes: [
{
icon: DripList,
text: 'Decide on recipients yourself',
},
{
icon: TokenStreams,
text: 'Still publicly available for donations',
},
{
icon: Proposals,
text: 'Decide to collaborate anytime later',
},
],
}}
option2={{
emoji: '👪',
title: 'Collaborate on recipients',
attributes: [
{
icon: DripList,
text: 'Invite collaborators to decide together',
},
{
icon: Proposals,
text: 'Set a voting period',
},
{
icon: ArrowUp,
text: 'Publish your list after voting',
},
],
}}
/>
</FormField>
{/if}

{#snippet actions()}
{#if canCancel}
<Button onclick={() => dispatch('conclude')} variant="ghost">Cancel</Button>
Expand Down
Loading