{"version":3,"names":["defineAnimation","withTiming","ColorProperties","processColor","resolvePath","obj","path","keys","Array","isArray","reduce","acc","current","undefined","setPath","value","currObj","i","length","withStyleAnimation","styleAnimations","onFrame","animation","now","stillGoing","entriesToCheck","currentEntry","pop","index","push","concat","key","Object","currentStyleAnimation","finished","callback","includes","onStart","previousAnimation","prevAnimation","prevVal","console","warn","join","currentAnimation","duration","animationsToCheck","element","values","isHigherOrder"],"sources":["styleAnimation.ts"],"sourcesContent":["'use strict';\nimport { defineAnimation } from './util';\nimport type {\n  Timestamp,\n  AnimatableValue,\n  AnimationObject,\n  Animation,\n  NestedObject,\n  NestedObjectValues,\n} from '../commonTypes';\nimport type { AnimatedStyle } from '../helperTypes';\nimport type { StyleLayoutAnimation } from './commonTypes';\nimport { withTiming } from './timing';\nimport { ColorProperties, processColor } from '../Colors';\n\n// resolves path to value for nested objects\n// if path cannot be resolved returns undefined\nfunction resolvePath<T>(\n  obj: NestedObject<T>,\n  path: AnimatableValue[] | AnimatableValue\n): NestedObjectValues<T> | undefined {\n  'worklet';\n  const keys: AnimatableValue[] = Array.isArray(path) ? path : [path];\n  return keys.reduce<NestedObjectValues<T> | undefined>((acc, current) => {\n    if (Array.isArray(acc) && typeof current === 'number') {\n      return acc[current];\n    } else if (\n      acc !== null &&\n      typeof acc === 'object' &&\n      (current as number | string) in acc\n    ) {\n      return (acc as { [key: string]: NestedObjectValues<T> })[\n        current as number | string\n      ];\n    }\n    return undefined;\n  }, obj);\n}\n\n// set value at given path\ntype Path = Array<string | number> | string | number;\nfunction setPath<T>(\n  obj: NestedObject<T>,\n  path: Path,\n  value: NestedObjectValues<T>\n): void {\n  'worklet';\n  const keys: Path = Array.isArray(path) ? path : [path];\n  let currObj: NestedObjectValues<T> = obj;\n  for (let i = 0; i < keys.length - 1; i++) {\n    // creates entry if there isn't one\n    currObj = currObj as { [key: string]: NestedObjectValues<T> };\n    if (!(keys[i] in currObj)) {\n      // if next key is a number create an array\n      if (typeof keys[i + 1] === 'number') {\n        currObj[keys[i]] = [];\n      } else {\n        currObj[keys[i]] = {};\n      }\n    }\n    currObj = currObj[keys[i]];\n  }\n\n  (currObj as { [key: string]: NestedObjectValues<T> })[keys[keys.length - 1]] =\n    value;\n}\n\ninterface NestedObjectEntry<T> {\n  value: NestedObjectValues<T>;\n  path: (string | number)[];\n}\n\nexport function withStyleAnimation(\n  styleAnimations: AnimatedStyle<any>\n): StyleLayoutAnimation {\n  'worklet';\n  return defineAnimation<StyleLayoutAnimation>({}, () => {\n    'worklet';\n\n    const onFrame = (\n      animation: StyleLayoutAnimation,\n      now: Timestamp\n    ): boolean => {\n      let stillGoing = false;\n      const entriesToCheck: NestedObjectEntry<AnimationObject>[] = [\n        { value: animation.styleAnimations, path: [] },\n      ];\n      while (entriesToCheck.length > 0) {\n        const currentEntry: NestedObjectEntry<AnimationObject> =\n          entriesToCheck.pop() as NestedObjectEntry<AnimationObject>;\n        if (Array.isArray(currentEntry.value)) {\n          for (let index = 0; index < currentEntry.value.length; index++) {\n            entriesToCheck.push({\n              value: currentEntry.value[index],\n              path: currentEntry.path.concat(index),\n            });\n          }\n        } else if (\n          typeof currentEntry.value === 'object' &&\n          currentEntry.value.onFrame === undefined\n        ) {\n          // nested object\n          for (const key of Object.keys(currentEntry.value)) {\n            entriesToCheck.push({\n              value: currentEntry.value[key],\n              path: currentEntry.path.concat(key),\n            });\n          }\n        } else {\n          const currentStyleAnimation: AnimationObject =\n            currentEntry.value as AnimationObject;\n          if (currentStyleAnimation.finished) {\n            continue;\n          }\n          const finished = currentStyleAnimation.onFrame(\n            currentStyleAnimation,\n            now\n          );\n          if (finished) {\n            currentStyleAnimation.finished = true;\n            if (currentStyleAnimation.callback) {\n              currentStyleAnimation.callback(true);\n            }\n          } else {\n            stillGoing = true;\n          }\n\n          if (ColorProperties.includes(currentEntry.path[0] as string)) {\n            currentStyleAnimation.current = processColor(\n              currentStyleAnimation.current\n            ) as number;\n          }\n\n          setPath(\n            animation.current,\n            currentEntry.path,\n            currentStyleAnimation.current\n          );\n        }\n      }\n      return !stillGoing;\n    };\n\n    const onStart = (\n      animation: StyleLayoutAnimation,\n      value: AnimatedStyle<any>,\n      now: Timestamp,\n      previousAnimation: StyleLayoutAnimation\n    ): void => {\n      const entriesToCheck: NestedObjectEntry<\n        AnimationObject | AnimatableValue\n      >[] = [{ value: styleAnimations, path: [] }];\n      while (entriesToCheck.length > 0) {\n        const currentEntry: NestedObjectEntry<\n          AnimationObject | AnimatableValue\n        > = entriesToCheck.pop() as NestedObjectEntry<\n          AnimationObject | AnimatableValue\n        >;\n        if (Array.isArray(currentEntry.value)) {\n          for (let index = 0; index < currentEntry.value.length; index++) {\n            entriesToCheck.push({\n              value: currentEntry.value[index],\n              path: currentEntry.path.concat(index),\n            });\n          }\n        } else if (\n          typeof currentEntry.value === 'object' &&\n          currentEntry.value.onStart === undefined\n        ) {\n          for (const key of Object.keys(currentEntry.value)) {\n            entriesToCheck.push({\n              value: currentEntry.value[key],\n              path: currentEntry.path.concat(key),\n            });\n          }\n        } else {\n          const prevAnimation = resolvePath(\n            previousAnimation?.styleAnimations,\n            currentEntry.path\n          );\n          let prevVal = resolvePath(value, currentEntry.path);\n          if (prevAnimation && !prevVal) {\n            prevVal = (prevAnimation as any).current;\n          }\n          if (prevVal === undefined) {\n            console.warn(\n              `Initial values for animation are missing for property ${currentEntry.path.join(\n                '.'\n              )}`\n            );\n          }\n          setPath(animation.current, currentEntry.path, prevVal);\n          let currentAnimation: AnimationObject;\n          if (\n            typeof currentEntry.value !== 'object' ||\n            !currentEntry.value.onStart\n          ) {\n            currentAnimation = withTiming(\n              currentEntry.value as AnimatableValue,\n              { duration: 0 }\n            ) as AnimationObject; // TODO TYPESCRIPT this temporary cast is to get rid of .d.ts file.\n            setPath(\n              animation.styleAnimations,\n              currentEntry.path,\n              currentAnimation\n            );\n          } else {\n            currentAnimation = currentEntry.value as Animation<AnimationObject>;\n          }\n          currentAnimation.onStart(\n            currentAnimation,\n            prevVal,\n            now,\n            prevAnimation\n          );\n        }\n      }\n    };\n\n    const callback = (finished: boolean): void => {\n      if (!finished) {\n        const animationsToCheck: NestedObjectValues<AnimationObject>[] = [\n          styleAnimations,\n        ];\n        while (animationsToCheck.length > 0) {\n          const currentAnimation: NestedObjectValues<AnimationObject> =\n            animationsToCheck.pop() as NestedObjectValues<AnimationObject>;\n          if (Array.isArray(currentAnimation)) {\n            for (const element of currentAnimation) {\n              animationsToCheck.push(element);\n            }\n          } else if (\n            typeof currentAnimation === 'object' &&\n            currentAnimation.onStart === undefined\n          ) {\n            for (const value of Object.values(currentAnimation)) {\n              animationsToCheck.push(value);\n            }\n          } else {\n            const currentStyleAnimation: AnimationObject =\n              currentAnimation as AnimationObject;\n            if (\n              !currentStyleAnimation.finished &&\n              currentStyleAnimation.callback\n            ) {\n              currentStyleAnimation.callback(false);\n            }\n          }\n        }\n      }\n    };\n\n    return {\n      isHigherOrder: true,\n      onFrame,\n      onStart,\n      current: {},\n      styleAnimations,\n      callback,\n    } as StyleLayoutAnimation;\n  });\n}\n"],"mappings":"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"}