@viveksinghind/narrative-form-native 1.0.2

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -0
  3. package/dist/components/DoneScreen.d.ts +10 -0
  4. package/dist/components/DoneScreen.d.ts.map +1 -0
  5. package/dist/components/DoneScreen.js +33 -0
  6. package/dist/components/DoneScreen.js.map +1 -0
  7. package/dist/components/ErrorMessage.d.ts +8 -0
  8. package/dist/components/ErrorMessage.d.ts.map +1 -0
  9. package/dist/components/ErrorMessage.js +40 -0
  10. package/dist/components/ErrorMessage.js.map +1 -0
  11. package/dist/components/Line.d.ts +21 -0
  12. package/dist/components/Line.d.ts.map +1 -0
  13. package/dist/components/Line.js +130 -0
  14. package/dist/components/Line.js.map +1 -0
  15. package/dist/components/NarrativeForm.d.ts +25 -0
  16. package/dist/components/NarrativeForm.d.ts.map +1 -0
  17. package/dist/components/NarrativeForm.js +113 -0
  18. package/dist/components/NarrativeForm.js.map +1 -0
  19. package/dist/components/ThemeProvider.d.ts +13 -0
  20. package/dist/components/ThemeProvider.d.ts.map +1 -0
  21. package/dist/components/ThemeProvider.js +19 -0
  22. package/dist/components/ThemeProvider.js.map +1 -0
  23. package/dist/components/ToastProvider.d.ts +9 -0
  24. package/dist/components/ToastProvider.d.ts.map +1 -0
  25. package/dist/components/ToastProvider.js +41 -0
  26. package/dist/components/ToastProvider.js.map +1 -0
  27. package/dist/components/WelcomeScreen.d.ts +9 -0
  28. package/dist/components/WelcomeScreen.d.ts.map +1 -0
  29. package/dist/components/WelcomeScreen.js +63 -0
  30. package/dist/components/WelcomeScreen.js.map +1 -0
  31. package/dist/hooks/useDynamicForm.d.ts +18 -0
  32. package/dist/hooks/useDynamicForm.d.ts.map +1 -0
  33. package/dist/hooks/useDynamicForm.js +50 -0
  34. package/dist/hooks/useDynamicForm.js.map +1 -0
  35. package/dist/hooks/useFormState.d.ts +43 -0
  36. package/dist/hooks/useFormState.d.ts.map +1 -0
  37. package/dist/hooks/useFormState.js +57 -0
  38. package/dist/hooks/useFormState.js.map +1 -0
  39. package/dist/hooks/useTypewriter.d.ts +46 -0
  40. package/dist/hooks/useTypewriter.d.ts.map +1 -0
  41. package/dist/hooks/useTypewriter.js +94 -0
  42. package/dist/hooks/useTypewriter.js.map +1 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +10 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/index.mjs +621 -0
  48. package/dist/index.mjs.map +1 -0
  49. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useFormState.ts","../src/hooks/useDynamicForm.ts","../src/components/ThemeProvider.tsx","../src/components/ErrorMessage.tsx","../src/components/Line.tsx","../src/components/ToastProvider.tsx","../src/components/WelcomeScreen.tsx","../src/components/DoneScreen.tsx","../src/components/NarrativeForm.tsx"],"names":["useState","useCallback","useMemo","useRef","useEffect","jsx","Animated","_a","styles","Text","StyleSheet","createContext","useContext","jsxs","View","TouchableOpacity","_b","_c"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * React hook wrapping the core FormStateEngine.\r\n *\r\n * @remarks\r\n * Bridges the framework-agnostic FormStateEngine with React's\r\n * state management. Each state mutation in the engine triggers\r\n * a React re-render via `useSyncExternalStore`-like pattern.\r\n */\r\n\r\nimport { useState, useRef, useCallback, useMemo } from \"react\";\r\nimport type { NarrativeField, NarrativeFieldValues, NarrativeMeta } from \"@viveksinghind/narrative-form-core\";\r\nimport { FormStateEngine } from \"@viveksinghind/narrative-form-core\";\r\nimport type { FieldStatus, FormStateSnapshot } from \"@viveksinghind/narrative-form-core\";\r\n\r\n/** Return value of the useFormState hook. */\r\nexport interface UseFormStateResult {\r\n /** Current snapshot of the form state. */\r\n snapshot: FormStateSnapshot;\r\n /** Start the typewriter animation for a field. */\r\n startTyping: (key: string) => void;\r\n /** Mark a field as active (typewriter done, input visible). */\r\n activateField: (key: string) => void;\r\n /** Confirm a field with a value. */\r\n confirmField: (key: string, value: string | string[]) => void;\r\n /** Reopen a confirmed field for editing. */\r\n editField: (key: string) => void;\r\n /** Re-confirm a field after editing. */\r\n reconfirmField: (key: string, value: string | string[]) => void;\r\n /** Move to the next field. */\r\n next: () => void;\r\n /** Focus a specific field by key. */\r\n focusField: (key: string) => void;\r\n /** Reset all form state. */\r\n reset: () => void;\r\n /** Get all confirmed values. */\r\n getValues: () => NarrativeFieldValues;\r\n /** Get analytics metadata. */\r\n getMeta: (formId?: string, formVersion?: number) => NarrativeMeta;\r\n}\r\n\r\n/**\r\n * React hook that manages the narrative form state.\r\n *\r\n * @param fields - Ordered array of field configurations\r\n * @returns Form state and mutation methods\r\n */\r\nexport function useFormState(fields: readonly NarrativeField[]): UseFormStateResult {\r\n // Use a counter to force re-renders when the engine mutates\r\n const [, setTick] = useState(0);\r\n\r\n const engineRef = useRef<FormStateEngine | null>(null);\r\n\r\n // Lazily initialise the engine\r\n if (engineRef.current === null) {\r\n engineRef.current = new FormStateEngine(fields, () => {\r\n setTick((t) => t + 1);\r\n });\r\n }\r\n\r\n const engine = engineRef.current;\r\n\r\n // Stable method references\r\n const startTyping = useCallback((key: string) => engine.startTyping(key), [engine]);\r\n const activateField = useCallback((key: string) => engine.activateField(key), [engine]);\r\n const confirmField = useCallback(\r\n (key: string, value: string | string[]) => engine.confirmField(key, value),\r\n [engine],\r\n );\r\n const editField = useCallback((key: string) => engine.editField(key), [engine]);\r\n const reconfirmField = useCallback(\r\n (key: string, value: string | string[]) => engine.reconfirmField(key, value),\r\n [engine],\r\n );\r\n const next = useCallback(() => engine.next(), [engine]);\r\n const focusField = useCallback((key: string) => engine.focusField(key), [engine]);\r\n const reset = useCallback(() => engine.reset(), [engine]);\r\n const getValues = useCallback(() => engine.getValues(), [engine]);\r\n const getMeta = useCallback(\r\n (formId?: string, formVersion?: number) => engine.getMeta(formId, formVersion),\r\n [engine],\r\n );\r\n\r\n const snapshot = engine.getSnapshot();\r\n\r\n return useMemo(\r\n () => ({\r\n snapshot,\r\n startTyping,\r\n activateField,\r\n confirmField,\r\n editField,\r\n reconfirmField,\r\n next,\r\n focusField,\r\n reset,\r\n getValues,\r\n getMeta,\r\n }),\r\n // snapshot changes every tick, which is what we want\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [snapshot],\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from \"react\";\r\nimport type { NarrativeFormConfig } from \"@viveksinghind/narrative-form-core\";\r\nimport { fetchFormConfig, ConfigFetchError } from \"@viveksinghind/narrative-form-core\";\r\n\r\nexport interface UseDynamicFormProps {\r\n fieldsUrl?: string;\r\n fieldsUrlHeaders?: Record<string, string>;\r\n formConfig?: NarrativeFormConfig;\r\n onFetchError?: (error: Error) => void;\r\n}\r\n\r\nexport interface UseDynamicFormResult {\r\n config: NarrativeFormConfig | null;\r\n loading: boolean;\r\n error: Error | null;\r\n retry: () => void;\r\n}\r\n\r\n/**\r\n * Hook to manage fetching and parsing server-driven form configuration.\r\n */\r\nexport function useDynamicForm({\r\n fieldsUrl,\r\n fieldsUrlHeaders,\r\n formConfig,\r\n onFetchError,\r\n}: UseDynamicFormProps): UseDynamicFormResult {\r\n const [config, setConfig] = useState<NarrativeFormConfig | null>(formConfig ?? null);\r\n const [loading, setLoading] = useState<boolean>(!!fieldsUrl && !formConfig);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [retryCount, setRetryCount] = useState(0);\r\n\r\n useEffect(() => {\r\n // If a complete config is passed via props, use it immediately\r\n if (formConfig) {\r\n setConfig(formConfig);\r\n setLoading(false);\r\n setError(null);\r\n return;\r\n }\r\n\r\n if (!fieldsUrl) {\r\n return;\r\n }\r\n\r\n let isMounted = true;\r\n setLoading(true);\r\n setError(null);\r\n\r\n fetchFormConfig(fieldsUrl, { headers: fieldsUrlHeaders })\r\n .then((data) => {\r\n if (isMounted) {\r\n setConfig(data);\r\n setLoading(false);\r\n }\r\n })\r\n .catch((err: Error) => {\r\n if (isMounted) {\r\n setError(err);\r\n setLoading(false);\r\n onFetchError?.(err);\r\n }\r\n });\r\n\r\n return () => {\r\n isMounted = false;\r\n };\r\n }, [fieldsUrl, fieldsUrlHeaders, formConfig, retryCount, onFetchError]);\r\n\r\n const retry = useCallback(() => {\r\n if (fieldsUrl && !formConfig) {\r\n setRetryCount((c) => c + 1);\r\n }\r\n }, [fieldsUrl, formConfig]);\r\n\r\n return { config, loading, error, retry };\r\n}\r\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { NarrativeTheme } from \"@viveksinghind/narrative-form-core\";\n\nexport interface ThemeContextValue {\n theme: NarrativeTheme | undefined;\n isDark: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: undefined,\n isDark: false,\n});\n\nexport const useTheme = () => useContext(ThemeContext);\n\nexport interface ThemeProviderProps {\n theme?: NarrativeTheme;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const value = useMemo(() => {\n // In React Native we can check Appearance.getColorScheme() if we want auto dark mode,\n // but for now we just rely on the theme prop.\n return {\n theme,\n isDark: !!theme?.mode && theme.mode === \"dark\",\n };\n }, [theme]);\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n","import React, { useEffect, useRef } from \"react\";\nimport { Animated, Text, StyleSheet } from \"react-native\";\nimport type { NarrativeErrorDisplay } from \"@viveksinghind/narrative-form-core\";\nimport { useTheme } from \"./ThemeProvider\";\n\nexport interface ErrorMessageProps {\n message: string | null;\n config?: NarrativeErrorDisplay;\n}\n\nexport const ErrorMessage: React.FC<ErrorMessageProps> = ({ message, config }) => {\n const { theme } = useTheme();\n const opacity = useRef(new Animated.Value(0)).current;\n const translateY = useRef(new Animated.Value(-10)).current;\n\n useEffect(() => {\n if (message) {\n Animated.parallel([\n Animated.timing(opacity, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(translateY, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n })\n ]).start();\n } else {\n opacity.setValue(0);\n translateY.setValue(-10);\n }\n }, [message, opacity, translateY]);\n\n if (!message) return null;\n\n return (\n <Animated.View style={{ opacity, transform: [{ translateY }] }}>\n <Text style={[styles.errorText, { color: theme?.colors?.error || \"#d32f2f\" }]}>\n {message}\n </Text>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n errorText: {\n fontSize: 14,\n marginTop: 4,\n marginBottom: 8,\n }\n});\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, View, Text, TextInput, TouchableOpacity, StyleSheet, Easing, Keyboard } from \"react-native\";\nimport type { NarrativeField, FieldStatus, NarrativeTypewriter, NarrativeFieldValues } from \"@viveksinghind/narrative-form-core\";\nimport { validateField, validateFieldAsync, hasAsyncValidation } from \"@viveksinghind/narrative-form-core\";\nimport { ErrorMessage } from \"./ErrorMessage\";\nimport { useTheme } from \"./ThemeProvider\";\n\nexport interface LineProps {\n field: NarrativeField;\n status: FieldStatus;\n value: any;\n allValues: NarrativeFieldValues;\n typewriter: NarrativeTypewriter;\n editable: boolean;\n locked: boolean;\n editLabel: string;\n onTypingComplete: (key: string) => void;\n onConfirm: (key: string, value: string) => void;\n onEdit: (key: string) => void;\n onError: (key: string, error: string) => void;\n onChange: (key: string, value: string) => void;\n onFocus: (key: string) => void;\n onBlur: (key: string, value: string) => void;\n}\n\nexport const Line: React.FC<LineProps> = ({\n field,\n status,\n value,\n allValues,\n typewriter,\n editable,\n locked,\n editLabel,\n onTypingComplete,\n onConfirm,\n onEdit,\n onError,\n onChange,\n onFocus,\n onBlur,\n}) => {\n const { theme, isDark } = useTheme();\n \n const [typedPrompt, setTypedPrompt] = useState(\"\");\n const [localValue, setLocalValue] = useState(value ? String(value) : \"\");\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [isValidating, setIsValidating] = useState(false);\n \n const inputRef = useRef<TextInput>(null);\n const opacity = useRef(new Animated.Value(0)).current;\n\n // Fade in on mount\n useEffect(() => {\n Animated.timing(opacity, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }).start();\n }, [opacity]);\n\n // Sync external value\n useEffect(() => {\n if (value !== undefined && String(value) !== localValue) {\n setLocalValue(String(value));\n }\n }, [value]);\n\n // Typewriter effect\n useEffect(() => {\n if (status !== \"typing\") return;\n \n if (!typewriter.enabled) {\n setTypedPrompt(field.prompt);\n onTypingComplete(field.key);\n return;\n }\n\n let i = 0;\n const interval = setInterval(() => {\n setTypedPrompt(field.prompt.slice(0, i + 1));\n i++;\n if (i >= field.prompt.length) {\n clearInterval(interval);\n onTypingComplete(field.key);\n }\n }, typewriter.delayMs ?? 30);\n\n return () => clearInterval(interval);\n }, [status, field.prompt, field.key, typewriter, onTypingComplete]);\n\n // Focus input when active\n useEffect(() => {\n if (status === \"active\" || status === \"editing\") {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 50); // slight delay for layout\n }\n }, [status]);\n\n const handleConfirm = useCallback(async () => {\n // Sync validation\n const syncResult = validateField(field, localValue);\n if (!syncResult.valid) {\n setErrorMsg(syncResult.error || \"Invalid input\");\n onError(field.key, syncResult.error || \"Invalid input\");\n return;\n }\n\n // Async validation\n if (hasAsyncValidation(field)) {\n setIsValidating(true);\n const asyncResult = await validateFieldAsync(field, localValue);\n setIsValidating(false);\n \n if (!asyncResult.valid) {\n setErrorMsg(asyncResult.error || \"Invalid input\");\n onError(field.key, asyncResult.error || \"Invalid input\");\n return;\n }\n }\n\n setErrorMsg(null);\n Keyboard.dismiss();\n onConfirm(field.key, localValue);\n }, [field, localValue, onError, onConfirm]);\n\n const textColor = theme?.colors?.text || (isDark ? \"#fff\" : \"#000\");\n const primaryColor = theme?.colors?.primary || \"#007bff\";\n\n const isConfirmed = status === \"confirmed\";\n const isActive = status === \"active\" || status === \"editing\";\n\n return (\n <Animated.View style={[styles.container, { opacity }]}>\n <View style={styles.promptRow}>\n <Text style={[styles.prompt, { color: textColor }]}>\n {status === \"typing\" ? typedPrompt : field.prompt}\n </Text>\n \n {isConfirmed && (\n <Text style={[styles.value, { color: primaryColor }]}>{localValue}</Text>\n )}\n \n {isConfirmed && editable && !locked && (\n <TouchableOpacity onPress={() => onEdit(field.key)} style={styles.editBtn}>\n <Text style={[styles.editBtnText, { color: primaryColor }]}>{editLabel}</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {isActive && (\n <View style={styles.inputRow}>\n <TextInput\n ref={inputRef}\n style={[\n styles.input,\n { color: textColor, borderBottomColor: isValidating ? \"#ccc\" : primaryColor }\n ]}\n value={localValue}\n onChangeText={(text) => {\n setLocalValue(text);\n onChange(field.key, text);\n if (errorMsg) setErrorMsg(null);\n }}\n onFocus={() => onFocus(field.key)}\n onBlur={() => onBlur(field.key, localValue)}\n onSubmitEditing={handleConfirm}\n keyboardType={field.type === \"email\" ? \"email-address\" : \"default\"}\n secureTextEntry={field.type === \"password\"}\n returnKeyType=\"next\"\n editable={!isValidating}\n />\n </View>\n )}\n \n <ErrorMessage message={errorMsg} />\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginVertical: 12,\n },\n promptRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n },\n prompt: {\n fontSize: 18,\n marginRight: 8,\n },\n value: {\n fontSize: 18,\n fontWeight: \"600\",\n marginRight: 8,\n },\n editBtn: {\n marginLeft: 8,\n paddingHorizontal: 8,\n paddingVertical: 4,\n borderRadius: 4,\n backgroundColor: \"rgba(0,0,0,0.05)\",\n },\n editBtnText: {\n fontSize: 12,\n fontWeight: \"bold\",\n },\n inputRow: {\n marginTop: 8,\n },\n input: {\n fontSize: 18,\n paddingVertical: 8,\n borderBottomWidth: 2,\n }\n});\n","import React, { createContext, useContext, useState, useCallback } from \"react\";\nimport { View, Text, StyleSheet, Animated } from \"react-native\";\n\nexport interface ToastContextValue {\n showToast: (message: string, type?: \"error\" | \"success\" | \"info\") => void;\n}\n\nconst ToastContext = createContext<ToastContextValue>({\n showToast: () => {},\n});\n\nexport const useToast = () => useContext(ToastContext);\n\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [toast, setToast] = useState<{ message: string; type: \"error\" | \"success\" | \"info\" } | null>(null);\n\n const showToast = useCallback((message: string, type: \"error\" | \"success\" | \"info\" = \"info\") => {\n setToast({ message, type });\n setTimeout(() => setToast(null), 3000);\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast }}>\n <View style={styles.container}>\n {children}\n {toast && (\n <View style={[styles.toast, toast.type === \"error\" ? styles.toastError : styles.toastSuccess]}>\n <Text style={styles.toastText}>{toast.message}</Text>\n </View>\n )}\n </View>\n </ToastContext.Provider>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n toast: {\n position: \"absolute\",\n bottom: 40,\n left: 20,\n right: 20,\n padding: 16,\n borderRadius: 8,\n backgroundColor: \"#333\",\n alignItems: \"center\",\n },\n toastError: {\n backgroundColor: \"#d32f2f\",\n },\n toastSuccess: {\n backgroundColor: \"#2e7d32\",\n },\n toastText: {\n color: \"#fff\",\n fontSize: 14,\n },\n});\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Animated, View, Text, TouchableOpacity, StyleSheet } from \"react-native\";\nimport type { NarrativeWelcome, NarrativeTypewriter } from \"@viveksinghind/narrative-form-core\";\nimport { useTheme } from \"./ThemeProvider\";\n\nexport interface WelcomeScreenProps {\n welcome: NarrativeWelcome;\n typewriter: NarrativeTypewriter;\n onStart: () => void;\n}\n\nexport const WelcomeScreen: React.FC<WelcomeScreenProps> = ({ welcome, typewriter, onStart }) => {\n const { theme, isDark } = useTheme();\n const opacity = useRef(new Animated.Value(0)).current;\n const [typedTitle, setTypedTitle] = useState(\"\");\n \n useEffect(() => {\n Animated.timing(opacity, {\n toValue: 1,\n duration: 500,\n useNativeDriver: true,\n }).start();\n }, [opacity]);\n\n useEffect(() => {\n if (!typewriter.enabled) {\n setTypedTitle(welcome.title);\n return;\n }\n\n let i = 0;\n const interval = setInterval(() => {\n setTypedTitle(welcome.title.slice(0, i + 1));\n i++;\n if (i >= welcome.title.length) {\n clearInterval(interval);\n }\n }, typewriter.delayMs ?? 30);\n\n return () => clearInterval(interval);\n }, [welcome.title, typewriter]);\n\n const textColor = theme?.colors?.text || (isDark ? \"#fff\" : \"#000\");\n const primaryColor = theme?.colors?.primary || \"#007bff\";\n\n return (\n <Animated.View style={[styles.container, { opacity }]}>\n <Text style={[styles.title, { color: textColor }]}>{typedTitle}</Text>\n {welcome.subtitle && (\n <Text style={[styles.subtitle, { color: textColor, opacity: 0.7 }]}>{welcome.subtitle}</Text>\n )}\n <TouchableOpacity \n style={[styles.button, { backgroundColor: primaryColor }]} \n onPress={onStart}\n accessibilityRole=\"button\"\n >\n <Text style={styles.buttonText}>{welcome.startLabel || \"Start\"}</Text>\n </TouchableOpacity>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n padding: 20,\n },\n title: {\n fontSize: 28,\n fontWeight: \"bold\",\n marginBottom: 8,\n },\n subtitle: {\n fontSize: 16,\n marginBottom: 24,\n },\n button: {\n paddingHorizontal: 24,\n paddingVertical: 12,\n borderRadius: 8,\n },\n buttonText: {\n color: \"#fff\",\n fontSize: 16,\n fontWeight: \"600\",\n }\n});\n","import React, { useEffect, useRef } from \"react\";\nimport { Animated, View, Text, StyleSheet } from \"react-native\";\nimport type { NarrativeDone, NarrativeFieldValues, NarrativeMeta, NarrativeTypewriter } from \"@viveksinghind/narrative-form-core\";\nimport { useTheme } from \"./ThemeProvider\";\n\nexport interface DoneScreenProps {\n done: NarrativeDone;\n values: NarrativeFieldValues;\n meta: NarrativeMeta;\n typewriter: NarrativeTypewriter;\n}\n\nexport const DoneScreen: React.FC<DoneScreenProps> = ({ done, values, meta }) => {\n const { theme, isDark } = useTheme();\n const opacity = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n Animated.timing(opacity, {\n toValue: 1,\n duration: 500,\n useNativeDriver: true,\n }).start();\n }, [opacity]);\n\n const textColor = theme?.colors?.text || (isDark ? \"#fff\" : \"#000\");\n\n return (\n <Animated.View style={[styles.container, { opacity }]}>\n <Text style={[styles.title, { color: textColor }]}>{done.title}</Text>\n {done.subtitle && (\n <Text style={[styles.subtitle, { color: textColor, opacity: 0.7 }]}>{done.subtitle}</Text>\n )}\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 20,\n marginTop: 20,\n },\n title: {\n fontSize: 24,\n fontWeight: \"bold\",\n marginBottom: 8,\n },\n subtitle: {\n fontSize: 16,\n }\n});\n","import React, { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\nimport { View, StyleSheet, ScrollView } from \"react-native\";\nimport type {\n NarrativeField,\n NarrativeTheme,\n NarrativeTypewriter,\n NarrativeWelcome,\n NarrativeDone,\n NarrativeCallbacks,\n NarrativeFieldValues,\n NarrativeMeta,\n NarrativeRefHandle,\n NarrativeI18n,\n NarrativeFormConfig,\n NarrativeCrossFieldValidator,\n} from \"@viveksinghind/narrative-form-core\";\nimport { mergeStrings } from \"@viveksinghind/narrative-form-core\";\nimport { useFormState } from \"../hooks/useFormState\";\nimport { useDynamicForm } from \"../hooks/useDynamicForm\";\nimport { Line } from \"./Line\";\nimport { ToastProvider } from \"./ToastProvider\";\nimport { ThemeProvider, useTheme } from \"./ThemeProvider\";\nimport { WelcomeScreen } from \"./WelcomeScreen\";\nimport { DoneScreen } from \"./DoneScreen\";\n\nexport interface NarrativeFormProps {\n fields?: NarrativeField[];\n fieldsUrl?: string;\n fieldsUrlHeaders?: Record<string, string>;\n formConfig?: NarrativeFormConfig;\n theme?: NarrativeTheme;\n typewriter?: NarrativeTypewriter;\n welcome?: NarrativeWelcome;\n done?: NarrativeDone;\n editable?: boolean;\n editLabel?: string;\n callbacks?: NarrativeCallbacks;\n formRef?: React.Ref<NarrativeRefHandle>;\n defaultValues?: NarrativeFieldValues;\n values?: NarrativeFieldValues;\n strings?: Partial<NarrativeI18n>;\n locale?: string;\n direction?: \"ltr\" | \"rtl\";\n crossFieldValidators?: NarrativeCrossFieldValidator[];\n reducedMotion?: boolean;\n}\n\nconst NarrativeFormInner: React.FC<NarrativeFormProps> = (props) => {\n const { isDark } = useTheme();\n const i18n = useMemo(() => mergeStrings(props.strings), [props.strings]);\n\n const { config: dynamicConfig, loading, error, retry } =\n useDynamicForm({ fieldsUrl: props.fieldsUrl, fieldsUrlHeaders: props.fieldsUrlHeaders });\n\n const resolvedConfig = useMemo(() => {\n if (props.fields) return { fields: props.fields };\n if (props.formConfig) return props.formConfig;\n if (dynamicConfig) return dynamicConfig;\n return null;\n }, [props.fields, props.formConfig, dynamicConfig]);\n\n const fields = resolvedConfig?.fields ?? [];\n const welcome = props.welcome ?? (resolvedConfig && \"welcome\" in resolvedConfig ? (resolvedConfig as any).welcome : undefined);\n const done = props.done ?? (resolvedConfig && \"done\" in resolvedConfig ? (resolvedConfig as any).done : undefined);\n\n const effectiveTypewriter = useMemo<NarrativeTypewriter>(() => ({\n ...props.typewriter,\n enabled: props.reducedMotion ? false : (props.typewriter?.enabled ?? true),\n }), [props.typewriter, props.reducedMotion]);\n\n const {\n snapshot,\n startTyping,\n activateField,\n confirmField,\n editField,\n reconfirmField,\n next,\n focusField,\n reset,\n getValues,\n getMeta,\n } = useFormState(fields);\n\n const showWelcome = welcome?.show !== false && welcome !== undefined;\n const [welcomeDismissed, setWelcomeDismissed] = useState(!showWelcome);\n \n const hasStartedRef = useRef(false);\n\n useEffect(() => {\n if (!welcomeDismissed || hasStartedRef.current || fields.length === 0) return;\n hasStartedRef.current = true;\n const firstField = fields.find((f) => snapshot.statuses[f.key] !== \"confirmed\");\n if (firstField) {\n startTyping(firstField.key);\n }\n }, [welcomeDismissed, fields, startTyping, snapshot.statuses]);\n\n const handleConfirm = useCallback((key: string, value: string) => {\n const status = snapshot.statuses[key];\n if (status === \"editing\") {\n reconfirmField(key, value);\n } else {\n confirmField(key, value);\n }\n props.callbacks?.onFieldComplete?.(key, value, 0);\n\n const currentIndex = fields.findIndex((f) => f.key === key);\n for (let i = currentIndex + 1; i < fields.length; i++) {\n const nextField = fields[i];\n if (!nextField || snapshot.statuses[nextField.key] === \"confirmed\") continue;\n startTyping(nextField.key);\n break;\n }\n }, [snapshot, fields, confirmField, reconfirmField, startTyping, props.callbacks]);\n\n const visibleFields = useMemo(() => {\n return fields.filter((field) => {\n const status = snapshot.statuses[field.key];\n return status === \"typing\" || status === \"active\" || status === \"confirmed\" || status === \"editing\";\n });\n }, [fields, snapshot.statuses]);\n\n const scrollViewRef = useRef<ScrollView>(null);\n\n useEffect(() => {\n if (visibleFields.length > 0) {\n setTimeout(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, 100);\n }\n }, [visibleFields.length]);\n\n return (\n <ScrollView \n ref={scrollViewRef}\n style={[styles.container, isDark ? styles.darkContainer : styles.lightContainer]}\n contentContainerStyle={styles.content}\n keyboardShouldPersistTaps=\"handled\"\n >\n {!welcomeDismissed && welcome && (\n <WelcomeScreen\n welcome={welcome}\n typewriter={effectiveTypewriter}\n onStart={() => setWelcomeDismissed(true)}\n />\n )}\n\n {welcomeDismissed && (\n <View style={styles.formBody}>\n {visibleFields.map((field) => (\n <Line\n key={field.key}\n field={field}\n status={snapshot.statuses[field.key] ?? \"idle\"}\n value={props.values?.[field.key] ?? snapshot.values[field.key]}\n allValues={snapshot.values}\n typewriter={effectiveTypewriter}\n editable={props.editable ?? true}\n locked={false}\n editLabel={props.editLabel ?? i18n.editLabel}\n onTypingComplete={(k) => activateField(k)}\n onConfirm={handleConfirm}\n onEdit={(k) => {\n editField(k);\n props.callbacks?.onEdit?.(k);\n }}\n onError={(k, err) => props.callbacks?.onError?.(k, err)}\n onChange={(k, v) => props.callbacks?.onChange?.(k, v)}\n onFocus={(k) => props.callbacks?.onFieldFocus?.(k)}\n onBlur={(k, v) => props.callbacks?.onFieldBlur?.(k, v)}\n />\n ))}\n </View>\n )}\n\n {snapshot.isComplete && done && (\n <DoneScreen\n done={done}\n values={snapshot.values}\n meta={getMeta()}\n typewriter={effectiveTypewriter}\n />\n )}\n </ScrollView>\n );\n};\n\nexport const NarrativeForm: React.FC<NarrativeFormProps> = (props) => {\n return (\n <ThemeProvider theme={props.theme}>\n <ToastProvider>\n <NarrativeFormInner {...props} />\n </ToastProvider>\n </ThemeProvider>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n lightContainer: {\n backgroundColor: \"#ffffff\",\n },\n darkContainer: {\n backgroundColor: \"#121212\",\n },\n content: {\n padding: 20,\n flexGrow: 1,\n },\n formBody: {\n flex: 1,\n }\n});\n"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@viveksinghind/narrative-form-native",
3
+ "version": "1.0.2",
4
+ "description": "React Native components for narrative-form — typewriter-style sign-up flow",
5
+ "author": "Vivek Singh <vivekSinghInd>",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "sideEffects": false,
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "require": "./dist/index.js",
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ }
19
+ },
20
+ "dependencies": {
21
+ "@viveksinghind/narrative-form-core": "1.0.2"
22
+ },
23
+ "peerDependencies": {
24
+ "react": ">=17.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^18.3.1",
28
+ "@types/react-native": "0.70.0",
29
+ "rimraf": "^5.0.5",
30
+ "tsup": "^8.0.2",
31
+ "typescript": "^5.4.5"
32
+ },
33
+ "keywords": [
34
+ "react-native",
35
+ "narrative-form",
36
+ "typewriter",
37
+ "form",
38
+ "onboarding",
39
+ "signup",
40
+ "typescript"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/vivekSinghInd/narrative-form.git",
45
+ "directory": "packages/native"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "tsc --watch",
50
+ "typecheck": "tsc --noEmit",
51
+ "clean": "rimraf dist"
52
+ }
53
+ }