@picked/svelte 0.0.7-next.2 → 0.0.7

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.
@@ -5,12 +5,11 @@ interface GetFormOptions {
5
5
  onSuccess?: () => void | Promise<void>;
6
6
  onError?: (errors: ValidationError[]) => void | Promise<void>;
7
7
  }
8
- type SubmitEventWithCurrentTarget = SubmitEvent & {
9
- currentTarget: EventTarget & HTMLFormElement;
10
- };
11
- export declare function getForm({ id, title, onError, onSuccess }: GetFormOptions): {
8
+ export declare function getForm(options: GetFormOptions): {
12
9
  form: {
13
- onsubmit: import('effector').EventCallable<SubmitEventWithCurrentTarget>;
10
+ onsubmit: (event: SubmitEvent & {
11
+ currentTarget: EventTarget & HTMLFormElement;
12
+ }) => Promise<void>;
14
13
  };
15
14
  };
16
15
  export {};
@@ -1 +1 @@
1
- import{createEvent as g,createEffect as f,sample as A,split as _}from"effector";import{getPicked as x}from"../hooks/client.js";import"svelte";import"@picked/client";import"svelte/store";function E({id:c,title:m,onError:u,onSuccess:l}){const s=x(),p=g(),d=f(a=>s.responses.commit(a)),v=f(()=>{s.eventBus({type:"form_submit_success",form:{id:c,title:m}}),l==null||l()}),h=f(({errors:a})=>{s.eventBus({type:"form_submit_error",form:{id:c,title:m},exception:"Form validation error"}),a.forEach(i=>{s.eventBus({type:"field_validation_error",exception:i})}),u==null||u([])});return A({clock:p,source:{fields:s.fields.listStore},fn:({fields:a},i)=>{i.preventDefault();const y=new FormData(i.currentTarget),n={data:{},push(r){const t=r.questionId,e=this.data[t];e?Array.isArray(e)&&Array.isArray(r.value)?Array.isArray(e)&&Array.isArray(r.value)&&(typeof e[0]=="string"?this.data[t]=[...e,...r.value].map(String):typeof e[0]=="number"?this.data[t]=[...e,...r.value].map(Number):typeof e[0]=="boolean"?this.data[t]=[...e,...r.value].map(o=>!!o):this.data[t]=r.value):this.data[t]=r.value:this.data[t]=r.value}};for(const[r,t]of y.entries()){const e=a.find(b=>b.id===r);if(!e)continue;const o=e.id;switch(e.type){case"text":n.push({questionId:o,value:e.multiple?[String(t)]:String(t)});break;case"number":n.push({questionId:o,value:e.multiple?[Number(t)]:Number(t)});break;case"boolean":n.push({questionId:o,value:e.multiple?[t==="true"]:t==="true"});break}}return n.data},target:d}),_({source:d.doneData,match:{hasErrors:({errors:a})=>a.length>0},cases:{hasErrors:h,__:v}}),{form:{onsubmit:p}}}export{E as getForm};
1
+ import{getPicked as v,getExperience as y}from"../hooks/client.js";import"svelte";import"effector";import"svelte/store";import"@picked/client";function B(a){const s=v();y();const{id:n,title:o}=a;async function d(c){var f,m;c.preventDefault(),s.eventBus({type:"form_submit",form:{id:n,title:o}});const p=new FormData(c.currentTarget),i={data:{},push(t){const r=t.questionId,e=this.data[r];e?Array.isArray(e)&&Array.isArray(t.value)?Array.isArray(e)&&Array.isArray(t.value)&&(typeof e[0]=="string"?this.data[r]=[...e,...t.value].map(String):typeof e[0]=="number"?this.data[r]=[...e,...t.value].map(Number):typeof e[0]=="boolean"?this.data[r]=[...e,...t.value].map(u=>!!u):this.data[r]=t.value):this.data[r]=t.value:this.data[r]=t.value}};for(const[t,r]of p.entries()){const e=s.fields.getById(t).getState();if(!e)continue;const u=e.id;switch(e.type){case"text":i.push({questionId:u,value:e.multiple?[String(r)]:String(r)});break;case"number":i.push({questionId:u,value:e.multiple?[Number(r)]:Number(r)});break;case"boolean":i.push({questionId:u,value:e.multiple?[r==="true"]:r==="true"});break}}const{errors:l}=await s.responses.commit(i.data);if(l.length>0){s.eventBus({type:"form_submit_error",form:{id:n,title:o},exception:"Form validation error"}),l.forEach(t=>{s.eventBus({type:"field_validation_error",exception:t})}),await((f=a.onError)==null?void 0:f.call(a,l));return}s.eventBus({type:"form_submit_success",form:{id:n,title:o}}),await((m=a.onSuccess)==null?void 0:m.call(a))}return{form:{onsubmit:d}}}export{B as getForm};
@@ -1,17 +1,16 @@
1
1
  import { Store } from 'effector';
2
+ import { Readable } from 'svelte/store';
2
3
  import { Field, Response } from '@picked/client';
3
- import { Step } from '../router/context';
4
- type FieldWithValue = Field & {
5
- value: Response | undefined;
6
- };
7
- type StepWithLabel = Step & {
8
- label?: string;
9
- };
10
4
  export interface StepContext {
11
- step: Store<StepWithLabel>;
12
- fields: Store<FieldWithValue[]>;
13
- isActiveStep: Store<boolean>;
5
+ step: Store<{
6
+ id: string;
7
+ label: string;
8
+ }>;
9
+ fields: Store<{
10
+ field: Field | undefined;
11
+ value: Response | undefined;
12
+ }[]>;
13
+ isActiveStep?: Readable<boolean>;
14
14
  }
15
15
  export declare function getStep(): StepContext;
16
16
  export declare function setStepContext(stepId: string): StepContext;
17
- export {};
@@ -1 +1 @@
1
- import{getContext as v,setContext as E}from"svelte";import{createStore as h,combine as a,attach as w,createEffect as C,sample as l}from"effector";import{getStepFields as A}from"@picked/client";import{STEP_CONTEXT_KEY as d}from"../context.js";import{getStepRouter as F}from"../router/context.js";import{getExperience as T,getPicked as P}from"./client.js";function N(){return v(d)}function O(o){const u=T(),i=P(),{activeStep:m}=F(),n=m.map(e=>(e==null?void 0:e.id)===o),s=u.treeStore.map(e=>{const t=e.steps.find(r=>r.id===o);if(!t)throw new Error(`Step with id "${o}" not found in the experience tree.`);return t}),c=h([]),S=a({fields:c,responses:i.responses.listStore},({fields:e,responses:t})=>e.map(r=>{var f;const g=(f=t.find(x=>x.fieldId===r.id))==null?void 0:f.value;return{...r,value:g}})),p=w({source:a({step:s,fields:i.fields.listStore}),effect:C(async({step:{fieldIds:e},fields:t})=>await A(i,t.filter(r=>e.includes(r.id))))});return l({source:{isActiveStep:n},filter:({isActiveStep:e})=>e,target:p}),l({source:p.doneData,target:c}),E(d,{step:s,fields:S,isActiveStep:n})}export{N as getStep,O as setStepContext};
1
+ import{getContext as g,setContext as C}from"svelte";import{combine as E}from"effector";import{derived as b}from"svelte/store";import{STEP_CONTEXT_KEY as f}from"../context.js";import{getStepRouter as h}from"../router/context.js";import{getExperience as w,getPicked as T}from"./client.js";function K(){return g(f)}function N(r){const l=w(),n=T(),{activeStep:s}=h(),m=s?b(s,e=>(e==null?void 0:e.id)===r):void 0,p=E({tree:l.treeStore,fields:n.fields.listStore,responses:n.responses.listStore},({tree:e,fields:c,responses:u})=>{const t=e.steps.find(o=>o.id===r);if(!t)throw new Error(`Step with id "${r}" not found in the experience tree.`);const x=t.fieldIds.map(o=>{var d;const a=c.find(i=>i.id===o),S=(d=u.find(i=>i.fieldId===o))==null?void 0:d.value;return{field:a,value:S}});return{step:{id:t.id,label:t.label},fields:x}});return C(f,{step:p.map(e=>e.step),fields:p.map(e=>e.fields),isActiveStep:m})}export{K as getStep,N as setStepContext};
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { createEvent, createStore, sample } from 'effector'
2
+ import { writable } from 'svelte/store'
3
3
  import { supportsWindow } from '@picked/client'
4
4
  import { getExperience } from '../hooks'
5
5
  import { setStepRouter, type Step } from './context'
@@ -8,22 +8,9 @@
8
8
 
9
9
  const { currentStepStore } = experience
10
10
 
11
- const activeStepStore = createStore<Step | null>(null)
11
+ const activeStep = writable<Step | null>(null)
12
12
  let hasActiveStep = false
13
- const stepsStore = createStore<Step[]>([])
14
-
15
- const registerStepEvent = createEvent<Step>()
16
- const unregisterStepEvent = createEvent<Step>()
17
- const setActiveStepEvent = createEvent<Step | null>()
18
-
19
- stepsStore.on(registerStepEvent, (state, step) => [...state, step])
20
- stepsStore.on(unregisterStepEvent, (state, step) => state.filter((s) => s !== step))
21
-
22
- sample({
23
- source: setActiveStepEvent,
24
- filter: (step) => step !== null,
25
- target: activeStepStore,
26
- })
13
+ const steps = writable<Step[]>([])
27
14
 
28
15
  const registerStep = (step: Step) => {
29
16
  // todo: getIsSSR context
@@ -34,32 +21,32 @@
34
21
  // we just skip them.
35
22
  if (hasActiveStep) return
36
23
 
37
- const isMatchingStep = step.id === currentStepStore.getState()?.id
24
+ const isMatchingStep = step.id === $currentStepStore?.id
38
25
 
39
26
  if (isMatchingStep) {
40
- setActiveStepEvent(step)
27
+ activeStep.set(step)
41
28
  hasActiveStep = true
42
29
  }
43
30
  } else {
44
- registerStepEvent(step)
31
+ steps.update((steps) => [...steps, step])
45
32
  }
46
33
  }
47
34
 
48
35
  const unregisterStep = (step: Step) => {
49
- unregisterStepEvent(step)
36
+ steps.update((st) => st.filter((s) => s !== step))
50
37
  }
51
38
 
52
- sample({
53
- source: { steps: stepsStore, currentStep: currentStepStore },
54
- fn: ({ steps, currentStep }) => steps.find((s) => s.id === currentStep?.id) || null,
55
- target: setActiveStepEvent,
56
- })
39
+ $: {
40
+ activeStep.set($steps.find((s) => s.id === $currentStepStore?.id) || null)
41
+ }
57
42
 
58
43
  setStepRouter({
59
44
  registerStep,
60
45
  unregisterStep,
61
- activeStep: activeStepStore.map((val) => val),
46
+ activeStep,
62
47
  })
63
48
  </script>
64
49
 
65
- <slot />
50
+ {#if $currentStepStore?.id}
51
+ <slot />
52
+ {/if}
@@ -1,9 +1,9 @@
1
- import { Store } from 'effector';
1
+ import { Writable } from 'svelte/store';
2
2
  export interface Step {
3
3
  id: string;
4
4
  }
5
5
  interface ContextOptions {
6
- activeStep: Store<Step | null>;
6
+ activeStep?: Writable<Step | null>;
7
7
  unregisterStep: (step: Step) => void;
8
8
  registerStep: (step: Step) => void;
9
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@picked/svelte",
3
- "version": "0.0.7-next.2",
3
+ "version": "0.0.7",
4
4
  "dependencies": {
5
5
  "d3": "^7.9.0"
6
6
  },
@@ -70,7 +70,7 @@
70
70
  ],
71
71
  "module": "./dist/index.js",
72
72
  "peerDependencies": {
73
- "@picked/client": "0.0.7-next.2",
73
+ "@picked/client": "0.0.7",
74
74
  "effector": "^23.3.0",
75
75
  "svelte": "^5.34.3"
76
76
  },