@api-client/ui 0.6.4 → 0.6.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityManager.js","sourceRoot":"","sources":["../../../src/core/ActivityManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Activity } from './Activity.js'\nimport type { Application } from './Application.js'\nimport { navigateScreen } from './ApplicationRoute.js'\n\nexport enum ActivityLifecycle {\n /**\n * The activity is initialized, but not yet created.\n * This is the initial state of the activity.\n */\n Initialized,\n /**\n * The activity is created, but not yet started.\n * This is the state after the `onCreate()` method is called.\n */\n Created,\n /**\n * The activity is started, but not yet resumed.\n * This is the state after the `onStart()` method is called.\n */\n Started,\n /**\n * The activity is resumed and visible to the user.\n * This is the state after the `onResume()` method is called.\n */\n Resumed,\n /**\n * The activity is paused, but still visible to the user.\n * This is the state after the `onPause()` method is called.\n */\n Paused,\n /**\n * The activity is stopped and no longer visible to the user.\n * This is the state after the `onStop()` method is called.\n */\n Stopped,\n /**\n * The activity is destroyed and no longer exists.\n * This is the state after the `onDestroy()` method is called.\n */\n Destroyed,\n}\n\nexport enum IntentFlags {\n /**\n * Marks that the activity should be rendered as a modal.\n */\n Modal = 1 << 0,\n /**\n * The activity is started for result.\n */\n ForResult = 1 << 1,\n /**\n * When set, the intent data is passed by reference.\n * By default the activity manager makes a copy of the intent data.\n * This is useful when the data is large and you want to avoid copying it\n * or when you want to share the same data between activities.\n */\n ByReference = 1 << 2,\n}\n\nexport interface Intent<T = unknown> {\n action: string\n data?: T\n category?: string[]\n flags?: number\n /**\n * The request code used to distinguish between different activities.\n */\n requestCode?: number\n}\n\nexport enum IntentResult {\n RESULT_CANCELED,\n RESULT_OK,\n}\n\n/**\n * Defines the information stored for each activity on the stack:\n * the Activity instance, a unique id, and optionally the Intent that started the activity\n * (useful for restoring state).\n */\ninterface ActivityStackEntry {\n /**\n * The instance of the activity.\n */\n activity: Activity\n /**\n * Activity's unique ID.\n */\n id: string\n /**\n * The intent that started the activity.\n */\n intent: Intent\n /**\n * The action name the activity is registered for.\n */\n action: string\n}\n\n/**\n * Type for activity constructor with static action property.\n */\nexport interface ActivityConstructor {\n new (parent: Application): Activity\n action?: string\n}\n\n/**\n * Enhanced activity registration options.\n */\nexport interface ActivityRegistrationOptions {\n /** Whether to override existing registrations */\n override?: boolean\n /** Optional validation function for intents */\n validateIntent?: (intent: Intent) => boolean\n}\n\n/**\n * Manages application activities.\n *\n * An activity is a screen or a portion of a rendered screen that has its own\n * lifecycle methods and routing.\n *\n * An activity is registered by its class definition. Because of that, activities\n * cannot have constructors that require own parameters. Activities have to be\n * self contained or use the event system to request data.\n */\nexport class ActivityManager {\n private currentActivity?: Activity\n\n /**\n * Stores activity *classes* by unique ID (action name).\n */\n private activityClasses = new Map<string, typeof Activity>()\n\n /**\n * Represents the activity stack. It is used to manage\n * the UI state after calling the back action.\n */\n private activityStack: ActivityStackEntry[] = []\n\n /**\n * A stack of activities that are rendered over other activities\n * in a dialog.\n */\n private modalActivityStack: ActivityStackEntry[] = []\n\n private generateActivityId(): string {\n return Math.random().toString(36).substring(2, 15)\n }\n\n #parent: Application\n\n constructor(parent: Application) {\n this.#parent = parent\n // this.reflectEvent = this.reflectEvent.bind(this)\n }\n\n /**\n * Registers an activity class with enhanced options.\n * @param action The action name to register the activity for.\n * @param activityClass The activity class constructor.\n * @param options Optional registration configuration.\n */\n registerActivity(\n action: string,\n activityClass: ActivityConstructor,\n options: ActivityRegistrationOptions = {}\n ): void {\n const { override = false } = options\n\n if (this.activityClasses.has(action) && !override) {\n // eslint-disable-next-line no-console\n console.warn(`Activity with action \"${action}\" already registered.`, new Error().stack)\n return\n }\n\n // Validate that the class extends Activity\n if (typeof activityClass !== 'function') {\n throw new Error(`Invalid activity class for action \"${action}\": must be a constructor function`)\n }\n\n this.activityClasses.set(action, activityClass as typeof Activity)\n }\n\n // protected reflectEvent<T extends Event>(event: T): T {\n // const copy = Reflect.construct(event.constructor, [event.type, event])\n // const dispatched = this.#parent.events.dispatchEvent(copy)\n // if (!dispatched) {\n // event.preventDefault()\n // }\n // return copy\n // }\n\n /**\n * Creates an activity and pushes it into the stack, but it does not initialize any of the lifecycle methods.\n * It is a way to put an activity at some place of the stack,\n * but it will be only initialized when other activities finis.\n *\n * Note, if you add an uninitialized activity and you won't add more activities then this activity may never run.\n * Make sure that there's always another activity.\n *\n * @param intent The intent that created this activity.\n */\n async createActivity(intent: Intent): Promise<void> {\n const activity = this.buildActivity(intent)\n const activityId = this.generateActivityId()\n const stackEntry: ActivityStackEntry = { activity, id: activityId, intent, action: intent.action }\n this.activityStack.push(stackEntry)\n }\n\n setupRoute(intent: Intent): void {\n if (intent.data) {\n const typed = intent.data as { uri?: string }\n if (typed.uri) {\n navigateScreen(typed.uri)\n }\n }\n }\n\n /**\n * Starts a new activity and brings it to the foreground.\n *\n * @param intent The intent that created this activity.\n */\n async startActivity(intent: Intent): Promise<void> {\n const { currentActivity, activityStack } = this\n const lastIndex = activityStack.findLastIndex((entry) => entry.action === intent.action)\n // if the activity is in the history list, we bring it up and update intent.\n if (lastIndex > -1) {\n const info = activityStack[lastIndex]\n activityStack.splice(lastIndex, 1)\n activityStack.push({\n id: info.id,\n activity: info.activity,\n action: info.action,\n intent,\n })\n await info.activity.onNewIntent(intent)\n // TODO: Check if the activity is destroyed.\n this.setupRoute(intent)\n await this.updateCurrentActivity(info.activity, false)\n return\n }\n const activity = this.buildActivity(intent)\n if (currentActivity) {\n await currentActivity.onPause()\n currentActivity.lifecycle = ActivityLifecycle.Paused\n }\n\n const activityId = this.generateActivityId()\n const stackEntry: ActivityStackEntry = { activity, id: activityId, intent, action: intent.action }\n // Modal activities are pretty much the same as regular activities but are rendered on top\n // of other activities. We keep track of them on another stack as all modal activities must\n // finish before returning to the regular stack.\n const isModal = (intent.flags ?? 0) & IntentFlags.Modal\n if (isModal) {\n this.modalActivityStack.push(stackEntry)\n } else {\n this.activityStack.push(stackEntry)\n }\n await activity.onCreate(intent)\n if (this.isDestroyed(activity)) {\n // the activity finished and the manager already took care of this situation.\n return\n }\n activity.lifecycle = ActivityLifecycle.Created\n\n await this.updateCurrentActivity(activity, !!isModal)\n if (this.isDestroyed(activity)) {\n // the activity finished and the manager already took care of this situation.\n return\n }\n this.setupRoute(intent)\n }\n\n private buildActivity(intent: Intent): Activity {\n const action = intent.action\n if (!this.activityClasses.has(action)) {\n throw new Error(`No activity class registered for action: ${action}`)\n }\n\n const ActivityClass = this.activityClasses.get(action)\n if (!ActivityClass) {\n throw new Error(`No activity class registered for action: ${action}`)\n }\n\n // We use the container to resolve dependencies, if any.\n // const activity = (await container.make(ActivityClass, [this.#parent])) as Activity\n return new ActivityClass(this.#parent)\n }\n\n /**\n * Starts an activity that should return a result to the calling activity.\n * The result should be a unique number across the application.\n * @param intent The intent to start the activity.\n * @param requestCode The request code used to match the activity result.\n */\n async startActivityForResult(intent: Intent, requestCode: number): Promise<void> {\n intent.requestCode = requestCode\n const byReference = (intent.flags ?? 0) & IntentFlags.ByReference\n const shallowCopy = { ...intent }\n const data = shallowCopy.data\n if (byReference) {\n delete shallowCopy.data\n }\n const deepCopy = structuredClone(shallowCopy)\n if (data && byReference) {\n deepCopy.data = data\n }\n if (deepCopy.flags) {\n deepCopy.flags = deepCopy.flags | IntentFlags.ForResult\n } else {\n deepCopy.flags = IntentFlags.ForResult\n }\n await this.startActivity(deepCopy)\n }\n\n isDestroyed(activity: Activity): boolean {\n return activity.lifecycle === ActivityLifecycle.Destroyed\n }\n\n /**\n * @param activity The activity to finish.\n */\n async finishActivity(activity: Activity): Promise<void> {\n this.setupStyles(undefined, activity)\n const isModal = this.modalActivityStack.some((entry) => entry.activity === activity)\n const stack = isModal ? this.modalActivityStack : this.activityStack\n const index = stack.findIndex((entry) => entry.activity === activity)\n if (index !== -1) {\n const stackEntry = stack.splice(index, 1)[0]\n\n await stackEntry.activity.onPause()\n stackEntry.activity.lifecycle = ActivityLifecycle.Paused\n await stackEntry.activity.onStop()\n stackEntry.activity.lifecycle = ActivityLifecycle.Stopped\n await stackEntry.activity.onDestroy()\n stackEntry.activity.lifecycle = ActivityLifecycle.Destroyed\n\n // Clean up resources to prevent memory leaks\n this.cleanupActivity(stackEntry.activity)\n\n await this.manageActivityResult(stackEntry.activity, stackEntry.intent)\n\n // Resume the previous activity\n await this.bringLastActivityToFront()\n } else {\n if (activity.lifecycle === ActivityLifecycle.Created) {\n await activity.onStop()\n activity.lifecycle = ActivityLifecycle.Stopped\n }\n await activity.onDestroy()\n activity.lifecycle = ActivityLifecycle.Destroyed\n // This can happen when an activity finishes in one of the callback methods,\n // before it is added to the stack. In that case, we bring the last activity back to the front.\n await this.bringLastActivityToFront()\n }\n this.#parent.requestUpdate()\n }\n\n private async manageActivityResult(activity: Activity, intent: Intent): Promise<void> {\n const { flags = 0, requestCode = -1 } = intent\n if (flags & IntentFlags.ForResult) {\n const all = [...this.activityStack, ...this.modalActivityStack]\n const target = all.find((entry) => entry.activity.hasRequestCode(requestCode))\n if (target) {\n if (target.activity.lifecycle === ActivityLifecycle.Destroyed) {\n return\n }\n if (target.activity.lifecycle === ActivityLifecycle.Resumed) {\n await target.activity.onPause()\n target.activity.lifecycle = ActivityLifecycle.Paused\n }\n // Let's create a shallow copy of the intent. We can disregard the ByReference flag here,\n // as we override the data with the result data.\n const intentCopy = { ...intent }\n intentCopy.data = activity.getResult()\n await target.activity.onActivityResult(requestCode, activity.resultCode, intentCopy)\n }\n }\n }\n\n private async bringLastActivityToFront(): Promise<void> {\n if (this.modalActivityStack.length > 0) {\n const previousEntry = this.modalActivityStack[this.activityStack.length - 1]\n await this.updateCurrentActivity(previousEntry.activity, false, previousEntry.intent)\n } else if (this.activityStack.length > 0) {\n const previousEntry = this.activityStack[this.activityStack.length - 1]\n await this.updateCurrentActivity(previousEntry.activity, false, previousEntry.intent)\n } else {\n this.currentActivity = undefined // No more activities\n }\n }\n\n getTopActivity(): Activity | undefined {\n const topModal = this.modalActivityStack.findLast((a) => a.activity.lifecycle === ActivityLifecycle.Resumed)\n if (topModal) {\n return topModal.activity\n }\n const top = this.activityStack.findLast((a) => a.activity.lifecycle === ActivityLifecycle.Resumed)\n return top ? top.activity : undefined\n }\n\n getCurrentActivity(): Activity | undefined {\n return this.currentActivity\n }\n\n /**\n * Sets the styles for the current activity.\n * This method adds or removes CSS classes based on the activity's class name\n * and action, allowing for dynamic styling based on the active activity.\n * @param activity The activity to set styles for.\n * If not provided, it will not set any styles.\n * If the activity is the same as the current one, it does nothing.\n */\n setupStyles(activity?: Activity, oldActivity?: Activity): void {\n if (activity === oldActivity) {\n return\n }\n const root = document?.documentElement\n if (!root) {\n return\n }\n if (oldActivity) {\n const ctor = oldActivity.constructor as typeof Activity\n root.classList.remove(ctor.name.toLowerCase())\n if (ctor.action) {\n root.classList.remove(ctor.action.replace(/\\//g, '-'))\n }\n }\n if (activity) {\n const ctor = activity.constructor as typeof Activity\n root.classList.add(ctor.name.toLowerCase())\n if (ctor.action) {\n root.classList.add(ctor.action.replace(/\\//g, '-'))\n }\n }\n }\n\n /**\n * A helper method to handle the transition between activities, ensuring\n * lifecycle methods are called in the correct order (pause the previous activity,\n * then start/resume the new one). This centralizes lifecycle management.\n *\n * @param activity The activity to bring to the foreground.\n */\n private async updateCurrentActivity(activity: Activity, isModal: boolean, intent?: Intent): Promise<void> {\n this.setupStyles(activity, this.currentActivity)\n if (\n this.currentActivity &&\n this.currentActivity !== activity &&\n this.currentActivity.lifecycle !== ActivityLifecycle.Destroyed &&\n // Make sure we don't pause the current activity if it's already paused.\n this.currentActivity.lifecycle !== ActivityLifecycle.Paused\n ) {\n await this.currentActivity.onPause()\n this.currentActivity.lifecycle = ActivityLifecycle.Paused\n }\n switch (activity.lifecycle) {\n case ActivityLifecycle.Paused:\n if (!(await this.transitionStartedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Stopped:\n await this.safeExecuteLifecycleMethod(() => activity.onRestart(), activity, 'onRestart')\n activity.lifecycle = ActivityLifecycle.Resumed\n break\n\n case ActivityLifecycle.Destroyed:\n throw new Error(`Invalid state. The activity is already destroyed.`)\n\n case ActivityLifecycle.Created:\n if (!(await this.transitionCreatedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Started:\n if (!(await this.transitionStartedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Initialized:\n if (!(await this.transitionInitializedToResumed(activity, intent))) {\n return\n }\n break\n }\n if (!isModal) {\n // With a modal activity, it renders directly to the `<body>` and renders outside\n // of the normal rendering flow. We keep the previous activity rendered.\n this.currentActivity = activity\n }\n }\n\n /**\n * Safely executes an async lifecycle method with error handling.\n * @param lifecycleMethod The lifecycle method to execute.\n * @param activity The activity instance.\n * @param methodName The name of the method for error reporting.\n * @returns Promise that resolves when the method completes or rejects with wrapped error.\n */\n private async safeExecuteLifecycleMethod(\n lifecycleMethod: () => void | Promise<void>,\n activity: Activity,\n methodName: string\n ): Promise<void> {\n try {\n await lifecycleMethod()\n } catch (error) {\n const activityName = activity.constructor.name\n const wrappedError = new Error(\n `Error in ${activityName}.${methodName}(): ${error instanceof Error ? error.message : String(error)}`\n )\n wrappedError.cause = error\n // Allow the activity to handle its own errors, but still propagate\n this.#parent.dispatchEvent(\n new CustomEvent('activity-lifecycle-error', {\n detail: { activity, methodName, error: wrappedError },\n })\n )\n throw wrappedError\n }\n }\n\n /**\n * Allows navigating back through the activity stack.\n * Call `ActivityManager.navigateBack()` when the user performs a back action\n * (e.g., clicks a back button).\n * @returns Promise that resolves to true if navigation was successful, false if at root.\n */\n async navigateBack(): Promise<boolean> {\n // Handle modal activities first\n if (this.modalActivityStack.length > 0) {\n const topModal = this.modalActivityStack[this.modalActivityStack.length - 1]\n await this.finishActivity(topModal.activity)\n return true\n }\n\n // Handle regular activities\n if (this.activityStack.length > 1 && this.currentActivity) {\n await this.finishActivity(this.currentActivity)\n return true\n }\n\n // At root, cannot navigate back\n return false\n }\n\n /**\n * Navigates to a specific activity in the stack, clearing activities above it.\n * @param action The action of the activity to navigate to.\n * @returns Promise that resolves to true if navigation was successful.\n */\n async navigateToActivity(action: string): Promise<boolean> {\n const index = this.activityStack.findIndex((entry) => entry.action === action)\n if (index === -1) {\n return false\n }\n\n // Finish all activities above the target\n const activitiesToFinish = this.activityStack.slice(index + 1)\n for (const entry of activitiesToFinish) {\n await this.finishActivity(entry.activity)\n }\n\n // Bring the target activity to the front\n const targetEntry = this.activityStack[index]\n await this.updateCurrentActivity(targetEntry.activity, false, targetEntry.intent)\n return true\n }\n\n /**\n * Clears the entire activity stack and starts a new root activity.\n * @param intent The intent for the new root activity.\n */\n async clearStackAndStart(intent: Intent): Promise<void> {\n // Finish all activities\n const allActivities = [...this.activityStack, ...this.modalActivityStack]\n for (const entry of allActivities) {\n if (entry.activity.lifecycle !== ActivityLifecycle.Destroyed) {\n await this.finishActivity(entry.activity)\n }\n }\n\n // Clear stacks\n this.activityStack.length = 0\n this.modalActivityStack.length = 0\n this.currentActivity = undefined\n\n // Start new root activity\n await this.startActivity(intent)\n }\n\n /**\n * Creates an intent with better type safety and validation.\n * @param action The action name.\n * @param data Optional intent data.\n * @param options Optional intent configuration.\n * @returns A properly formed intent.\n */\n createIntent<T = unknown>(\n action: string,\n data?: T,\n options: {\n category?: string[]\n flags?: number\n requestCode?: number\n } = {}\n ): Intent<T> {\n if (!this.isActionRegistered(action)) {\n throw new Error(`Cannot create intent for unregistered action: ${action}`)\n }\n\n return {\n action,\n data,\n ...options,\n }\n }\n\n createRequestCode(): number {\n const min = 1000\n const max = 9999\n return Math.floor(Math.random() * (max - min) + min)\n }\n\n findActiveActivity(action: string): Activity | undefined {\n return this.activityStack.find((entry) => entry.action === action)?.activity\n }\n\n /**\n * Transitions an activity from Created to Resumed state.\n * @param activity The activity to transition.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionCreatedToResumed(activity: Activity): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onStart(), activity, 'onStart')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Started\n\n await this.safeExecuteLifecycleMethod(() => activity.onResume(), activity, 'onResume')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Resumed\n activity.requestUpdate()\n return true\n }\n\n /**\n * Transitions an activity from Started to Resumed state.\n * @param activity The activity to transition.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionStartedToResumed(activity: Activity): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onResume(), activity, 'onResume')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Resumed\n activity.requestUpdate()\n return true\n }\n\n /**\n * Transitions an activity from Initialized to Resumed state.\n * @param activity The activity to transition.\n * @param intent The intent used to create the activity.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionInitializedToResumed(activity: Activity, intent?: Intent): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onCreate(intent), activity, 'onCreate')\n activity.lifecycle = ActivityLifecycle.Created\n if (this.isDestroyed(activity)) {\n return false\n }\n\n return await this.transitionCreatedToResumed(activity)\n }\n\n /**\n * Cleans up resources for destroyed activities to prevent memory leaks.\n * @param activity The activity to clean up.\n */\n private cleanupActivity(activity: Activity): void {\n // Remove any event listeners that might create memory leaks\n // This changes the entire prototype chain of the activity,\n // effectively making it a new object. We can't do that as the activity will loose some\n // of its properties, so we don't do it for now.\n // if (activity instanceof EventTarget) {\n // // Clear all event listeners by replacing the activity with a new EventTarget\n // // This is a defensive approach since we can't enumerate listeners\n // Object.setPrototypeOf(activity, EventTarget.prototype)\n // }\n\n // Clear any references that might prevent garbage collection\n activity.renderRoot = undefined\n }\n\n /**\n * Validates that an activity stack is in a consistent state.\n * @param stack The activity stack to validate.\n * @returns Array of validation errors, empty if valid.\n */\n private validateStackConsistency(stack: ActivityStackEntry[]): string[] {\n const errors: string[] = []\n const seenIds = new Set<string>()\n\n for (const entry of stack) {\n if (seenIds.has(entry.id)) {\n errors.push(`Duplicate activity ID found: ${entry.id}`)\n }\n seenIds.add(entry.id)\n\n if (!entry.activity || !entry.id || !entry.action) {\n errors.push(`Invalid stack entry: missing required properties`)\n }\n\n if (entry.activity.lifecycle === ActivityLifecycle.Destroyed) {\n errors.push(`Destroyed activity found in stack: ${entry.id}`)\n }\n }\n\n return errors\n }\n\n /**\n * Gets diagnostic information about the current state of the activity manager.\n * Useful for debugging and monitoring.\n * @returns Object containing current state information.\n */\n getDiagnostics(): {\n totalActivities: number\n modalActivities: number\n currentActivity?: string\n topActivity?: string\n stackValidation: string[]\n modalStackValidation: string[]\n } {\n return {\n totalActivities: this.activityStack.length,\n modalActivities: this.modalActivityStack.length,\n currentActivity: this.currentActivity?.constructor.name,\n topActivity: this.getTopActivity()?.constructor.name,\n stackValidation: this.validateStackConsistency(this.activityStack),\n modalStackValidation: this.validateStackConsistency(this.modalActivityStack),\n }\n }\n\n /**\n * Gets all registered activity actions.\n * @returns Array of registered action names.\n */\n getRegisteredActions(): string[] {\n return Array.from(this.activityClasses.keys())\n }\n\n /**\n * Checks if an action is registered.\n * @param action The action to check.\n * @returns true if the action is registered, false otherwise.\n */\n isActionRegistered(action: string): boolean {\n return this.activityClasses.has(action)\n }\n}\n"]}
1
+ {"version":3,"file":"ActivityManager.js","sourceRoot":"","sources":["../../../src/core/ActivityManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Activity } from './Activity.js'\nimport type { Application } from './Application.js'\n// import { navigateScreen } from './ApplicationRoute.js'\n\nexport enum ActivityLifecycle {\n /**\n * The activity is initialized, but not yet created.\n * This is the initial state of the activity.\n */\n Initialized,\n /**\n * The activity is created, but not yet started.\n * This is the state after the `onCreate()` method is called.\n */\n Created,\n /**\n * The activity is started, but not yet resumed.\n * This is the state after the `onStart()` method is called.\n */\n Started,\n /**\n * The activity is resumed and visible to the user.\n * This is the state after the `onResume()` method is called.\n */\n Resumed,\n /**\n * The activity is paused, but still visible to the user.\n * This is the state after the `onPause()` method is called.\n */\n Paused,\n /**\n * The activity is stopped and no longer visible to the user.\n * This is the state after the `onStop()` method is called.\n */\n Stopped,\n /**\n * The activity is destroyed and no longer exists.\n * This is the state after the `onDestroy()` method is called.\n */\n Destroyed,\n}\n\nexport enum IntentFlags {\n /**\n * Marks that the activity should be rendered as a modal.\n */\n Modal = 1 << 0,\n /**\n * The activity is started for result.\n */\n ForResult = 1 << 1,\n /**\n * When set, the intent data is passed by reference.\n * By default the activity manager makes a copy of the intent data.\n * This is useful when the data is large and you want to avoid copying it\n * or when you want to share the same data between activities.\n */\n ByReference = 1 << 2,\n}\n\nexport interface Intent<T = unknown> {\n /**\n * The action name the activity is registered for.\n */\n action: string\n /**\n * The data passed to the activity.\n */\n data?: T\n /**\n * The category of the activity.\n * Optional and currently not used.\n */\n category?: string[]\n /**\n * The flags that control the behavior of the activity.\n */\n flags?: number\n /**\n * The request code used to distinguish between different activities.\n */\n requestCode?: number\n}\n\n/**\n * An intent returned by an activity after the activity result is ready.\n * This object is only created when the activity is started with the `ForResult` flag.\n */\nexport interface ResolvedIntent<T = unknown> extends Intent<T> {\n /**\n * The result code returned by the activity.\n */\n result: IntentResult\n}\n\nexport enum IntentResult {\n RESULT_CANCELED,\n RESULT_OK,\n}\n\n/**\n * Defines the information stored for each activity on the stack:\n * the Activity instance, a unique id, and optionally the Intent that started the activity\n * (useful for restoring state).\n */\ninterface ActivityStackEntry {\n /**\n * The instance of the activity.\n */\n activity: Activity\n /**\n * Activity's unique ID.\n */\n id: string\n /**\n * The intent that started the activity.\n */\n intent: Intent\n /**\n * The action name the activity is registered for.\n */\n action: string\n}\n\n/**\n * Type for activity constructor with static action property.\n */\nexport interface ActivityConstructor {\n new (parent: Application): Activity\n action?: string\n}\n\n/**\n * Enhanced activity registration options.\n */\nexport interface ActivityRegistrationOptions {\n /** Whether to override existing registrations */\n override?: boolean\n /** Optional validation function for intents */\n validateIntent?: (intent: Intent) => boolean\n}\n\n/**\n * Manages application activities.\n *\n * An activity is a screen or a portion of a rendered screen that has its own\n * lifecycle methods and routing.\n *\n * An activity is registered by its class definition. Because of that, activities\n * cannot have constructors that require own parameters. Activities have to be\n * self contained or use the event system to request data.\n */\nexport class ActivityManager {\n private currentActivity?: Activity\n\n /**\n * Stores activity *classes* by unique ID (action name).\n */\n private activityClasses = new Map<string, typeof Activity>()\n\n /**\n * Stores the resolvers for activities started for result.\n */\n private resultResolvers = new Map<Intent, (intent: ResolvedIntent) => void>()\n\n /**\n * Represents the activity stack. It is used to manage\n * the UI state after calling the back action.\n */\n private activityStack: ActivityStackEntry[] = []\n\n /**\n * A stack of activities that are rendered over other activities\n * in a dialog.\n */\n private modalActivityStack: ActivityStackEntry[] = []\n\n private generateActivityId(): string {\n return Math.random().toString(36).substring(2, 15)\n }\n\n #parent: Application\n\n constructor(parent: Application) {\n this.#parent = parent\n // this.reflectEvent = this.reflectEvent.bind(this)\n }\n\n /**\n * Registers an activity class with enhanced options.\n * @param action The action name to register the activity for.\n * @param activityClass The activity class constructor.\n * @param options Optional registration configuration.\n */\n registerActivity(\n action: string,\n activityClass: ActivityConstructor,\n options: ActivityRegistrationOptions = {}\n ): void {\n const { override = false } = options\n\n if (this.activityClasses.has(action) && !override) {\n // eslint-disable-next-line no-console\n console.warn(`Activity with action \"${action}\" already registered.`, new Error().stack)\n return\n }\n\n // Validate that the class extends Activity\n if (typeof activityClass !== 'function') {\n throw new Error(`Invalid activity class for action \"${action}\": must be a constructor function`)\n }\n\n this.activityClasses.set(action, activityClass as typeof Activity)\n }\n\n /**\n * Creates an activity and pushes it into the stack, but it does not initialize any of the lifecycle methods.\n * It is a way to put an activity at some place of the stack,\n * but it will be only initialized when other activities finis.\n *\n * Note, if you add an uninitialized activity and you won't add more activities then this activity may never run.\n * Make sure that there's always another activity.\n *\n * @param intent The intent that created this activity.\n */\n async createActivity(intent: Intent): Promise<void> {\n const activity = this.buildActivity(intent)\n const activityId = this.generateActivityId()\n const stackEntry: ActivityStackEntry = { activity, id: activityId, intent, action: intent.action }\n this.activityStack.push(stackEntry)\n }\n\n // setupRoute(intent: Intent): void {\n // if (intent.data) {\n // const typed = intent.data as { uri?: string }\n // if (typed.uri) {\n // navigateScreen(typed.uri)\n // }\n // }\n // }\n\n /**\n * Starts a new activity and brings it to the foreground.\n *\n * @param intent The intent that created this activity.\n */\n async startActivity(intent: Intent): Promise<Activity> {\n const { currentActivity, activityStack } = this\n const lastIndex = activityStack.findLastIndex((entry) => entry.action === intent.action)\n // if the activity is in the history list, we bring it up and update intent.\n if (lastIndex > -1) {\n const info = activityStack[lastIndex]\n activityStack.splice(lastIndex, 1)\n activityStack.push({\n id: info.id,\n activity: info.activity,\n action: info.action,\n intent,\n })\n await info.activity.onNewIntent(intent)\n // TODO: Check if the activity is destroyed.\n // this.setupRoute(intent)\n await this.updateCurrentActivity(info.activity, false)\n return info.activity\n }\n const activity = this.buildActivity(intent)\n if (currentActivity) {\n await currentActivity.onPause()\n currentActivity.lifecycle = ActivityLifecycle.Paused\n }\n\n const activityId = this.generateActivityId()\n const stackEntry: ActivityStackEntry = { activity, id: activityId, intent, action: intent.action }\n // Modal activities are pretty much the same as regular activities but are rendered on top\n // of other activities. We keep track of them on another stack as all modal activities must\n // finish before returning to the regular stack.\n const isModal = (intent.flags ?? 0) & IntentFlags.Modal\n if (isModal) {\n this.modalActivityStack.push(stackEntry)\n } else {\n this.activityStack.push(stackEntry)\n }\n await activity.onCreate(intent)\n if (this.isDestroyed(activity)) {\n // the activity finished and the manager already took care of this situation.\n return activity\n }\n activity.lifecycle = ActivityLifecycle.Created\n\n await this.updateCurrentActivity(activity, !!isModal)\n if (this.isDestroyed(activity)) {\n // the activity finished and the manager already took care of this situation.\n return activity\n }\n // this.setupRoute(intent)\n return activity\n }\n\n private buildActivity(intent: Intent): Activity {\n const action = intent.action\n if (!this.activityClasses.has(action)) {\n throw new Error(`No activity class registered for action: ${action}`)\n }\n\n const ActivityClass = this.activityClasses.get(action)\n if (!ActivityClass) {\n throw new Error(`No activity class registered for action: ${action}`)\n }\n\n // We use the container to resolve dependencies, if any.\n // const activity = (await container.make(ActivityClass, [this.#parent])) as Activity\n return new ActivityClass(this.#parent)\n }\n\n /**\n * Starts an activity that should return a result to the calling activity.\n *\n * @template T The type of the result data expected.\n * @param intent The intent to start the activity.\n * @returns A promise that resolves when the started activity finishes, returning the result Intent with\n * data of type T.\n * @example\n * ```typescript\n * const resultIntent = await mgr.startActivityForResult<{ userId: string }>({ action: 'pickUser' });\n * if (resultIntent.resultCode === IntentResult.RESULT_OK) {\n * console.log(resultIntent.data?.userId);\n * }\n * ```\n */\n async startActivityForResult<T>(intent: Intent): Promise<ResolvedIntent<T | undefined>> {\n const byReference = (intent.flags ?? 0) & IntentFlags.ByReference\n const shallowCopy = { ...intent }\n const data = shallowCopy.data\n if (byReference) {\n delete shallowCopy.data\n }\n const deepCopy = structuredClone(shallowCopy)\n if (data && byReference) {\n deepCopy.data = data\n }\n if (deepCopy.flags) {\n deepCopy.flags = deepCopy.flags | IntentFlags.ForResult\n } else {\n deepCopy.flags = IntentFlags.ForResult\n }\n\n return new Promise<ResolvedIntent<T>>((resolve, reject) => {\n this.resultResolvers.set(deepCopy, resolve as (intent: ResolvedIntent<unknown>) => void)\n this.startActivity(deepCopy).catch((e) => {\n this.resultResolvers.delete(deepCopy)\n reject(e)\n })\n })\n }\n\n isDestroyed(activity: Activity): boolean {\n return activity.lifecycle === ActivityLifecycle.Destroyed\n }\n\n /**\n * @param activity The activity to finish.\n */\n async finishActivity(activity: Activity): Promise<void> {\n this.setupStyles(undefined, activity)\n const isModal = this.modalActivityStack.some((entry) => entry.activity === activity)\n const stack = isModal ? this.modalActivityStack : this.activityStack\n const index = stack.findIndex((entry) => entry.activity === activity)\n if (index !== -1) {\n const stackEntry = stack.splice(index, 1)[0]\n\n await stackEntry.activity.onPause()\n stackEntry.activity.lifecycle = ActivityLifecycle.Paused\n await stackEntry.activity.onStop()\n stackEntry.activity.lifecycle = ActivityLifecycle.Stopped\n await stackEntry.activity.onDestroy()\n stackEntry.activity.lifecycle = ActivityLifecycle.Destroyed\n\n // Clean up resources to prevent memory leaks\n this.cleanupActivity(stackEntry.activity)\n\n this.resolveActivityResult(stackEntry.activity, stackEntry.intent)\n\n // Resume the previous activity\n await this.bringLastActivityToFront()\n } else {\n if (activity.lifecycle === ActivityLifecycle.Created) {\n await activity.onStop()\n activity.lifecycle = ActivityLifecycle.Stopped\n }\n await activity.onDestroy()\n activity.lifecycle = ActivityLifecycle.Destroyed\n\n this.resolveActivityResult(activity, { action: '' })\n\n // This can happen when an activity finishes in one of the callback methods,\n // before it is added to the stack. In that case, we bring the last activity back to the front.\n await this.bringLastActivityToFront()\n }\n this.#parent.requestUpdate()\n }\n\n private resolveActivityResult(activity: Activity, originalIntent: Intent): void {\n const resolver = this.resultResolvers.get(originalIntent)\n // The activity might have not been started with startActivityForResult.\n // A thing to consider for the future is whether we should throw an error in a case where\n // the activity was started for result but the resolver was not found.\n if (resolver) {\n this.resultResolvers.delete(originalIntent)\n // We construct the result intent.\n // Ideally we would like to preserve the original intent structure but with new data.\n const resultIntent: ResolvedIntent = {\n ...originalIntent,\n data: activity.getResult(),\n result: activity.resultCode,\n }\n resolver(resultIntent)\n }\n }\n\n private async bringLastActivityToFront(): Promise<void> {\n if (this.modalActivityStack.length > 0) {\n const previousEntry = this.modalActivityStack[this.activityStack.length - 1]\n await this.updateCurrentActivity(previousEntry.activity, false, previousEntry.intent)\n } else if (this.activityStack.length > 0) {\n const previousEntry = this.activityStack[this.activityStack.length - 1]\n await this.updateCurrentActivity(previousEntry.activity, false, previousEntry.intent)\n } else {\n this.currentActivity = undefined // No more activities\n }\n }\n\n getTopActivity(): Activity | undefined {\n const topModal = this.modalActivityStack.findLast((a) => a.activity.lifecycle === ActivityLifecycle.Resumed)\n if (topModal) {\n return topModal.activity\n }\n const top = this.activityStack.findLast((a) => a.activity.lifecycle === ActivityLifecycle.Resumed)\n return top ? top.activity : undefined\n }\n\n getCurrentActivity(): Activity | undefined {\n return this.currentActivity\n }\n\n /**\n * Sets the styles for the current activity.\n * This method adds or removes CSS classes based on the activity's class name\n * and action, allowing for dynamic styling based on the active activity.\n * @param activity The activity to set styles for.\n * If not provided, it will not set any styles.\n * If the activity is the same as the current one, it does nothing.\n */\n setupStyles(activity?: Activity, oldActivity?: Activity): void {\n if (activity === oldActivity) {\n return\n }\n const root = document?.documentElement\n if (!root) {\n return\n }\n if (oldActivity) {\n const ctor = oldActivity.constructor as typeof Activity\n root.classList.remove(ctor.name.toLowerCase())\n if (ctor.action) {\n root.classList.remove(ctor.action.replace(/\\//g, '-'))\n }\n }\n if (activity) {\n const ctor = activity.constructor as typeof Activity\n root.classList.add(ctor.name.toLowerCase())\n if (ctor.action) {\n root.classList.add(ctor.action.replace(/\\//g, '-'))\n }\n }\n }\n\n /**\n * A helper method to handle the transition between activities, ensuring\n * lifecycle methods are called in the correct order (pause the previous activity,\n * then start/resume the new one). This centralizes lifecycle management.\n *\n * @param activity The activity to bring to the foreground.\n */\n private async updateCurrentActivity(activity: Activity, isModal: boolean, intent?: Intent): Promise<void> {\n this.setupStyles(activity, this.currentActivity)\n if (\n this.currentActivity &&\n this.currentActivity !== activity &&\n this.currentActivity.lifecycle !== ActivityLifecycle.Destroyed &&\n // Make sure we don't pause the current activity if it's already paused.\n this.currentActivity.lifecycle !== ActivityLifecycle.Paused\n ) {\n await this.currentActivity.onPause()\n this.currentActivity.lifecycle = ActivityLifecycle.Paused\n }\n switch (activity.lifecycle) {\n case ActivityLifecycle.Paused:\n if (!(await this.transitionStartedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Stopped:\n await this.safeExecuteLifecycleMethod(() => activity.onRestart(), activity, 'onRestart')\n activity.lifecycle = ActivityLifecycle.Resumed\n break\n\n case ActivityLifecycle.Destroyed:\n throw new Error(`Invalid state. The activity is already destroyed.`)\n\n case ActivityLifecycle.Created:\n if (!(await this.transitionCreatedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Started:\n if (!(await this.transitionStartedToResumed(activity))) {\n return\n }\n break\n\n case ActivityLifecycle.Initialized:\n if (!(await this.transitionInitializedToResumed(activity, intent))) {\n return\n }\n break\n }\n if (!isModal) {\n // With a modal activity, it renders directly to the `<body>` and renders outside\n // of the normal rendering flow. We keep the previous activity rendered.\n this.currentActivity = activity\n }\n }\n\n /**\n * Safely executes an async lifecycle method with error handling.\n * @param lifecycleMethod The lifecycle method to execute.\n * @param activity The activity instance.\n * @param methodName The name of the method for error reporting.\n * @returns Promise that resolves when the method completes or rejects with wrapped error.\n */\n private async safeExecuteLifecycleMethod(\n lifecycleMethod: () => void | Promise<void>,\n activity: Activity,\n methodName: string\n ): Promise<void> {\n try {\n await lifecycleMethod()\n } catch (error) {\n const activityName = activity.constructor.name\n const wrappedError = new Error(\n `Error in ${activityName}.${methodName}(): ${error instanceof Error ? error.message : String(error)}`\n )\n wrappedError.cause = error\n // Allow the activity to handle its own errors, but still propagate\n this.#parent.dispatchEvent(\n new CustomEvent('activity-lifecycle-error', {\n detail: { activity, methodName, error: wrappedError },\n })\n )\n throw wrappedError\n }\n }\n\n /**\n * Allows navigating back through the activity stack.\n * Call `ActivityManager.navigateBack()` when the user performs a back action\n * (e.g., clicks a back button).\n * @returns Promise that resolves to true if navigation was successful, false if at root.\n */\n async navigateBack(): Promise<boolean> {\n // Handle modal activities first\n if (this.modalActivityStack.length > 0) {\n const topModal = this.modalActivityStack[this.modalActivityStack.length - 1]\n await this.finishActivity(topModal.activity)\n return true\n }\n\n // Handle regular activities\n if (this.activityStack.length > 1 && this.currentActivity) {\n await this.finishActivity(this.currentActivity)\n return true\n }\n\n // At root, cannot navigate back\n return false\n }\n\n /**\n * Navigates to a specific activity in the stack, clearing activities above it.\n * @param action The action of the activity to navigate to.\n * @returns Promise that resolves to true if navigation was successful.\n */\n async navigateToActivity(action: string): Promise<boolean> {\n const index = this.activityStack.findIndex((entry) => entry.action === action)\n if (index === -1) {\n return false\n }\n\n // Finish all activities above the target\n const activitiesToFinish = this.activityStack.slice(index + 1)\n for (const entry of activitiesToFinish) {\n await this.finishActivity(entry.activity)\n }\n\n // Bring the target activity to the front\n const targetEntry = this.activityStack[index]\n await this.updateCurrentActivity(targetEntry.activity, false, targetEntry.intent)\n return true\n }\n\n /**\n * Clears the entire activity stack and starts a new root activity.\n * @param intent The intent for the new root activity.\n */\n async clearStackAndStart(intent: Intent): Promise<void> {\n // Finish all activities\n const allActivities = [...this.activityStack, ...this.modalActivityStack]\n for (const entry of allActivities) {\n if (entry.activity.lifecycle !== ActivityLifecycle.Destroyed) {\n await this.finishActivity(entry.activity)\n }\n }\n\n // Clear stacks\n this.activityStack.length = 0\n this.modalActivityStack.length = 0\n this.currentActivity = undefined\n\n // Start new root activity\n await this.startActivity(intent)\n }\n\n /**\n * Creates an intent with better type safety and validation.\n * @param action The action name.\n * @param data Optional intent data.\n * @param options Optional intent configuration.\n * @returns A properly formed intent.\n */\n createIntent<T = unknown>(\n action: string,\n data?: T,\n options: {\n category?: string[]\n flags?: number\n requestCode?: number\n } = {}\n ): Intent<T> {\n if (!this.isActionRegistered(action)) {\n throw new Error(`Cannot create intent for unregistered action: ${action}`)\n }\n\n return {\n action,\n data,\n ...options,\n }\n }\n\n createRequestCode(): number {\n const min = 1000\n const max = 9999\n return Math.floor(Math.random() * (max - min) + min)\n }\n\n findActiveActivity(action: string): Activity | undefined {\n return this.activityStack.find((entry) => entry.action === action)?.activity\n }\n\n /**\n * Transitions an activity from Created to Resumed state.\n * @param activity The activity to transition.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionCreatedToResumed(activity: Activity): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onStart(), activity, 'onStart')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Started\n\n await this.safeExecuteLifecycleMethod(() => activity.onResume(), activity, 'onResume')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Resumed\n activity.requestUpdate()\n return true\n }\n\n /**\n * Transitions an activity from Started to Resumed state.\n * @param activity The activity to transition.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionStartedToResumed(activity: Activity): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onResume(), activity, 'onResume')\n if (this.isDestroyed(activity)) {\n return false\n }\n activity.lifecycle = ActivityLifecycle.Resumed\n activity.requestUpdate()\n return true\n }\n\n /**\n * Transitions an activity from Initialized to Resumed state.\n * @param activity The activity to transition.\n * @param intent The intent used to create the activity.\n * @returns true if successful, false if activity was destroyed during transition.\n */\n private async transitionInitializedToResumed(activity: Activity, intent?: Intent): Promise<boolean> {\n await this.safeExecuteLifecycleMethod(() => activity.onCreate(intent), activity, 'onCreate')\n activity.lifecycle = ActivityLifecycle.Created\n if (this.isDestroyed(activity)) {\n return false\n }\n\n return await this.transitionCreatedToResumed(activity)\n }\n\n /**\n * Cleans up resources for destroyed activities to prevent memory leaks.\n * @param activity The activity to clean up.\n */\n private cleanupActivity(activity: Activity): void {\n // Remove any event listeners that might create memory leaks\n // This changes the entire prototype chain of the activity,\n // effectively making it a new object. We can't do that as the activity will loose some\n // of its properties, so we don't do it for now.\n // if (activity instanceof EventTarget) {\n // // Clear all event listeners by replacing the activity with a new EventTarget\n // // This is a defensive approach since we can't enumerate listeners\n // Object.setPrototypeOf(activity, EventTarget.prototype)\n // }\n\n // Clear any references that might prevent garbage collection\n activity.renderRoot = undefined\n }\n\n /**\n * Validates that an activity stack is in a consistent state.\n * @param stack The activity stack to validate.\n * @returns Array of validation errors, empty if valid.\n */\n private validateStackConsistency(stack: ActivityStackEntry[]): string[] {\n const errors: string[] = []\n const seenIds = new Set<string>()\n\n for (const entry of stack) {\n if (seenIds.has(entry.id)) {\n errors.push(`Duplicate activity ID found: ${entry.id}`)\n }\n seenIds.add(entry.id)\n\n if (!entry.activity || !entry.id || !entry.action) {\n errors.push(`Invalid stack entry: missing required properties`)\n }\n\n if (entry.activity.lifecycle === ActivityLifecycle.Destroyed) {\n errors.push(`Destroyed activity found in stack: ${entry.id}`)\n }\n }\n\n return errors\n }\n\n /**\n * Gets diagnostic information about the current state of the activity manager.\n * Useful for debugging and monitoring.\n * @returns Object containing current state information.\n */\n getDiagnostics(): {\n totalActivities: number\n modalActivities: number\n currentActivity?: string\n topActivity?: string\n stackValidation: string[]\n modalStackValidation: string[]\n } {\n return {\n totalActivities: this.activityStack.length,\n modalActivities: this.modalActivityStack.length,\n currentActivity: this.currentActivity?.constructor.name,\n topActivity: this.getTopActivity()?.constructor.name,\n stackValidation: this.validateStackConsistency(this.activityStack),\n modalStackValidation: this.validateStackConsistency(this.modalActivityStack),\n }\n }\n\n /**\n * Gets all registered activity actions.\n * @returns Array of registered action names.\n */\n getRegisteredActions(): string[] {\n return Array.from(this.activityClasses.keys())\n }\n\n /**\n * Checks if an action is registered.\n * @param action The action to check.\n * @returns true if the action is registered, false otherwise.\n */\n isActionRegistered(action: string): boolean {\n return this.activityClasses.has(action)\n }\n}\n"]}
@@ -3,12 +3,9 @@ import { Activity } from './Activity.js';
3
3
  import { FragmentState, type FragmentOptions, FragmentManager } from './FragmentManager.js';
4
4
  import type { Application, UpdateRequest } from './Application.js';
5
5
  import { FragmentRenderer } from './renderer/FragmentRenderer.js';
6
- import { Intent, IntentResult } from './ActivityManager.js';
6
+ import { Intent, ResolvedIntent } from './ActivityManager.js';
7
7
  import type { ActivityDetail, ActivityWithResultDetail } from '../events/IntentEvents.js';
8
8
  import { type RefOrCallback } from 'lit/directives/ref.js';
9
- export interface PendingActivityResult {
10
- onResult(result: IntentResult, intent: Intent): void;
11
- }
12
9
  /**
13
10
  * Similar to Activity, with lifecycle methods (onCreate, onAttach, onDetach, etc.).
14
11
  * The crucial difference is that a Fragment is always hosted by an `Activity` or
@@ -27,18 +24,6 @@ export declare class Fragment extends EventTarget {
27
24
  parent?: Activity | Fragment;
28
25
  protected children: Map<string, Fragment>;
29
26
  protected fragmentManager: FragmentManager;
30
- /**
31
- * The request code used to start an activity for a result.
32
- */
33
- requestCode: number;
34
- /**
35
- * A list of pending activity results that were requested by the components
36
- * hosted in this fragment.
37
- * The key is the request code and the value contains the callback
38
- * that will be called when the activity result is received.
39
- * The callback is called with the result code and the resulting intent.
40
- */
41
- pendingActivityResult: Map<number, PendingActivityResult>;
42
27
  get renderer(): FragmentRenderer;
43
28
  /**
44
29
  * The host to be used by the FragmentRenderer to assign it to the Lit's render root.
@@ -144,7 +129,7 @@ export declare class Fragment extends EventTarget {
144
129
  *
145
130
  * @example
146
131
  * // In your parent fragment's render method:
147
- * html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`
132
+ * // html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`
148
133
  */
149
134
  createFragmentRef(key: string): RefOrCallback<Element>;
150
135
  /**
@@ -156,24 +141,24 @@ export declare class Fragment extends EventTarget {
156
141
  getActivity(): Activity | undefined;
157
142
  /**
158
143
  * Starts an activity for result.
144
+ * @template T The type of the result data expected.
159
145
  * @param intent The intent to start.
146
+ * @returns A promise that resolves when the started activity finishes, returning the result Intent with
147
+ * data of type T.
148
+ * @example
149
+ * ```typescript
150
+ * const resultIntent = await this.startActivityForResult<{ userId: string }>({ action: 'pickUser' });
151
+ * if (resultIntent.resultCode === IntentResult.RESULT_OK) {
152
+ * console.log(resultIntent.data?.userId);
153
+ * }
154
+ * ```
160
155
  */
161
- startActivityForResult(intent: Intent): Promise<void>;
156
+ startActivityForResult<T>(intent: Intent): Promise<ResolvedIntent<T | undefined>>;
162
157
  /**
163
158
  * Starts another activity.
164
159
  * @param intent The intent to start.
165
160
  */
166
161
  startActivity(intent: Intent): Promise<void>;
167
- /**
168
- * The callback method that is triggered when another activity that was
169
- * started for result finishes.
170
- *
171
- * @param requestCode The request code that was used to start the activity.
172
- * @param data The data that was passed back.
173
- * @param intent The intent that was used to start the activity.
174
- */
175
- onActivityResult(requestCode: number, resultCode: IntentResult, intent: Intent): Promise<void>;
176
- hasRequestCode(requestCode: number): boolean;
177
162
  /**
178
163
  * A handler for the intent event dispatched by web components hosted by this fragment.
179
164
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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"}
@@ -31,18 +31,6 @@ let Fragment = (() => {
31
31
  parent;
32
32
  children = new Map();
33
33
  fragmentManager;
34
- /**
35
- * The request code used to start an activity for a result.
36
- */
37
- requestCode = -1;
38
- /**
39
- * A list of pending activity results that were requested by the components
40
- * hosted in this fragment.
41
- * The key is the request code and the value contains the callback
42
- * that will be called when the activity result is received.
43
- * The callback is called with the result code and the resulting intent.
44
- */
45
- pendingActivityResult = new Map();
46
34
  #renderer;
47
35
  get renderer() {
48
36
  return this.#renderer;
@@ -206,7 +194,7 @@ let Fragment = (() => {
206
194
  *
207
195
  * @example
208
196
  * // In your parent fragment's render method:
209
- * html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`
197
+ * // html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`
210
198
  */
211
199
  createFragmentRef(key) {
212
200
  return (element) => {
@@ -241,14 +229,24 @@ let Fragment = (() => {
241
229
  }
242
230
  /**
243
231
  * Starts an activity for result.
232
+ * @template T The type of the result data expected.
244
233
  * @param intent The intent to start.
234
+ * @returns A promise that resolves when the started activity finishes, returning the result Intent with
235
+ * data of type T.
236
+ * @example
237
+ * ```typescript
238
+ * const resultIntent = await this.startActivityForResult<{ userId: string }>({ action: 'pickUser' });
239
+ * if (resultIntent.resultCode === IntentResult.RESULT_OK) {
240
+ * console.log(resultIntent.data?.userId);
241
+ * }
242
+ * ```
245
243
  */
246
244
  async startActivityForResult(intent) {
247
245
  const activity = this.getActivity();
248
246
  if (!activity) {
249
- throw new Error(`The fragment has no activity. Unable to start an intent.`);
247
+ throw new Error('Fragment is not attached to an activity');
250
248
  }
251
- this.requestCode = await activity.startActivityForResult(intent);
249
+ return activity.startActivityForResult(intent);
252
250
  }
253
251
  /**
254
252
  * Starts another activity.
@@ -261,42 +259,6 @@ let Fragment = (() => {
261
259
  }
262
260
  await activity.startActivity(intent);
263
261
  }
264
- /**
265
- * The callback method that is triggered when another activity that was
266
- * started for result finishes.
267
- *
268
- * @param requestCode The request code that was used to start the activity.
269
- * @param data The data that was passed back.
270
- * @param intent The intent that was used to start the activity.
271
- */
272
- async onActivityResult(requestCode, resultCode, intent) {
273
- const { pendingActivityResult, children } = this;
274
- if (pendingActivityResult.has(requestCode)) {
275
- const { onResult } = pendingActivityResult.get(requestCode);
276
- pendingActivityResult.delete(requestCode);
277
- onResult(resultCode, intent);
278
- return;
279
- }
280
- for (const fragment of children.values()) {
281
- if (fragment.hasRequestCode(requestCode)) {
282
- fragment.onActivityResult(requestCode, resultCode, intent);
283
- return;
284
- }
285
- }
286
- this.requestCode = -1;
287
- if (this.constructor === Fragment) {
288
- // eslint-disable-next-line no-console
289
- console.info('Fragment#onActivityResult() not implemented', requestCode, resultCode, intent);
290
- }
291
- }
292
- hasRequestCode(requestCode) {
293
- for (const fragment of this.children.values()) {
294
- if (fragment.hasRequestCode(requestCode)) {
295
- return true;
296
- }
297
- }
298
- return this.requestCode === requestCode;
299
- }
300
262
  /**
301
263
  * A handler for the intent event dispatched by web components hosted by this fragment.
302
264
  *
@@ -319,11 +281,8 @@ let Fragment = (() => {
319
281
  }
320
282
  if (event.type === EventTypes.Intent.startActivityForResult) {
321
283
  const info = event.detail;
322
- const code = await activity.startActivityForResult(info.intent);
323
- this.requestCode = code;
324
- this.pendingActivityResult.set(code, {
325
- onResult: info.onResult,
326
- });
284
+ const result = await this.startActivityForResult(info.intent);
285
+ info.onResult(result.result, result);
327
286
  }
328
287
  else if (event.type === EventTypes.Intent.startActivity) {
329
288
  await activity.startActivity(event.detail.intent);
@@ -1 +1 @@
1
- {"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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","sourcesContent":["import { nothing, TemplateResult } from 'lit'\nimport { Activity } from './Activity.js'\nimport { FragmentState, type FragmentOptions, FragmentManager } from './FragmentManager.js'\nimport type { Application, UpdateRequest } from './Application.js'\nimport { FragmentRenderer } from './renderer/FragmentRenderer.js'\nimport { Intent, IntentResult } from './ActivityManager.js'\nimport { bound } from '../decorators/bound.js'\nimport type { ActivityDetail, ActivityWithResultDetail } from '../events/IntentEvents.js'\nimport { EventTypes } from '../events/EventTypes.js'\nimport { type RefOrCallback } from 'lit/directives/ref.js'\n\nexport interface PendingActivityResult {\n onResult(result: IntentResult, intent: Intent): void\n}\n\n/**\n * Similar to Activity, with lifecycle methods (onCreate, onAttach, onDetach, etc.).\n * The crucial difference is that a Fragment is always hosted by an `Activity` or\n * another `Fragment`.\n *\n * A `Fragment` represents a reusable portion of the app's UI.\n * A fragment defines and manages its own layout, has its own lifecycle,\n * and can handle its own input events.\n * Fragments can't live on their own. They must be hosted by an activity or another\n * fragment. The fragment’s view hierarchy becomes part of, or attaches to,\n * the host’s view hierarchy.\n */\nexport class Fragment extends EventTarget {\n public state: FragmentState = FragmentState.Initialized\n public parent?: Activity | Fragment\n protected children = new Map<string, Fragment>()\n protected fragmentManager: FragmentManager\n\n /**\n * The request code used to start an activity for a result.\n */\n requestCode = -1\n\n /**\n * A list of pending activity results that were requested by the components\n * hosted in this fragment.\n * The key is the request code and the value contains the callback\n * that will be called when the activity result is received.\n * The callback is called with the result code and the resulting intent.\n */\n pendingActivityResult: Map<number, PendingActivityResult> = new Map<number, PendingActivityResult>()\n\n #renderer: FragmentRenderer\n\n get renderer(): FragmentRenderer {\n return this.#renderer\n }\n\n /**\n * The host to be used by the FragmentRenderer to assign it to the Lit's render root.\n * Whatever is assigned to this property will be used as the root element.\n *\n * Fragments should use this property to manipulate the event's target.\n * If a fragment renders multiple children, but only one is visible,\n * it should assign the host value to the currently rendered child.\n */\n host: Fragment = this\n\n constructor(options?: FragmentOptions) {\n super()\n this.parent = options?.parent\n this.fragmentManager = new FragmentManager(this)\n this.#renderer = new FragmentRenderer(this)\n }\n\n /**\n * When implemented, this method returns the class name to be used as a root class for the fragment.\n * This class name can be used to apply styles or identify the fragment in the DOM.\n * @returns The class name to be used as a root class for the fragment.\n */\n public rootClass(): string | undefined {\n return undefined\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n onData(data: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:data', { detail: data }))\n }\n\n /**\n * Called once when the fragment is created.\n *\n * In the `onCreate()` method, perform basic fragment startup logic that happens only once\n * for the entire life of the fragment.\n * @param data Optional init data.\n */\n onCreate(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:create', { detail: data }))\n }\n\n /**\n * Called when the fragment is attached to a parent\n */\n onAttach(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:attach', { detail: data }))\n }\n\n /**\n * Called when the fragment becomes visible.\n */\n onStart(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:start', { detail: null }))\n }\n\n /**\n * Called when the fragment gains focus.\n */\n onResume(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:resume', { detail: null }))\n }\n\n /**\n * Called when the fragment loses focus.\n */\n onPause(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:pause', { detail: null }))\n }\n\n /**\n * Called when the fragment is no longer visible.\n */\n onStop(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:stop', { detail: null }))\n }\n\n /**\n * Called when the fragment is detached from a parent\n */\n onDetach(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:detach', { detail: null }))\n }\n\n /**\n * Called before the fragment is destroyed.\n */\n onDestroy(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:destroy', { detail: null }))\n this.fragmentManager.onDestroy()\n }\n\n /**\n * Called by the renderer when the fragment is rendered for the first time.\n */\n onFirstRender(): void {\n //\n }\n\n /**\n * A function called when it should render the view.\n * By default it renders a fragment view if the fragment hosts other fragments and only one is visible.\n */\n render(): TemplateResult | typeof nothing {\n const fragment = this.getSingleVisibleFragment()\n if (fragment) {\n // we can manage the default rendering.\n // we make an assumption that by default only one fragment is rendered,\n // otherwise the parent activity or fragment would have to setup render roots.\n return fragment.render()\n }\n return nothing\n }\n\n /**\n * Checks whether there's only one `Fragment` that is in the `Resumed` state\n * and returns it. It returns `null` if there is no `Fragment`s or more than a single\n * visible `Fragment`.\n * @returns A Fragment that is the only fragment that should be visible.\n */\n getSingleVisibleFragment(): Fragment | null {\n const fragments = this.getVisibleFragments()\n return fragments.length === 1 ? fragments[0] : null\n }\n\n /**\n * Checks whether this fragment is a host for other fragments.\n * @returns `true` when this fragment hosts other fragments.\n */\n isRenderingFragments(): boolean {\n return this.children.size > 0\n }\n\n /**\n * @returns The list of all fragments that are in the Resumed state.\n */\n getVisibleFragments(): Fragment[] {\n return this.fragmentManager.getVisible()\n }\n\n /**\n * Adds a child fragment to this fragment.\n * The FragmentManager will handle lifecycle.\n * @param key The name of the fragment.\n * @param fragment The fragment to add.\n */\n async addChild(key: string, fragment: Fragment, data?: unknown): Promise<void> {\n this.children.set(key, fragment)\n await this.fragmentManager.attachFragment(key, fragment, this, data)\n }\n\n /**\n * Removes a fragment from this fragment.\n * @param key The name of the fragment to remove.\n */\n async removeChild(key: string): Promise<void> {\n const child = this.children.get(key)\n if (child) {\n await this.fragmentManager.detachFragment(key)\n this.children.delete(key)\n }\n }\n\n /**\n * Creates a RefCallback that can be used with lit's `ref()` directive\n * to automatically show/hide a child fragment when its container element\n * is added or removed from the DOM.\n *\n * @param key The key of the child fragment to manage.\n * @returns A RefCallback to be used with the `ref()` directive.\n *\n * @example\n * // In your parent fragment's render method:\n * html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`\n */\n createFragmentRef(key: string): RefOrCallback<Element> {\n return (element?: Element) => {\n if (element) {\n this.fragmentManager.showFragment(key, element as HTMLElement)\n } else {\n const fragment = this.fragmentManager.findFragment(key)\n if (fragment) {\n this.fragmentManager.hideFragment(fragment)\n }\n }\n }\n }\n\n /**\n * A helper to request an update.\n * Application or parent Fragment will handle rendering.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n if (opts.fragment !== false) {\n this.renderer.requestUpdate()\n }\n if (this.parent && (opts.activity || opts.app)) {\n this.parent.requestUpdate(opts)\n }\n }\n\n getApplication(): Application | undefined {\n return this.parent?.getApplication()\n }\n\n getActivity(): Activity | undefined {\n return this.parent?.getActivity()\n }\n\n /**\n * Starts an activity for result.\n * @param intent The intent to start.\n */\n async startActivityForResult(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n this.requestCode = await activity.startActivityForResult(intent)\n }\n\n /**\n * Starts another activity.\n * @param intent The intent to start.\n */\n async startActivity(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n await activity.startActivity(intent)\n }\n\n /**\n * The callback method that is triggered when another activity that was\n * started for result finishes.\n *\n * @param requestCode The request code that was used to start the activity.\n * @param data The data that was passed back.\n * @param intent The intent that was used to start the activity.\n */\n async onActivityResult(requestCode: number, resultCode: IntentResult, intent: Intent): Promise<void> {\n const { pendingActivityResult, children } = this\n if (pendingActivityResult.has(requestCode)) {\n const { onResult } = pendingActivityResult.get(requestCode) as PendingActivityResult\n pendingActivityResult.delete(requestCode)\n onResult(resultCode, intent)\n return\n }\n for (const fragment of children.values()) {\n if (fragment.hasRequestCode(requestCode)) {\n fragment.onActivityResult(requestCode, resultCode, intent)\n return\n }\n }\n this.requestCode = -1\n if (this.constructor === Fragment) {\n // eslint-disable-next-line no-console\n console.info('Fragment#onActivityResult() not implemented', requestCode, resultCode, intent)\n }\n }\n\n hasRequestCode(requestCode: number): boolean {\n for (const fragment of this.children.values()) {\n if (fragment.hasRequestCode(requestCode)) {\n return true\n }\n }\n return this.requestCode === requestCode\n }\n\n /**\n * A handler for the intent event dispatched by web components hosted by this fragment.\n *\n * **Usage example:**\n *\n * ```ts\n * <custom-element @startactivity=\"${this.handleIntentEvent}\"></custom-element>\n * <custom-element @startactivityforresult=\"${this.handleIntentEvent}\"></custom-element>\n * ```\n *\n * @param event The event that was dispatched.\n * @returns A promise that resolves when the intent is handled.\n * @throws An error if the fragment has no activity.\n * @throws An error if the event type is not recognized.\n */\n @bound\n async handleIntentEvent(event: CustomEvent<ActivityDetail | ActivityWithResultDetail>): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n if (event.type === EventTypes.Intent.startActivityForResult) {\n const info = event.detail as ActivityWithResultDetail\n const code = await activity.startActivityForResult(info.intent)\n this.requestCode = code\n this.pendingActivityResult.set(code, {\n onResult: info.onResult,\n })\n } else if (event.type === EventTypes.Intent.startActivity) {\n await activity.startActivity(event.detail.intent)\n } else {\n throw new Error(`Unrecognized intent event: ${event.type}`)\n }\n }\n\n /**\n * Shows a registered fragment.\n * @param key The fragment's key.\n * @param options Fragment rendering options.\n */\n async showFragment(key: string, options: { renderTarget?: HTMLElement; isHost?: boolean } = {}): Promise<void> {\n if (options.isHost) {\n const fragment = this.fragmentManager.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n this.host = fragment\n }\n await this.fragmentManager.showFragment(key, options.renderTarget)\n }\n\n /**\n * Hides a fragment by its key.\n * @param key The fragment's key.\n */\n async hideFragment(fragment: Fragment | string): Promise<void> {\n let ref: Fragment | undefined\n if (typeof fragment === 'string') {\n ref = this.fragmentManager.findFragment(fragment)\n } else {\n ref = fragment as Fragment\n }\n if (!ref) {\n throw new Error(`Fragment not found`)\n }\n if (this.host === ref) {\n this.host = this\n }\n await this.fragmentManager.hideFragment(ref)\n }\n}\n"]}
1
+ {"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,KAAK,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAwB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD;;;;;;;;;;;GAWG;IACU,QAAQ;sBAAS,WAAW;;;iBAA5B,QAAS,SAAQ,WAAW;;;6CAoRtC,KAAK;YACN,sMAAM,iBAAiB,6DActB;;;QAlSM,KAAK,IADD,mDAAQ,EACW,aAAa,CAAC,WAAW,EAAA;QAChD,MAAM,CAAsB;QACzB,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;QACtC,eAAe,CAAiB;QAE1C,SAAS,CAAkB;QAE3B,IAAI,QAAQ;YACV,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QAED;;;;;;;WAOG;QACH,IAAI,GAAa,IAAI,CAAA;QAErB,YAAY,OAAyB;YACnC,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAA;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC;QAED;;;;WAIG;QACI,SAAS;YACd,OAAO,SAAS,CAAA;QAClB,CAAC;QAED;;WAEG;QACI,aAAa,CAAC,UAAgC;YACnD,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,CAAC,IAAa;YAClB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,CAAC;QAED;;;;;;WAMG;QACH,QAAQ,CAAC,IAAc;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED;;WAEG;QACH,QAAQ,CAAC,IAAc;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED;;WAEG;QACH,OAAO;YACL,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACzE,CAAC;QAED;;WAEG;QACH,QAAQ;YACN,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED;;WAEG;QACH,OAAO;YACL,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACzE,CAAC;QAED;;WAEG;QACH,MAAM;YACJ,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,CAAC;QAED;;WAEG;QACH,QAAQ;YACN,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED;;WAEG;QACH,SAAS;YACP,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACzE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAA;QAClC,CAAC;QAED;;WAEG;QACH,aAAa;YACX,EAAE;QACJ,CAAC;QAED;;;WAGG;QACH,MAAM;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAA;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,uCAAuC;gBACvC,uEAAuE;gBACvE,8EAA8E;gBAC9E,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAA;YAC1B,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED;;;;;WAKG;QACH,wBAAwB;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;YAC5C,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACrD,CAAC;QAED;;;WAGG;QACH,oBAAoB;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAA;QAC/B,CAAC;QAED;;WAEG;QACH,mBAAmB;YACjB,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAA;QAC1C,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,QAAkB,EAAE,IAAc;YAC5D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAChC,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACtE,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,WAAW,CAAC,GAAW;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;gBAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED;;;;;;;;;;;WAWG;QACH,iBAAiB,CAAC,GAAW;YAC3B,OAAO,CAAC,OAAiB,EAAE,EAAE;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,OAAsB,CAAC,CAAA;gBAChE,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBACvD,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;QACH,CAAC;QAED;;;WAGG;QACH,aAAa,CAAC,OAAsB,EAAE;YACpC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;QAED,cAAc;YACZ,OAAO,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QACtC,CAAC;QAED,WAAW;YACT,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAA;QACnC,CAAC;QAED;;;;;;;;;;;;;WAaG;QACH,KAAK,CAAC,sBAAsB,CAAI,MAAc;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;YAC5D,CAAC;YACD,OAAO,QAAQ,CAAC,sBAAsB,CAAI,MAAM,CAAC,CAAA;QACnD,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,aAAa,CAAC,MAAc;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;YAC7E,CAAC;YACD,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC;QAED;;;;;;;;;;;;;;WAcG;QAEH,KAAK,CAAC,iBAAiB,CAAC,KAA6D;YACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;YAC7E,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;gBAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAkC,CAAA;gBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAC7D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACtC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1D,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAC7D,CAAC;QACH,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,UAA4D,EAAE;YAC5F,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;gBACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,aAAa,CAAC,CAAA;gBACxD,CAAC;gBACD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;YACtB,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;QACpE,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,YAAY,CAAC,QAA2B;YAC5C,IAAI,GAAyB,CAAA;YAC7B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YACnD,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,QAAoB,CAAA;YAC5B,CAAC;YACD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAClB,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC9C,CAAC;;;SAvUU,QAAQ","sourcesContent":["import { nothing, TemplateResult } from 'lit'\nimport { Activity } from './Activity.js'\nimport { FragmentState, type FragmentOptions, FragmentManager } from './FragmentManager.js'\nimport type { Application, UpdateRequest } from './Application.js'\nimport { FragmentRenderer } from './renderer/FragmentRenderer.js'\nimport { Intent, ResolvedIntent } from './ActivityManager.js'\nimport { bound } from '../decorators/bound.js'\nimport type { ActivityDetail, ActivityWithResultDetail } from '../events/IntentEvents.js'\nimport { EventTypes } from '../events/EventTypes.js'\nimport { type RefOrCallback } from 'lit/directives/ref.js'\n\n/**\n * Similar to Activity, with lifecycle methods (onCreate, onAttach, onDetach, etc.).\n * The crucial difference is that a Fragment is always hosted by an `Activity` or\n * another `Fragment`.\n *\n * A `Fragment` represents a reusable portion of the app's UI.\n * A fragment defines and manages its own layout, has its own lifecycle,\n * and can handle its own input events.\n * Fragments can't live on their own. They must be hosted by an activity or another\n * fragment. The fragment’s view hierarchy becomes part of, or attaches to,\n * the host’s view hierarchy.\n */\nexport class Fragment extends EventTarget {\n public state: FragmentState = FragmentState.Initialized\n public parent?: Activity | Fragment\n protected children = new Map<string, Fragment>()\n protected fragmentManager: FragmentManager\n\n #renderer: FragmentRenderer\n\n get renderer(): FragmentRenderer {\n return this.#renderer\n }\n\n /**\n * The host to be used by the FragmentRenderer to assign it to the Lit's render root.\n * Whatever is assigned to this property will be used as the root element.\n *\n * Fragments should use this property to manipulate the event's target.\n * If a fragment renders multiple children, but only one is visible,\n * it should assign the host value to the currently rendered child.\n */\n host: Fragment = this\n\n constructor(options?: FragmentOptions) {\n super()\n this.parent = options?.parent\n this.fragmentManager = new FragmentManager(this)\n this.#renderer = new FragmentRenderer(this)\n }\n\n /**\n * When implemented, this method returns the class name to be used as a root class for the fragment.\n * This class name can be used to apply styles or identify the fragment in the DOM.\n * @returns The class name to be used as a root class for the fragment.\n */\n public rootClass(): string | undefined {\n return undefined\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n onData(data: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:data', { detail: data }))\n }\n\n /**\n * Called once when the fragment is created.\n *\n * In the `onCreate()` method, perform basic fragment startup logic that happens only once\n * for the entire life of the fragment.\n * @param data Optional init data.\n */\n onCreate(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:create', { detail: data }))\n }\n\n /**\n * Called when the fragment is attached to a parent\n */\n onAttach(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:attach', { detail: data }))\n }\n\n /**\n * Called when the fragment becomes visible.\n */\n onStart(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:start', { detail: null }))\n }\n\n /**\n * Called when the fragment gains focus.\n */\n onResume(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:resume', { detail: null }))\n }\n\n /**\n * Called when the fragment loses focus.\n */\n onPause(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:pause', { detail: null }))\n }\n\n /**\n * Called when the fragment is no longer visible.\n */\n onStop(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:stop', { detail: null }))\n }\n\n /**\n * Called when the fragment is detached from a parent\n */\n onDetach(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:detach', { detail: null }))\n }\n\n /**\n * Called before the fragment is destroyed.\n */\n onDestroy(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:destroy', { detail: null }))\n this.fragmentManager.onDestroy()\n }\n\n /**\n * Called by the renderer when the fragment is rendered for the first time.\n */\n onFirstRender(): void {\n //\n }\n\n /**\n * A function called when it should render the view.\n * By default it renders a fragment view if the fragment hosts other fragments and only one is visible.\n */\n render(): TemplateResult | typeof nothing {\n const fragment = this.getSingleVisibleFragment()\n if (fragment) {\n // we can manage the default rendering.\n // we make an assumption that by default only one fragment is rendered,\n // otherwise the parent activity or fragment would have to setup render roots.\n return fragment.render()\n }\n return nothing\n }\n\n /**\n * Checks whether there's only one `Fragment` that is in the `Resumed` state\n * and returns it. It returns `null` if there is no `Fragment`s or more than a single\n * visible `Fragment`.\n * @returns A Fragment that is the only fragment that should be visible.\n */\n getSingleVisibleFragment(): Fragment | null {\n const fragments = this.getVisibleFragments()\n return fragments.length === 1 ? fragments[0] : null\n }\n\n /**\n * Checks whether this fragment is a host for other fragments.\n * @returns `true` when this fragment hosts other fragments.\n */\n isRenderingFragments(): boolean {\n return this.children.size > 0\n }\n\n /**\n * @returns The list of all fragments that are in the Resumed state.\n */\n getVisibleFragments(): Fragment[] {\n return this.fragmentManager.getVisible()\n }\n\n /**\n * Adds a child fragment to this fragment.\n * The FragmentManager will handle lifecycle.\n * @param key The name of the fragment.\n * @param fragment The fragment to add.\n */\n async addChild(key: string, fragment: Fragment, data?: unknown): Promise<void> {\n this.children.set(key, fragment)\n await this.fragmentManager.attachFragment(key, fragment, this, data)\n }\n\n /**\n * Removes a fragment from this fragment.\n * @param key The name of the fragment to remove.\n */\n async removeChild(key: string): Promise<void> {\n const child = this.children.get(key)\n if (child) {\n await this.fragmentManager.detachFragment(key)\n this.children.delete(key)\n }\n }\n\n /**\n * Creates a RefCallback that can be used with lit's `ref()` directive\n * to automatically show/hide a child fragment when its container element\n * is added or removed from the DOM.\n *\n * @param key The key of the child fragment to manage.\n * @returns A RefCallback to be used with the `ref()` directive.\n *\n * @example\n * // In your parent fragment's render method:\n * // html`<div ${ref(this.createFragmentRef('my-child-fragment'))}></div>`\n */\n createFragmentRef(key: string): RefOrCallback<Element> {\n return (element?: Element) => {\n if (element) {\n this.fragmentManager.showFragment(key, element as HTMLElement)\n } else {\n const fragment = this.fragmentManager.findFragment(key)\n if (fragment) {\n this.fragmentManager.hideFragment(fragment)\n }\n }\n }\n }\n\n /**\n * A helper to request an update.\n * Application or parent Fragment will handle rendering.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n if (opts.fragment !== false) {\n this.renderer.requestUpdate()\n }\n if (this.parent && (opts.activity || opts.app)) {\n this.parent.requestUpdate(opts)\n }\n }\n\n getApplication(): Application | undefined {\n return this.parent?.getApplication()\n }\n\n getActivity(): Activity | undefined {\n return this.parent?.getActivity()\n }\n\n /**\n * Starts an activity for result.\n * @template T The type of the result data expected.\n * @param intent The intent to start.\n * @returns A promise that resolves when the started activity finishes, returning the result Intent with\n * data of type T.\n * @example\n * ```typescript\n * const resultIntent = await this.startActivityForResult<{ userId: string }>({ action: 'pickUser' });\n * if (resultIntent.resultCode === IntentResult.RESULT_OK) {\n * console.log(resultIntent.data?.userId);\n * }\n * ```\n */\n async startActivityForResult<T>(intent: Intent): Promise<ResolvedIntent<T | undefined>> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error('Fragment is not attached to an activity')\n }\n return activity.startActivityForResult<T>(intent)\n }\n\n /**\n * Starts another activity.\n * @param intent The intent to start.\n */\n async startActivity(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n await activity.startActivity(intent)\n }\n\n /**\n * A handler for the intent event dispatched by web components hosted by this fragment.\n *\n * **Usage example:**\n *\n * ```ts\n * <custom-element @startactivity=\"${this.handleIntentEvent}\"></custom-element>\n * <custom-element @startactivityforresult=\"${this.handleIntentEvent}\"></custom-element>\n * ```\n *\n * @param event The event that was dispatched.\n * @returns A promise that resolves when the intent is handled.\n * @throws An error if the fragment has no activity.\n * @throws An error if the event type is not recognized.\n */\n @bound\n async handleIntentEvent(event: CustomEvent<ActivityDetail | ActivityWithResultDetail>): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n if (event.type === EventTypes.Intent.startActivityForResult) {\n const info = event.detail as ActivityWithResultDetail\n const result = await this.startActivityForResult(info.intent)\n info.onResult(result.result, result)\n } else if (event.type === EventTypes.Intent.startActivity) {\n await activity.startActivity(event.detail.intent)\n } else {\n throw new Error(`Unrecognized intent event: ${event.type}`)\n }\n }\n\n /**\n * Shows a registered fragment.\n * @param key The fragment's key.\n * @param options Fragment rendering options.\n */\n async showFragment(key: string, options: { renderTarget?: HTMLElement; isHost?: boolean } = {}): Promise<void> {\n if (options.isHost) {\n const fragment = this.fragmentManager.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n this.host = fragment\n }\n await this.fragmentManager.showFragment(key, options.renderTarget)\n }\n\n /**\n * Hides a fragment by its key.\n * @param key The fragment's key.\n */\n async hideFragment(fragment: Fragment | string): Promise<void> {\n let ref: Fragment | undefined\n if (typeof fragment === 'string') {\n ref = this.fragmentManager.findFragment(fragment)\n } else {\n ref = fragment as Fragment\n }\n if (!ref) {\n throw new Error(`Fragment not found`)\n }\n if (this.host === ref) {\n this.host = this\n }\n await this.fragmentManager.hideFragment(ref)\n }\n}\n"]}
@@ -80,11 +80,5 @@ export declare class FragmentManager {
80
80
  findFragment(key: string): Fragment | undefined;
81
81
  renderFragment(key: string): TemplateResult | typeof nothing;
82
82
  updateActiveFragments(): void;
83
- /**
84
- * Finds a fragment by activity request code.
85
- * @param requestCode The request code to find the fragment by.
86
- * @returns The corresponding fragment or `null`.
87
- */
88
- findByRequestCode(requestCode: number): Fragment | null;
89
83
  }
90
84
  //# sourceMappingURL=FragmentManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FragmentManager.d.ts","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,oBAAY,aAAa;IACvB,WAAW,IAAA;IACX,OAAO,IAAA;IACP,QAAQ,IAAA,CAAE,mCAAmC;IAC7C,OAAO,IAAA,CAAE,UAAU;IACnB,OAAO,IAAA,CAAE,YAAY;IACrB,MAAM,IAAA;IACN,OAAO,IAAA,CAAE,oBAAoB;IAC7B,QAAQ,IAAA,CAAE,uCAAuC;IACjD,SAAS,IAAA;CACV;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC7B;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,SAAS,CAA8B;IAC/C;;OAEG;IACH,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAI/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC;;;;;;;OAOG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjH;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E;;;;;;OAMG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB3C;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB9C;;;OAGG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI/C,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,OAAO;IAQ5D,qBAAqB,IAAI,IAAI;IAQ7B;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;CAQxD"}
1
+ {"version":3,"file":"FragmentManager.d.ts","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,oBAAY,aAAa;IACvB,WAAW,IAAA;IACX,OAAO,IAAA;IACP,QAAQ,IAAA,CAAE,mCAAmC;IAC7C,OAAO,IAAA,CAAE,UAAU;IACnB,OAAO,IAAA,CAAE,YAAY;IACrB,MAAM,IAAA;IACN,OAAO,IAAA,CAAE,oBAAoB;IAC7B,QAAQ,IAAA,CAAE,uCAAuC;IACjD,SAAS,IAAA;CACV;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC7B;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,SAAS,CAA8B;IAC/C;;OAEG;IACH,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAI/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC;;;;;;;OAOG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjH;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E;;;;;;OAMG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB3C;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB9C;;;OAGG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI/C,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,OAAO;IAQ5D,qBAAqB,IAAI,IAAI;CAO9B"}
@@ -191,18 +191,5 @@ export class FragmentManager {
191
191
  }
192
192
  }
193
193
  }
194
- /**
195
- * Finds a fragment by activity request code.
196
- * @param requestCode The request code to find the fragment by.
197
- * @returns The corresponding fragment or `null`.
198
- */
199
- findByRequestCode(requestCode) {
200
- for (const [, fragment] of this.fragments) {
201
- if (fragment.hasRequestCode(requestCode)) {
202
- return fragment;
203
- }
204
- }
205
- return null;
206
- }
207
194
  }
208
195
  //# sourceMappingURL=FragmentManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FragmentManager.js","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type TemplateResult, nothing } from 'lit'\nimport type { Activity } from './Activity.js'\nimport type { Fragment } from './Fragment.js'\n\nexport enum FragmentState {\n Initialized,\n Created,\n Attached, // Added to an Activity or Fragment\n Started, // Visible\n Resumed, // Has focus\n Paused,\n Stopped, // No longer visible\n Detached, // Removed from an Activity or Fragment\n Destroyed,\n}\n\nexport interface FragmentOptions {\n parent?: Activity | Fragment\n}\n\n/**\n * `FragmentManager` is the class responsible for performing actions\n * on the app's fragments, such as adding, removing, or replacing them\n * and adding them to the back stack.\n */\nexport class FragmentManager {\n /**\n * Stores fragments by I\n */\n private fragments = new Map<string, Fragment>()\n /**\n * The reference to the host activity or fragment.\n */\n private host: Activity | Fragment\n\n constructor(host: Activity | Fragment) {\n this.host = host\n }\n\n async onDestroy(): Promise<void> {\n // Clean up all fragments when the host is destroyed\n for (const [key, fragment] of this.fragments) {\n await fragment.onDestroy()\n this.removeFragmentStyles(fragment)\n this.fragments.delete(key)\n }\n }\n\n /**\n * Attaches a fragment to a parent Activity or Fragment\n *\n * @param fragment The fragment to add.\n * @param parent The parent fragment or activity.\n * @param renderTarget Optional DOM target to render to.\n * @param data Optional data to pass to the `onCreate()` method.\n */\n async attachFragment(key: string, fragment: Fragment, parent: Activity | Fragment, data?: unknown): Promise<void> {\n // Ensure fragment has correct parent\n fragment.parent = parent\n\n this.fragments.set(key, fragment)\n await fragment.onCreate(data)\n fragment.state = FragmentState.Created\n await fragment.onAttach(data)\n fragment.state = FragmentState.Attached\n }\n\n /**\n * Detaches a fragment from its parent.\n * @param fragment\n * @returns\n */\n async detachFragment(key: string): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n\n this.hideFragment(fragment)\n await fragment.onDetach()\n fragment.state = FragmentState.Detached\n await fragment.onDestroy()\n fragment.state = FragmentState.Destroyed\n this.fragments.delete(key)\n // Clear parent reference\n fragment.parent = undefined\n }\n\n /**\n * Shows a Fragment (calls lifecycle methods and renders)\n * @param fragment The fragment to render.\n * @param renderTarget Optional render target, if any.\n */\n async showFragment(key: string, renderTarget?: HTMLElement): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n if (fragment.state === FragmentState.Resumed) {\n return\n }\n // Tell the fragment it is now started.\n await fragment.onStart()\n fragment.state = FragmentState.Started\n await fragment.onResume()\n fragment.state = FragmentState.Resumed\n if (renderTarget) {\n fragment.setRenderRoot(renderTarget)\n fragment.requestUpdate({ app: false, activity: false })\n } else {\n this.host.requestUpdate({ app: false, activity: true })\n }\n this.setFragmentStyles(fragment)\n }\n\n /**\n * Sets styles for a fragment by adding a class to the root element.\n * This is useful for applying specific styles to fragments.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to set styles for.\n */\n setFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.add(...classes)\n }\n\n /**\n * Removes styles for a fragment by removing a class from the root element.\n * This is useful for cleaning up styles when a fragment is no longer visible.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to remove styles for.\n */\n removeFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.remove(...classes)\n }\n\n /**\n * Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.\n * @returns The list of visible fragments\n */\n getVisible(): Fragment[] {\n return Array.from(this.fragments.values()).filter((fragment) => fragment.state === FragmentState.Resumed)\n }\n\n /**\n * Hides a Fragment (calls lifecycle methods and removes from DOM if necessary)\n */\n async hideFragment(fragment: Fragment | string): Promise<void> {\n let ref: Fragment | undefined\n if (typeof fragment === 'string') {\n ref = this.findFragment(fragment)\n } else {\n ref = fragment as Fragment\n }\n if (!ref) {\n throw new Error(`Fragment not found`)\n }\n await ref.onPause()\n ref.state = FragmentState.Paused\n await ref.onStop()\n ref.state = FragmentState.Stopped\n this.removeFragmentStyles(ref)\n // if necessary, you would remove its template content from the DOM\n // however, with rendering logic encapsulated in Fragment, this isn't needed here\n }\n\n findFragment(key: string): Fragment | undefined {\n return this.fragments.get(key)\n }\n\n renderFragment(key: string): TemplateResult | typeof nothing {\n const fragment = this.findFragment(key)\n if (!fragment || fragment.state !== FragmentState.Resumed) {\n return nothing\n }\n return fragment.render() || nothing\n }\n\n updateActiveFragments(): void {\n for (const [, fragment] of this.fragments) {\n if ([FragmentState.Started, FragmentState.Resumed].includes(fragment.state)) {\n fragment.requestUpdate({ app: false, activity: false })\n }\n }\n }\n\n /**\n * Finds a fragment by activity request code.\n * @param requestCode The request code to find the fragment by.\n * @returns The corresponding fragment or `null`.\n */\n findByRequestCode(requestCode: number): Fragment | null {\n for (const [, fragment] of this.fragments) {\n if (fragment.hasRequestCode(requestCode)) {\n return fragment\n }\n }\n return null\n }\n}\n"]}
1
+ {"version":3,"file":"FragmentManager.js","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type TemplateResult, nothing } from 'lit'\nimport type { Activity } from './Activity.js'\nimport type { Fragment } from './Fragment.js'\n\nexport enum FragmentState {\n Initialized,\n Created,\n Attached, // Added to an Activity or Fragment\n Started, // Visible\n Resumed, // Has focus\n Paused,\n Stopped, // No longer visible\n Detached, // Removed from an Activity or Fragment\n Destroyed,\n}\n\nexport interface FragmentOptions {\n parent?: Activity | Fragment\n}\n\n/**\n * `FragmentManager` is the class responsible for performing actions\n * on the app's fragments, such as adding, removing, or replacing them\n * and adding them to the back stack.\n */\nexport class FragmentManager {\n /**\n * Stores fragments by I\n */\n private fragments = new Map<string, Fragment>()\n /**\n * The reference to the host activity or fragment.\n */\n private host: Activity | Fragment\n\n constructor(host: Activity | Fragment) {\n this.host = host\n }\n\n async onDestroy(): Promise<void> {\n // Clean up all fragments when the host is destroyed\n for (const [key, fragment] of this.fragments) {\n await fragment.onDestroy()\n this.removeFragmentStyles(fragment)\n this.fragments.delete(key)\n }\n }\n\n /**\n * Attaches a fragment to a parent Activity or Fragment\n *\n * @param fragment The fragment to add.\n * @param parent The parent fragment or activity.\n * @param renderTarget Optional DOM target to render to.\n * @param data Optional data to pass to the `onCreate()` method.\n */\n async attachFragment(key: string, fragment: Fragment, parent: Activity | Fragment, data?: unknown): Promise<void> {\n // Ensure fragment has correct parent\n fragment.parent = parent\n\n this.fragments.set(key, fragment)\n await fragment.onCreate(data)\n fragment.state = FragmentState.Created\n await fragment.onAttach(data)\n fragment.state = FragmentState.Attached\n }\n\n /**\n * Detaches a fragment from its parent.\n * @param fragment\n * @returns\n */\n async detachFragment(key: string): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n\n this.hideFragment(fragment)\n await fragment.onDetach()\n fragment.state = FragmentState.Detached\n await fragment.onDestroy()\n fragment.state = FragmentState.Destroyed\n this.fragments.delete(key)\n // Clear parent reference\n fragment.parent = undefined\n }\n\n /**\n * Shows a Fragment (calls lifecycle methods and renders)\n * @param fragment The fragment to render.\n * @param renderTarget Optional render target, if any.\n */\n async showFragment(key: string, renderTarget?: HTMLElement): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n if (fragment.state === FragmentState.Resumed) {\n return\n }\n // Tell the fragment it is now started.\n await fragment.onStart()\n fragment.state = FragmentState.Started\n await fragment.onResume()\n fragment.state = FragmentState.Resumed\n if (renderTarget) {\n fragment.setRenderRoot(renderTarget)\n fragment.requestUpdate({ app: false, activity: false })\n } else {\n this.host.requestUpdate({ app: false, activity: true })\n }\n this.setFragmentStyles(fragment)\n }\n\n /**\n * Sets styles for a fragment by adding a class to the root element.\n * This is useful for applying specific styles to fragments.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to set styles for.\n */\n setFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.add(...classes)\n }\n\n /**\n * Removes styles for a fragment by removing a class from the root element.\n * This is useful for cleaning up styles when a fragment is no longer visible.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to remove styles for.\n */\n removeFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.remove(...classes)\n }\n\n /**\n * Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.\n * @returns The list of visible fragments\n */\n getVisible(): Fragment[] {\n return Array.from(this.fragments.values()).filter((fragment) => fragment.state === FragmentState.Resumed)\n }\n\n /**\n * Hides a Fragment (calls lifecycle methods and removes from DOM if necessary)\n */\n async hideFragment(fragment: Fragment | string): Promise<void> {\n let ref: Fragment | undefined\n if (typeof fragment === 'string') {\n ref = this.findFragment(fragment)\n } else {\n ref = fragment as Fragment\n }\n if (!ref) {\n throw new Error(`Fragment not found`)\n }\n await ref.onPause()\n ref.state = FragmentState.Paused\n await ref.onStop()\n ref.state = FragmentState.Stopped\n this.removeFragmentStyles(ref)\n // if necessary, you would remove its template content from the DOM\n // however, with rendering logic encapsulated in Fragment, this isn't needed here\n }\n\n findFragment(key: string): Fragment | undefined {\n return this.fragments.get(key)\n }\n\n renderFragment(key: string): TemplateResult | typeof nothing {\n const fragment = this.findFragment(key)\n if (!fragment || fragment.state !== FragmentState.Resumed) {\n return nothing\n }\n return fragment.render() || nothing\n }\n\n updateActiveFragments(): void {\n for (const [, fragment] of this.fragments) {\n if ([FragmentState.Started, FragmentState.Resumed].includes(fragment.state)) {\n fragment.requestUpdate({ app: false, activity: false })\n }\n }\n }\n}\n"]}