diff --git a/jest.config.snapshots.ts b/jest.config.snapshots.ts
index 9175ca209126b5..e2d6cca557fe3e 100644
--- a/jest.config.snapshots.ts
+++ b/jest.config.snapshots.ts
@@ -41,6 +41,7 @@ const swcConfig: SwcOptions = {
const ESM_NODE_MODULES = ['screenfull', 'cbor2', 'nuqs', 'color'];
const config: Config.InitialOptions = {
+ testTimeout: 30_000,
cacheDirectory: '.cache/jest-snapshots',
// testEnvironment and testMatch are the core differences between this and the main config
testEnvironment: 'node',
diff --git a/pyproject.toml b/pyproject.toml
index cbf0f462485b2a..b8882810da83d0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1286,19 +1286,6 @@ module = [
"sentry.release_health.tasks",
"sentry.releases",
"sentry.releases.endpoints.*",
- "sentry.relocation.api.endpoints",
- "sentry.relocation.api.endpoints.abort",
- "sentry.relocation.api.endpoints.cancel",
- "sentry.relocation.api.endpoints.details",
- "sentry.relocation.api.endpoints.index",
- "sentry.relocation.api.endpoints.pause",
- "sentry.relocation.api.endpoints.public_key",
- "sentry.relocation.api.endpoints.recover",
- "sentry.relocation.api.endpoints.retry",
- "sentry.relocation.api.endpoints.unpause",
- "sentry.relocation.models.*",
- "sentry.relocation.tasks.*",
- "sentry.relocation.utils",
"sentry.remote_subscriptions.*",
"sentry.replays",
"sentry.replays._case_studies.*",
diff --git a/src/sentry/dynamic_sampling/per_org/tasks/configuration.py b/src/sentry/dynamic_sampling/per_org/tasks/configuration.py
index 24c91aace8f12f..a7635681759279 100644
--- a/src/sentry/dynamic_sampling/per_org/tasks/configuration.py
+++ b/src/sentry/dynamic_sampling/per_org/tasks/configuration.py
@@ -2,16 +2,20 @@
from abc import ABC, abstractmethod
from collections.abc import Mapping
+from datetime import timedelta
from django.core.exceptions import ObjectDoesNotExist
from sentry import options, quotas
from sentry.constants import SAMPLING_MODE_DEFAULT, TARGET_SAMPLE_RATE_DEFAULT, ObjectStatus
+from sentry.dynamic_sampling.per_org.tasks.queries import get_eap_organization_volume
from sentry.dynamic_sampling.per_org.tasks.telemetry import (
DynamicSamplingException,
DynamicSamplingStatus,
)
from sentry.dynamic_sampling.rules.utils import ProjectId
+from sentry.dynamic_sampling.tasks.common import compute_sliding_window_sample_rate
+from sentry.dynamic_sampling.tasks.helpers.sliding_window import FALLBACK_SLIDING_WINDOW_SIZE
from sentry.dynamic_sampling.types import DynamicSamplingMode, SamplingMeasure
from sentry.dynamic_sampling.utils import has_custom_dynamic_sampling
from sentry.models.options.project_option import ProjectOption
@@ -50,12 +54,17 @@ class BaseDynamicSamplingConfiguration(ABC):
def __init__(self, organization: Organization) -> None:
self.organization = organization
+ self.sliding_window_sample_rate: TargetSampleRate = None
@property
@abstractmethod
def is_enabled(self) -> bool:
raise NotImplementedError
+ @abstractmethod
+ def get_sample_rate(self) -> TargetSampleRate:
+ raise NotImplementedError
+
@property
def is_span_based(self) -> bool:
return self.measure == SamplingMeasure.SPANS
@@ -79,12 +88,15 @@ def _get_projects(self) -> list[Project]:
class NoDynamicSamplingConfiguration(BaseDynamicSamplingConfiguration):
def __init__(self) -> None:
- pass
+ self.sliding_window_sample_rate: TargetSampleRate = None
@property
def is_enabled(self) -> bool:
return False
+ def get_sample_rate(self) -> TargetSampleRate:
+ return None
+
class AutomaticDynamicSamplingConfiguration(BaseDynamicSamplingConfiguration):
sample_rate: TargetSampleRate
@@ -98,12 +110,37 @@ def __init__(self, organization: Organization) -> None:
)
except ObjectDoesNotExist as exc:
raise DynamicSamplingException(DynamicSamplingStatus.NO_SUBSCRIPTION) from exc
+ if not self.is_enabled:
+ return
self.projects = self._get_projects()
+ self.sliding_window_sample_rate = self._get_sliding_window_sample_rate()
@property
def is_enabled(self) -> bool:
return self.sample_rate is not None
+ def get_sample_rate(self) -> TargetSampleRate:
+ if self.sliding_window_sample_rate is not None:
+ return self.sliding_window_sample_rate
+ return self.sample_rate
+
+ def _get_sliding_window_sample_rate(self) -> TargetSampleRate:
+ if not self.projects:
+ return None
+
+ org_volume_24h = get_eap_organization_volume(
+ self, time_interval=timedelta(hours=FALLBACK_SLIDING_WINDOW_SIZE)
+ )
+ if org_volume_24h is None:
+ return None
+
+ return compute_sliding_window_sample_rate(
+ org_id=self.organization.id,
+ project_id=None,
+ total_root_count=org_volume_24h.total,
+ window_size=FALLBACK_SLIDING_WINDOW_SIZE,
+ )
+
class CustomDynamicSamplingOrganizationConfiguration(BaseDynamicSamplingConfiguration):
sample_rate: TargetSampleRate
@@ -121,6 +158,9 @@ def __init__(self, organization: Organization) -> None:
def is_enabled(self) -> bool:
return True
+ def get_sample_rate(self) -> TargetSampleRate:
+ return self.sample_rate
+
class CustomDynamicSamplingProjectConfiguration(BaseDynamicSamplingConfiguration):
project_target_sample_rates: ProjectTargetSampleRates
@@ -138,6 +178,9 @@ def is_enabled(self) -> bool:
sample_rate is not None for sample_rate in self.project_target_sample_rates.values()
)
+ def get_sample_rate(self) -> TargetSampleRate:
+ return None
+
def _get_project_target_sample_rates(self) -> ProjectTargetSampleRates:
project_sample_rates = ProjectOption.objects.get_value_bulk(
self.projects, "sentry:target_sample_rate"
diff --git a/src/sentry/dynamic_sampling/per_org/tasks/queries.py b/src/sentry/dynamic_sampling/per_org/tasks/queries.py
index af77a229a97332..7b18516249105a 100644
--- a/src/sentry/dynamic_sampling/per_org/tasks/queries.py
+++ b/src/sentry/dynamic_sampling/per_org/tasks/queries.py
@@ -5,17 +5,18 @@
from dataclasses import dataclass, field
from datetime import UTC, datetime, timedelta
from enum import StrEnum
-from typing import Any, Literal
+from typing import Any, Literal, Protocol
from sentry_protos.snuba.v1.trace_item_attribute_pb2 import ExtrapolationMode
-from sentry.dynamic_sampling.per_org.tasks.configuration import BaseDynamicSamplingConfiguration
from sentry.dynamic_sampling.rules.utils import ProjectId
from sentry.dynamic_sampling.tasks.boost_low_volume_transactions import ProjectTransactions
from sentry.dynamic_sampling.tasks.common import (
ACTIVE_ORGS_VOLUMES_DEFAULT_TIME_INTERVAL,
OrganizationDataVolume,
)
+from sentry.models.organization import Organization
+from sentry.models.project import Project
from sentry.search.eap.constants import SAMPLING_MODE_HIGHEST_ACCURACY
from sentry.search.eap.types import SearchResolverConfig
from sentry.search.events.types import SnubaParams
@@ -23,6 +24,11 @@
from sentry.snuba.spans_rpc import Spans
+class OrganizationVolumeConfig(Protocol):
+ organization: Organization
+ projects: list[Project]
+
+
class DynamicSamplingQueryFilters(StrEnum):
IS_SEGMENT = "sentry.is_segment:true"
@@ -86,7 +92,7 @@ def run_eap_spans_table_query_in_chunks(
def get_eap_organization_volume(
- config: BaseDynamicSamplingConfiguration,
+ config: OrganizationVolumeConfig,
time_interval: timedelta = ACTIVE_ORGS_VOLUMES_DEFAULT_TIME_INTERVAL,
) -> OrganizationDataVolume | None:
end_time = datetime.now(UTC)
@@ -128,7 +134,7 @@ def get_eap_organization_volume(
def get_eap_project_volumes(
- config: BaseDynamicSamplingConfiguration,
+ config: OrganizationVolumeConfig,
time_interval: timedelta = timedelta(hours=1),
) -> list[ProjectVolume]:
end_time = datetime.now(UTC)
@@ -177,7 +183,7 @@ def get_eap_project_volumes(
def get_eap_transaction_volumes(
- config: BaseDynamicSamplingConfiguration,
+ config: OrganizationVolumeConfig,
time_interval: timedelta = ACTIVE_ORGS_VOLUMES_DEFAULT_TIME_INTERVAL,
order_by_volume: Literal["asc", "desc"] = "asc",
max_transactions: int = 100,
diff --git a/src/sentry/dynamic_sampling/per_org/tasks/scheduler.py b/src/sentry/dynamic_sampling/per_org/tasks/scheduler.py
index 86b92bcaa5de1c..6a710e6178292b 100644
--- a/src/sentry/dynamic_sampling/per_org/tasks/scheduler.py
+++ b/src/sentry/dynamic_sampling/per_org/tasks/scheduler.py
@@ -108,8 +108,8 @@ def run_calculations_per_org_task(org_id: OrganizationId) -> DynamicSamplingStat
if not config.projects:
return DynamicSamplingStatus.ORG_HAS_NO_PROJECTS
- org_volume = get_eap_organization_volume(config)
- if org_volume is None:
+ org_volume_5m = get_eap_organization_volume(config)
+ if org_volume_5m is None:
return DynamicSamplingStatus.NO_ORG_VOLUME
if config.should_balance_projects:
diff --git a/src/sentry/features/temporary.py b/src/sentry/features/temporary.py
index 25c6aa355cbe8e..3bd5327635ed7b 100644
--- a/src/sentry/features/temporary.py
+++ b/src/sentry/features/temporary.py
@@ -289,8 +289,6 @@ def register_temporary_features(manager: FeatureManager) -> None:
manager.add("organizations:seer-wizard", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable the Seer issues view
manager.add("organizations:seer-issue-view", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
- # Enable Autofix to use Seer Agent instead of legacy Celery pipeline
- manager.add("organizations:autofix-on-explorer", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable autofix introspection for early stopping of autofix runs
manager.add("organizations:seer-autofix-introspection", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable Seer Workflows in Slack (released, kept until overrides are removed)
diff --git a/src/sentry/integrations/discord/integration.py b/src/sentry/integrations/discord/integration.py
index 06430ac58c1671..0acb6959223f6a 100644
--- a/src/sentry/integrations/discord/integration.py
+++ b/src/sentry/integrations/discord/integration.py
@@ -148,6 +148,19 @@ class DiscordOAuthApiSerializer(CamelSnakeSerializer):
guild_id = CharField(required=True)
+class DiscordInitialDataSerializer(CamelSnakeSerializer):
+ """Initial pipeline data for App Directory-originated Discord installs.
+
+ When a user installs from Discord's App Directory, Discord initiates OAuth
+ and redirects back to Sentry with `code` and `guild_id`. The frontend
+ forwards them here so the pipeline can skip its own OAuth step.
+ """
+
+ code = CharField(required=False)
+ guild_id = CharField(required=False)
+ use_configure = CharField(required=False)
+
+
class DiscordOAuthApiStep:
"""API-mode OAuth step for Discord integration setup.
@@ -170,7 +183,18 @@ def __init__(
self.scopes = scopes
self.redirect_url = redirect_url
- def get_step_data(self, pipeline: IntegrationPipeline, request: HttpRequest) -> dict[str, str]:
+ def get_step_data(self, pipeline: IntegrationPipeline, request: HttpRequest) -> dict[str, Any]:
+ # App Directory installs arrive with OAuth already complete: code and
+ # guild_id are bound to state via initialData. Signal the frontend to
+ # advance immediately using those values instead of opening a popup.
+ if pipeline.fetch_state("use_configure"):
+ return {
+ "appDirectoryInstall": True,
+ "code": pipeline.fetch_state("code"),
+ "guildId": pipeline.fetch_state("guild_id"),
+ "state": pipeline.signature,
+ }
+
params = urlencode(
{
"client_id": self.client_id,
@@ -245,6 +269,9 @@ def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
),
]
+ def get_initial_data_serializer_cls(self) -> type[DiscordInitialDataSerializer]:
+ return DiscordInitialDataSerializer
+
def build_integration(self, state: Mapping[str, Any]) -> IntegrationData:
guild_id = str(state.get("guild_id"))
@@ -258,11 +285,9 @@ def build_integration(self, state: Mapping[str, Any]) -> IntegrationData:
except (ApiError, AttributeError):
guild_name = guild_id
- discord_config = state.get(IntegrationProviderSlug.DISCORD.value, {})
- if isinstance(discord_config, dict):
- use_configure = discord_config.get("use_configure") == "1"
- else:
- use_configure = False
+ # App Directory installs initiated OAuth with configure_url as the
+ # redirect_uri, so token exchange must echo it back.
+ use_configure = state.get("use_configure") == "1"
url = self.configure_url if use_configure else self.setup_url
auth_code = str(state.get("code"))
diff --git a/src/sentry/integrations/discord/urls.py b/src/sentry/integrations/discord/urls.py
index 2e6657bc57758c..7ae5b50b64ac70 100644
--- a/src/sentry/integrations/discord/urls.py
+++ b/src/sentry/integrations/discord/urls.py
@@ -1,9 +1,7 @@
from django.urls import re_path
from sentry.integrations.discord.spec import DiscordMessagingSpec
-from sentry.integrations.web.discord_extension_configuration import (
- DiscordExtensionConfigurationView,
-)
+from sentry.integrations.discord.views.configure_redirect import DiscordConfigureRedirectView
from .webhooks.base import DiscordInteractionsEndpoint
@@ -13,10 +11,12 @@
DiscordInteractionsEndpoint.as_view(),
name="sentry-integration-discord-interactions",
),
- # Discord App Directory extension install flow
+ # Discord App Directory's redirect_uri lands here after the user authorizes
+ # in Discord. We forward the OAuth params to the link view, which opens the
+ # install pipeline modal to finish the install.
re_path(
r"^configure/$",
- DiscordExtensionConfigurationView.as_view(),
+ DiscordConfigureRedirectView.as_view(),
name="discord-extension-configuration",
),
]
diff --git a/src/sentry/integrations/discord/views/configure_redirect.py b/src/sentry/integrations/discord/views/configure_redirect.py
new file mode 100644
index 00000000000000..d9f7145fa9324e
--- /dev/null
+++ b/src/sentry/integrations/discord/views/configure_redirect.py
@@ -0,0 +1,16 @@
+from django.views.generic.base import RedirectView
+
+from sentry.web.frontend.base import control_silo_view
+
+
+@control_silo_view
+class DiscordConfigureRedirectView(RedirectView):
+ """OAuth redirect target for Discord App Directory installs.
+
+ Forwards `code` and `guild_id` from Discord's OAuth callback to the
+ integration link view, which picks an org and opens the install pipeline.
+ """
+
+ url = "/extensions/discord/link/"
+ query_string = True
+ permanent = False
diff --git a/src/sentry/integrations/web/discord_extension_configuration.py b/src/sentry/integrations/web/discord_extension_configuration.py
deleted file mode 100644
index 854cabf32982af..00000000000000
--- a/src/sentry/integrations/web/discord_extension_configuration.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from sentry.integrations.types import IntegrationProviderSlug
-from sentry.web.frontend.base import control_silo_view
-
-from .integration_extension_configuration import IntegrationExtensionConfigurationView
-
-
-@control_silo_view
-class DiscordExtensionConfigurationView(IntegrationExtensionConfigurationView):
- provider = IntegrationProviderSlug.DISCORD.value
- external_provider_key = IntegrationProviderSlug.DISCORD.value
-
- def map_params_to_state(self, params):
- return {"use_configure": "1", **params}
diff --git a/src/sentry/middleware/integrations/parsers/discord.py b/src/sentry/middleware/integrations/parsers/discord.py
index 390e84ff8c1d38..041a45540c62aa 100644
--- a/src/sentry/middleware/integrations/parsers/discord.py
+++ b/src/sentry/middleware/integrations/parsers/discord.py
@@ -12,6 +12,7 @@
from sentry.hybridcloud.outbox.category import WebhookProviderIdentifier
from sentry.integrations.discord.message_builder.base.flags import EPHEMERAL_FLAG
from sentry.integrations.discord.requests.base import DiscordRequest, DiscordRequestError
+from sentry.integrations.discord.views.configure_redirect import DiscordConfigureRedirectView
from sentry.integrations.discord.views.link_identity import DiscordLinkIdentityView
from sentry.integrations.discord.views.unlink_identity import DiscordUnlinkIdentityView
from sentry.integrations.discord.webhooks.base import DiscordInteractionsEndpoint
@@ -22,9 +23,6 @@
)
from sentry.integrations.models.integration import Integration
from sentry.integrations.types import EXTERNAL_PROVIDERS, ExternalProviders
-from sentry.integrations.web.discord_extension_configuration import (
- DiscordExtensionConfigurationView,
-)
from sentry.middleware.integrations.tasks import convert_to_async_discord_response
from sentry.types.cell import Cell
@@ -38,7 +36,7 @@ class DiscordRequestParser(BaseRequestParser):
control_classes = [
DiscordLinkIdentityView,
DiscordUnlinkIdentityView,
- DiscordExtensionConfigurationView,
+ DiscordConfigureRedirectView,
]
# Dynamically set to avoid RawPostDataException from double reads
diff --git a/src/sentry/relocation/api/endpoints/index.py b/src/sentry/relocation/api/endpoints/index.py
index e6a44d5cbcdbc2..f9e5c6d573e477 100644
--- a/src/sentry/relocation/api/endpoints/index.py
+++ b/src/sentry/relocation/api/endpoints/index.py
@@ -3,6 +3,7 @@
from datetime import timedelta
from functools import reduce
from string import Template
+from typing import Any
from django.db import router
from django.db.models import Q
@@ -53,7 +54,7 @@
RELOCATION_FILE_SIZE_MEDIUM = 100 * 1024**2
-def get_relocation_size_category(size) -> str:
+def get_relocation_size_category(size: int) -> str:
if size < RELOCATION_FILE_SIZE_SMALL:
return "small"
elif size < RELOCATION_FILE_SIZE_MEDIUM:
@@ -81,7 +82,7 @@ def should_throttle_relocation(relocation_bucket_size: str) -> bool:
return True
-class RelocationsPostSerializer(serializers.Serializer):
+class RelocationsPostSerializer(serializers.Serializer[dict[str, Any]]):
file = serializers.FileField(required=True)
orgs = serializers.CharField(required=True, allow_blank=False, allow_null=False)
owner = serializers.CharField(
diff --git a/src/sentry/relocation/models/relocation.py b/src/sentry/relocation/models/relocation.py
index 3e9e9891ecb84b..42406e23fab43b 100644
--- a/src/sentry/relocation/models/relocation.py
+++ b/src/sentry/relocation/models/relocation.py
@@ -12,7 +12,7 @@
from sentry.db.models.fields.uuid import UUIDField
-def default_guid():
+def default_guid() -> str:
return uuid4().hex
@@ -57,7 +57,7 @@ def get_in_progress_choices(cls) -> list[tuple[int, str]]:
return [(key.value, key.name) for key in cls if key.name != "COMPLETED"]
@classmethod
- def max_value(cls):
+ def max_value(cls) -> int:
return max(item.value for item in cls)
class Status(Enum):
@@ -242,7 +242,7 @@ def __str__(self) -> str:
else:
raise ValueError("Cannot extract a filename from `RelocationFile.Kind.UNKNOWN`.")
- def to_filename(self, ext: str):
+ def to_filename(self, ext: str) -> str:
return str(self) + "." + ext
relocation = FlexibleForeignKey("sentry.Relocation")
diff --git a/src/sentry/relocation/tasks/process.py b/src/sentry/relocation/tasks/process.py
index 9b7341f075cea6..72db7295c9cdb7 100644
--- a/src/sentry/relocation/tasks/process.py
+++ b/src/sentry/relocation/tasks/process.py
@@ -971,11 +971,11 @@ class NextTask:
the task to be scheduled at some later point in the execution.
"""
- task: Task
+ task: Task[..., Any]
args: list[Any]
countdown: int | None = None
- def schedule(self):
+ def schedule(self) -> None:
"""
Run the `.apply_async()` call defined by this future.
"""
@@ -1126,7 +1126,7 @@ def validating_start(uuid: str) -> None:
):
cb_client = CloudBuildClient()
- def camel_to_snake_keep_underscores(value):
+ def camel_to_snake_keep_underscores(value: str) -> str:
match = re.search(r"(_++)$", value)
converted = camel_to_snake_case(value)
return converted + (match.group(0) if match else "")
@@ -1708,11 +1708,11 @@ def completed(uuid: str) -> None:
processing_deadline_duration=FAST_TIME_LIMIT,
silo_mode=SiloMode.CELL,
)
-def noop():
+def noop() -> None:
pass
-TASK_MAP: dict[OrderedTask, Task] = {
+TASK_MAP: dict[OrderedTask, Task[..., Any]] = {
OrderedTask.NONE: noop,
OrderedTask.UPLOADING_START: uploading_start,
OrderedTask.UPLOADING_COMPLETE: uploading_complete,
@@ -1735,7 +1735,7 @@ def noop():
assert set(OrderedTask._member_map_.keys()) == {k.name for k in TASK_MAP.keys()}
-def get_first_task_for_step(target_step: Relocation.Step) -> Task | None:
+def get_first_task_for_step(target_step: Relocation.Step) -> Task[..., Any] | None:
min_task: OrderedTask | None = None
for ordered_task, step in TASK_TO_STEP.items():
if step == target_step:
diff --git a/src/sentry/relocation/tasks/transfer.py b/src/sentry/relocation/tasks/transfer.py
index 6e6b314b4e3e4e..c1e0f25c11a791 100644
--- a/src/sentry/relocation/tasks/transfer.py
+++ b/src/sentry/relocation/tasks/transfer.py
@@ -1,4 +1,5 @@
import logging
+from typing import Any
from django.db.models import Subquery
from django.utils import timezone
@@ -46,7 +47,7 @@ def find_relocation_transfer_region() -> None:
def _find_relocation_transfer(
model_cls: type[BaseRelocationTransfer],
- process_task: Task,
+ process_task: Task[..., Any],
) -> None:
"""
Advance the scheduled_for time for all transfers that are
diff --git a/src/sentry/relocation/utils.py b/src/sentry/relocation/utils.py
index 0b42c92dd7b882..2191085490efad 100644
--- a/src/sentry/relocation/utils.py
+++ b/src/sentry/relocation/utils.py
@@ -650,7 +650,7 @@ def make_cloudbuild_step_args(indent: int, args: list[str]) -> str:
# The set of arguments to invoke a "docker compose" in a cloudbuild step is tedious and repetitive -
# better to just handle it here.
@lru_cache(maxsize=1)
-def get_docker_compose_cmd():
+def get_docker_compose_cmd() -> str:
return make_cloudbuild_step_args(
3,
[
@@ -666,7 +666,7 @@ def get_docker_compose_cmd():
# The set of arguments to invoke a "docker compose run" in a cloudbuild step is tedious and
# repetitive - better to just handle it here.
@lru_cache(maxsize=1)
-def get_docker_compose_run():
+def get_docker_compose_run() -> str:
return make_cloudbuild_step_args(
3,
[
@@ -678,7 +678,7 @@ def get_docker_compose_run():
@lru_cache(maxsize=1)
-def get_relocations_bucket_name():
+def get_relocations_bucket_name() -> str:
"""
When using the local FileSystemStorage (ie, in tests), we use a contrived bucket name, since
this is really just an alias for a bespoke local directory in that case.
diff --git a/src/sentry/search/snuba/backend.py b/src/sentry/search/snuba/backend.py
index 5d54321b08d33a..79f0ea594fafcf 100644
--- a/src/sentry/search/snuba/backend.py
+++ b/src/sentry/search/snuba/backend.py
@@ -12,7 +12,7 @@
from django.utils import timezone
from django.utils.functional import SimpleLazyObject
-from sentry import features, quotas
+from sentry import quotas
from sentry.api.event_search import SearchFilter
from sentry.db.models.manager.base_query_set import BaseQuerySet
from sentry.exceptions import InvalidSearchQuery
@@ -595,11 +595,7 @@ def _get_queryset_conditions(
"issue.type": QCallbackCondition(lambda types: Q(type__in=types)),
"issue.priority": QCallbackCondition(lambda priorities: Q(priority__in=priorities)),
"issue.seer_actionability": QCallbackCondition(seer_actionability_filter),
- "issue.seer_last_run": ScalarCondition(
- "seer_explorer_autofix_last_triggered"
- if features.has("organizations:autofix-on-explorer", organization)
- else "seer_autofix_last_triggered"
- ),
+ "issue.seer_last_run": ScalarCondition("seer_explorer_autofix_last_triggered"),
"issue.id": QCallbackCondition(
lambda ids: Q(id__in=[int(v) for v in (ids if isinstance(ids, list) else [ids])])
),
diff --git a/src/sentry/seer/agent/client_utils.py b/src/sentry/seer/agent/client_utils.py
index 07b9e3d2eb584d..591297a8312a26 100644
--- a/src/sentry/seer/agent/client_utils.py
+++ b/src/sentry/seer/agent/client_utils.py
@@ -208,24 +208,7 @@ def has_seer_agent_access_with_detail(
if not has_access:
return False, error
- feature_names = [
- # Access to seer agent
- "organizations:seer-explorer",
- # Access to seer agent powered autofix
- "organizations:autofix-on-explorer",
- ]
-
- batch_features = features.batch_has(
- feature_names,
- organization=organization,
- actor=actor,
- )
-
- if batch_features is None:
- return False, "Feature flag not enabled"
-
- org_features = batch_features.get(f"organization:{organization.id}", {})
- if not any(bool(org_features.get(feature_name)) for feature_name in feature_names):
+ if not features.has("organizations:seer-explorer", organization, actor=actor):
return False, "Feature flag not enabled"
# Check open team membership (the agent requires this for context)
diff --git a/src/sentry/seer/autofix/issue_summary.py b/src/sentry/seer/autofix/issue_summary.py
index ff6ce342973c88..af3e22daff94cd 100644
--- a/src/sentry/seer/autofix/issue_summary.py
+++ b/src/sentry/seer/autofix/issue_summary.py
@@ -18,7 +18,7 @@
from sentry.locks import locks
from sentry.models.group import Group
from sentry.net.http import connection_from_url
-from sentry.seer.autofix.autofix import _get_trace_tree_for_event, trigger_legacy_autofix
+from sentry.seer.autofix.autofix import _get_trace_tree_for_event
from sentry.seer.autofix.autofix_agent import (
AutofixStep,
NoSeerQuotaException,
@@ -52,7 +52,6 @@
from sentry.taskworker.namespaces import seer_tasks
from sentry.users.models.user import User
from sentry.users.services.user.model import RpcUser
-from sentry.users.services.user.service import user_service
from sentry.utils.cache import cache
from sentry.utils.locking import UnableToAcquireLock
@@ -176,41 +175,17 @@ def _trigger_autofix_task(
}
)
- user: User | AnonymousUser | RpcUser | None = None
- if user_id:
- user = user_service.get_user(user_id=user_id)
- if user is None:
- logger.warning(
- "_trigger_autofix_task.user_not_found",
- extra={"group_id": group_id, "user_id": user_id},
- )
- user = AnonymousUser()
- else:
- user = AnonymousUser()
-
- # Route to agent-based autofix if both feature flags are enabled
run_id: int | None = None
- if features.has("organizations:autofix-on-explorer", group.organization):
- try:
- run_id = trigger_autofix_agent(
- group=group,
- step=AutofixStep.ROOT_CAUSE,
- referrer=referrer,
- run_id=None,
- stopping_point=stopping_point,
- )
- except NoSeerQuotaException:
- pass
- else:
- response = trigger_legacy_autofix(
+ try:
+ run_id = trigger_autofix_agent(
group=group,
- event_id=event_id,
- user=user,
+ step=AutofixStep.ROOT_CAUSE,
referrer=referrer,
- auto_run_source=auto_run_source,
+ run_id=None,
stopping_point=stopping_point,
)
- run_id = response.data.get("run_id")
+ except NoSeerQuotaException:
+ pass
if run_id and SeerAutofixOperator.has_access(organization=group.project.organization):
SeerOperatorAutofixCache.migrate(from_group_id=group_id, to_run_id=run_id)
diff --git a/src/sentry/seer/entrypoints/operator.py b/src/sentry/seer/entrypoints/operator.py
index 2eee7b381a3ba8..739b1eb9033199 100644
--- a/src/sentry/seer/entrypoints/operator.py
+++ b/src/sentry/seer/entrypoints/operator.py
@@ -1,8 +1,6 @@
import logging
from typing import Any
-from rest_framework.response import Response
-
from sentry import features
from sentry.constants import DataCategory
from sentry.models.activity import Activity
@@ -13,20 +11,8 @@
from sentry.seer.agent.client_models import CodingAgentState, SeerRunState
from sentry.seer.agent.client_utils import fetch_run_status
from sentry.seer.agent.on_completion_hook import AgentOnCompletionHook
-from sentry.seer.autofix.autofix import trigger_legacy_autofix, update_legacy_autofix
-from sentry.seer.autofix.constants import AutofixReferrer, AutofixStatus
-from sentry.seer.autofix.types import (
- AutofixCreatePRPayload,
- AutofixSelectRootCausePayload,
- AutofixSelectSolutionPayload,
-)
-from sentry.seer.autofix.utils import (
- AutofixState,
- AutofixStoppingPoint,
- get_autofix_state,
- get_automation_handoff,
-)
-from sentry.seer.autofix.utils import CodingAgentState as LegacyCodingAgentState
+from sentry.seer.autofix.constants import AutofixReferrer
+from sentry.seer.autofix.utils import AutofixStoppingPoint, get_automation_handoff
from sentry.seer.entrypoints.cache import SeerOperatorAgentCache, SeerOperatorAutofixCache
from sentry.seer.entrypoints.metrics import (
SeerOperatorEventLifecycleMetric,
@@ -67,7 +53,6 @@
# entrypoint's ability to receive updates from those triggers. So 12 is plenty, even accounting for
# incidents, since a run should not take nearly that long to complete.
PROCESS_AUTOFIX_TIMEOUT_SECONDS = 60 * 5 # 5 minutes
-AUTOFIX_FALLBACK_CAUSE_ID = 0
def has_seer_autofix_entrypoint_access(
@@ -149,22 +134,13 @@ def trigger_autofix(
instruction: str | None = None,
run_id: int | None = None,
) -> None:
- if features.has("organizations:autofix-on-explorer", group.organization):
- self.trigger_autofix_agent(
- group=group,
- user=user,
- stopping_point=stopping_point,
- instruction=instruction,
- run_id=run_id,
- )
- else:
- self.trigger_autofix_legacy(
- group=group,
- user=user,
- stopping_point=stopping_point,
- instruction=instruction,
- run_id=run_id,
- )
+ self.trigger_autofix_agent(
+ group=group,
+ user=user,
+ stopping_point=stopping_point,
+ instruction=instruction,
+ run_id=run_id,
+ )
def trigger_autofix_agent(
self,
@@ -352,17 +328,8 @@ def trigger_handoff(
)
try:
- coding_agents: list[CodingAgentState] | list[LegacyCodingAgentState]
- if features.has("organizations:autofix-on-explorer", group.organization):
- agent_state = fetch_run_status(run_id=run_id, organization=group.organization)
- coding_agents = list(agent_state.coding_agents.values())
- else:
- autofix_state = get_autofix_state(
- run_id=run_id, organization_id=group.organization.id
- )
- coding_agents = (
- list(autofix_state.coding_agents.values()) if autofix_state else []
- )
+ agent_state = fetch_run_status(run_id=run_id, organization=group.organization)
+ coding_agents: list[CodingAgentState] = list(agent_state.coding_agents.values())
except Exception as e:
with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_HANDOFF_ERROR,
@@ -419,162 +386,6 @@ def trigger_handoff(
).capture():
self.entrypoint.on_trigger_handoff_success(run_id=run_id, target=target)
- def trigger_autofix_legacy(
- self,
- *,
- group: Group,
- user: User | RpcUser,
- stopping_point: AutofixStoppingPoint,
- instruction: str | None = None,
- run_id: int | None = None,
- ) -> None:
- event_lifecyle = SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.OPERATOR_TRIGGER_AUTOFIX,
- entrypoint_key=self.entrypoint.key,
- )
-
- raw_response: Response | None = None
- with event_lifecyle.capture() as lifecycle:
- lifecycle.add_extras(
- {
- "group_id": str(group.id),
- "user_id": str(user.id),
- "stopping_point": str(stopping_point),
- }
- )
- try:
- existing_state = get_autofix_state(
- group_id=group.id, organization_id=group.organization.id
- )
- except Exception as e:
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_ERROR,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- self.entrypoint.on_trigger_autofix_error(
- error="Encountered an error while talking to Seer"
- )
- lifecycle.record_failure(failure_reason=e)
- return
- if existing_state:
- stopping_point_step = get_stopping_point_status(stopping_point, existing_state)
- lifecycle.add_extras(
- {
- "existing_run_id": str(existing_state.run_id),
- "existing_run_status": str(existing_state.status),
- }
- )
- # For now, we don't support re-runs over slack -- it causes a confusing UX without
- # reliably being able to edit messages.
- if stopping_point_step:
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_ALREADY_EXISTS,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- has_complete_stage = (
- False
- if stopping_point_step.get("key")
- in {"root_cause_analysis_processing", "solution_processing"}
- else stopping_point_step.get("status") == AutofixStatus.COMPLETED
- )
- self.entrypoint.on_trigger_autofix_already_exists(
- run_id=existing_state.run_id,
- has_complete_stage=has_complete_stage,
- )
- return
-
- if not run_id:
- raw_response = trigger_legacy_autofix(
- group=group,
- user=user,
- referrer=AutofixReferrer.SLACK,
- instruction=instruction,
- stopping_point=stopping_point,
- )
- else:
- payload: (
- AutofixSelectRootCausePayload
- | AutofixSelectSolutionPayload
- | AutofixCreatePRPayload
- | None
- ) = None
- if stopping_point == AutofixStoppingPoint.SOLUTION:
- payload = AutofixSelectRootCausePayload(
- type="select_root_cause",
- cause_id=get_latest_cause_id(existing_state),
- )
- elif stopping_point == AutofixStoppingPoint.CODE_CHANGES:
- payload = AutofixSelectSolutionPayload(type="select_solution")
- elif stopping_point == AutofixStoppingPoint.OPEN_PR:
- payload = AutofixCreatePRPayload(type="create_pr")
- else:
- lifecycle.record_failure(failure_reason="invalid_stopping_point")
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_ERROR,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- self.entrypoint.on_trigger_autofix_error(
- error="Invalid stopping point provided"
- )
- return
-
- raw_response = update_legacy_autofix(
- organization_id=group.organization.id,
- run_id=run_id,
- payload=payload,
- )
-
- error_message = raw_response.data.get("detail")
-
- # Let the entrypoint signal to the external service that no run was started :/
- if error_message:
- lifecycle.record_failure(failure_reason=error_message)
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_ERROR,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- self.entrypoint.on_trigger_autofix_error(error=error_message)
- return
-
- run_id = raw_response.data.get("run_id") if not run_id else run_id
- if not run_id:
- lifecycle.record_failure(failure_reason="no_run_id")
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_ERROR,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- self.entrypoint.on_trigger_autofix_error(error="An unknown error has occurred")
- return
- lifecycle.add_extra("run_id", str(run_id))
-
- # Let the entrypoint signal to the external service that the run started
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_AUTOFIX_SUCCESS,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- self.entrypoint.on_trigger_autofix_success(run_id=run_id)
-
- # Create a cache payload that will be picked up for subsequent updates
- with SeerOperatorEventLifecycleMetric(
- interaction_type=SeerOperatorInteractionType.ENTRYPOINT_CREATE_AUTOFIX_CACHE_PAYLOAD,
- entrypoint_key=self.entrypoint.key,
- ).capture():
- cache_payload = self.entrypoint.create_autofix_cache_payload()
-
- if not cache_payload:
- return
- cache_result = SeerOperatorAutofixCache.populate_post_autofix_cache(
- entrypoint_key=str(self.entrypoint.key),
- cache_payload=cache_payload,
- run_id=run_id,
- )
- lifecycle.add_extras(
- {
- "cache_key": cache_result["key"],
- "cache_source": cache_result["source"],
- }
- )
-
def has_seer_agent_entrypoint_access(
*,
@@ -879,44 +690,6 @@ def process_autofix_updates(
ept_lifecycle.record_failure(failure_reason=e)
-def get_stopping_point_status(
- stopping_point: AutofixStoppingPoint, autofix_state: AutofixState
-) -> dict | None:
- """
- Gets the most recent matching step state from a given stopping point.
- """
- # The most recent of a repeated step is at the end of the list, that's what we want to surface
- steps = reversed(autofix_state.steps)
- match stopping_point:
- case AutofixStoppingPoint.ROOT_CAUSE:
- step = next(
- (
- step
- for step in steps
- if step.get("key") in {"root_cause_analysis", "root_cause_analysis_processing"}
- ),
- None,
- )
- case AutofixStoppingPoint.SOLUTION:
- step = next(
- (step for step in steps if step.get("key") in {"solution", "solution_processing"}),
- None,
- )
- case AutofixStoppingPoint.CODE_CHANGES:
- step = next((step for step in steps if step.get("key") == "changes"), None)
- case AutofixStoppingPoint.OPEN_PR:
- step = next(
- (
- step
- for step in steps
- if step.get("key") == "changes"
- and any(change.get("pull_request") for change in step.get("changes", []))
- ),
- None,
- )
- return step
-
-
def get_autofix_explorer_status(
stopping_point: AutofixStoppingPoint, autofix_state: SeerRunState
) -> bool | None:
@@ -975,32 +748,6 @@ def get_autofix_explorer_status(
return None
-def get_latest_cause_id(autofix_state: AutofixState | None) -> int:
- """
- Gets the latest cause_id from a given autofix state.
- """
- if not autofix_state:
- return AUTOFIX_FALLBACK_CAUSE_ID
- root_cause_step = next(
- (
- step
- # If there are multiple RCA steps, we want the latest, so we reverse the list
- for step in reversed(autofix_state.steps)
- if step.get("key") == "root_cause_analysis"
- ),
- None,
- )
- if not root_cause_step:
- return AUTOFIX_FALLBACK_CAUSE_ID
-
- root_causes = root_cause_step.get("causes", [])
- if not root_causes:
- return AUTOFIX_FALLBACK_CAUSE_ID
-
- # The most recent cause is at the end of the list
- return root_causes[-1].get("id", AUTOFIX_FALLBACK_CAUSE_ID)
-
-
class SeerOperatorCompletionHook(AgentOnCompletionHook):
"""Completion hook that notifies all entrypoints when a Seer Agent run finishes.
diff --git a/static/app/components/charts/chartWidgetLoader.tsx b/static/app/components/charts/chartWidgetLoader.tsx
index eeb3c1be5fab86..4ba7a2730c036b 100644
--- a/static/app/components/charts/chartWidgetLoader.tsx
+++ b/static/app/components/charts/chartWidgetLoader.tsx
@@ -5,7 +5,7 @@ import {Placeholder} from 'sentry/components/placeholder';
import {t} from 'sentry/locale';
import type {ReactEchartsRef} from 'sentry/types/echarts';
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
-import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/streamline/eventGraphWidget';
+import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/eventGraphWidget';
export type ChartId = keyof typeof CHART_MAP;
interface Props extends LoadableChartWidgetProps {
@@ -18,8 +18,7 @@ interface Props extends LoadableChartWidgetProps {
}
// We need to map the widget id to the dynamic import because we want the import paths to be statically analyzable.
const CHART_MAP = {
- [EVENT_GRAPH_WIDGET_ID]: () =>
- import('sentry/views/issueDetails/streamline/eventGraphWidget'),
+ [EVENT_GRAPH_WIDGET_ID]: () => import('sentry/views/issueDetails/eventGraphWidget'),
} satisfies Record Promise<{default: React.FC}>>;
/**
diff --git a/static/app/components/events/autofix/v3/content.tsx b/static/app/components/events/autofix/v3/content.tsx
index 6a0d138fab09f5..37c5412400e19a 100644
--- a/static/app/components/events/autofix/v3/content.tsx
+++ b/static/app/components/events/autofix/v3/content.tsx
@@ -24,7 +24,7 @@ import {Placeholder} from 'sentry/components/placeholder';
import {IconClose} from 'sentry/icons';
import {t} from 'sentry/locale';
import type {Group} from 'sentry/types/group';
-import type {useAiConfig} from 'sentry/views/issueDetails/streamline/hooks/useAiConfig';
+import type {useAiConfig} from 'sentry/views/issueDetails/hooks/useAiConfig';
interface SeerDrawerContentProps {
aiConfig: ReturnType;
diff --git a/static/app/components/events/autofix/v3/drawer.tsx b/static/app/components/events/autofix/v3/drawer.tsx
index b3952c1671f96c..da89552d27bcc0 100644
--- a/static/app/components/events/autofix/v3/drawer.tsx
+++ b/static/app/components/events/autofix/v3/drawer.tsx
@@ -19,7 +19,7 @@ import type {Project} from 'sentry/types/project';
import {defined} from 'sentry/utils';
import {useAutoScroll} from 'sentry/utils/useAutoScroll';
import {useCopyToClipboard} from 'sentry/utils/useCopyToClipboard';
-import {useAiConfig} from 'sentry/views/issueDetails/streamline/hooks/useAiConfig';
+import {useAiConfig} from 'sentry/views/issueDetails/hooks/useAiConfig';
interface SeerDrawerProps {
group: Group;
diff --git a/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx b/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
index c293bd388cbe4e..a1685c6ed6d655 100644
--- a/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
+++ b/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
@@ -32,8 +32,8 @@ import type {Project} from 'sentry/types/project';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface BreadcrumbsDataSectionProps {
event: Event;
diff --git a/static/app/components/events/contexts/contextDataSection.tsx b/static/app/components/events/contexts/contextDataSection.tsx
index dc1941696ca1b3..f08ad447b59cde 100644
--- a/static/app/components/events/contexts/contextDataSection.tsx
+++ b/static/app/components/events/contexts/contextDataSection.tsx
@@ -5,8 +5,8 @@ import {KeyValueData} from 'sentry/components/keyValueData';
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface ContextDataSectionProps {
event: Event;
diff --git a/static/app/components/events/device.tsx b/static/app/components/events/device.tsx
index fb180f41ff83f1..40bd38765782c1 100644
--- a/static/app/components/events/device.tsx
+++ b/static/app/components/events/device.tsx
@@ -1,8 +1,8 @@
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {KeyValueList} from './interfaces/keyValueList';
diff --git a/static/app/components/events/eventAttachments.tsx b/static/app/components/events/eventAttachments.tsx
index 5d0dff420e4a53..9345f675e1dba6 100644
--- a/static/app/components/events/eventAttachments.tsx
+++ b/static/app/components/events/eventAttachments.tsx
@@ -18,9 +18,9 @@ import type {Group, IssueAttachment} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {InlineEventAttachment} from 'sentry/views/issueDetails/groupEventAttachments/inlineEventAttachment';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
diff --git a/static/app/components/events/eventDrawer.tsx b/static/app/components/events/eventDrawer.tsx
index 99678c507bd7dd..51b4be494c7833 100644
--- a/static/app/components/events/eventDrawer.tsx
+++ b/static/app/components/events/eventDrawer.tsx
@@ -6,7 +6,7 @@ import {InputGroup} from '@sentry/scraps/input';
import {Flex, type FlexProps} from '@sentry/scraps/layout';
import {Breadcrumbs as NavigationBreadcrumbs} from 'sentry/components/breadcrumbs';
-import {MIN_NAV_HEIGHT} from 'sentry/views/issueDetails/streamline/eventTitle';
+import {MIN_NAV_HEIGHT} from 'sentry/views/issueDetails/eventTitle';
import {
NAVIGATION_MOBILE_TOPBAR_HEIGHT_WITH_PAGE_FRAME,
PRIMARY_HEADER_HEIGHT,
diff --git a/static/app/components/events/eventEvidence.tsx b/static/app/components/events/eventEvidence.tsx
index 6a623292ae3a93..63dd4da126e83f 100644
--- a/static/app/components/events/eventEvidence.tsx
+++ b/static/app/components/events/eventEvidence.tsx
@@ -8,8 +8,8 @@ import {
getConfigForIssueType,
getIssueCategoryAndTypeFromOccurrenceType,
} from 'sentry/utils/issueTypeConfig';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type EvidenceProps = {
event: Event;
diff --git a/static/app/components/events/eventExtraData/index.tsx b/static/app/components/events/eventExtraData/index.tsx
index 90bf932a23137e..284bdb2d877de9 100644
--- a/static/app/components/events/eventExtraData/index.tsx
+++ b/static/app/components/events/eventExtraData/index.tsx
@@ -11,8 +11,8 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {defined} from 'sentry/utils';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {getEventExtraDataKnownDataDetails} from './getEventExtraDataKnownDataDetails';
import type {EventExtraDataType, EventExtraData as TEventExtraData} from './types';
diff --git a/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx b/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
index cc9d285311ccac..ae7577cd5de303 100644
--- a/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
+++ b/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
@@ -18,8 +18,8 @@ import type {Group} from 'sentry/types/group';
import {getReplayDiffOffsetsFromEvent} from 'sentry/utils/replays/getDiffTimestamps';
import {useLoadReplayReader} from 'sentry/utils/replays/hooks/useLoadReplayReader';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface Props {
event: Event;
diff --git a/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx b/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
index 83207eda032e97..6c2f887e1f9e21 100644
--- a/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
+++ b/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
@@ -11,9 +11,9 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface Props {
event: Event;
diff --git a/static/app/components/events/eventInsightDiff.tsx b/static/app/components/events/eventInsightDiff.tsx
index 740c02f7a466c3..c183733f11c968 100644
--- a/static/app/components/events/eventInsightDiff.tsx
+++ b/static/app/components/events/eventInsightDiff.tsx
@@ -11,8 +11,8 @@ import {
type MetricIds,
useSizeAnalysisComparison,
} from 'sentry/utils/preprod/useSizeAnalysisComparison';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {InsightComparisonSection} from 'sentry/views/preprod/buildComparison/main/insightComparisonSection';
type SectionProps = MetricIds & {project: Project};
diff --git a/static/app/components/events/eventProcessingErrors.tsx b/static/app/components/events/eventProcessingErrors.tsx
index 2f98ebf555b188..950d45f82bfe23 100644
--- a/static/app/components/events/eventProcessingErrors.tsx
+++ b/static/app/components/events/eventProcessingErrors.tsx
@@ -12,8 +12,8 @@ import {QuestionTooltip} from 'sentry/components/questionTooltip';
import {t, tct} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type Props = {
event: Event;
diff --git a/static/app/components/events/eventReplay/replayClipSection.tsx b/static/app/components/events/eventReplay/replayClipSection.tsx
index feb5c63f924fbe..b445e7dd94f909 100644
--- a/static/app/components/events/eventReplay/replayClipSection.tsx
+++ b/static/app/components/events/eventReplay/replayClipSection.tsx
@@ -16,8 +16,8 @@ import type {Group} from 'sentry/types/group';
import {getAnalyticsDataForEvent, getAnalyticsDataForGroup} from 'sentry/utils/events';
import {useReplayCountForIssues} from 'sentry/utils/replayCount/useReplayCountForIssues';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
diff --git a/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx b/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
index 6dc866c087b46b..ee11551bef1e60 100644
--- a/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
+++ b/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
@@ -16,8 +16,8 @@ import {trackAnalytics} from 'sentry/utils/analytics';
import {useReplayOnboardingSidebarPanel} from 'sentry/utils/replays/hooks/useReplayOnboarding';
import {useMedia} from 'sentry/utils/useMedia';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type OnboardingCTAProps = {
platform: PlatformKey;
diff --git a/static/app/components/events/eventSdk.tsx b/static/app/components/events/eventSdk.tsx
index 6c01f6fdca0ae7..c70491afe24f41 100644
--- a/static/app/components/events/eventSdk.tsx
+++ b/static/app/components/events/eventSdk.tsx
@@ -1,8 +1,8 @@
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {KeyValueList} from './interfaces/keyValueList';
import {AnnotatedText} from './meta/annotatedText';
diff --git a/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx b/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
index fa1fc9f20ac3a6..dfbaf9c2e7d3f5 100644
--- a/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
+++ b/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
@@ -14,8 +14,8 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useSpans} from 'sentry/views/insights/common/queries/useDiscover';
import {SpanFields} from 'sentry/views/insights/types';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {makeTracesPathname} from 'sentry/views/traces/pathnames';
import {EventRegressionTable, type EventRegressionTableRow} from './eventRegressionTable';
diff --git a/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx b/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
index 983072fdedee8f..77917c28cb3eff 100644
--- a/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
+++ b/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
@@ -17,8 +17,8 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {Mode} from 'sentry/views/explore/queryParams/mode';
import {getExploreUrl} from 'sentry/views/explore/utils';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import type {BreakpointEvidenceData} from './breakpointChartOptions';
import {RELATIVE_DAYS_WINDOW} from './consts';
diff --git a/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx b/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
index e68cf4e6db02df..074ce80440dd5f 100644
--- a/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
+++ b/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
@@ -6,8 +6,8 @@ import {EventDisplay} from 'sentry/components/events/eventStatisticalDetector/ev
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
const COMPARISON_DESCRIPTION = t(
'To better understand what happened before and after this regression, compare a baseline event with a regressed event. Look for any significant shape changes, operation percentage changes, and tag differences.'
diff --git a/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx b/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
index b04dff7fdbe286..138caa6474a6b4 100644
--- a/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
+++ b/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
@@ -14,8 +14,8 @@ import {getFormat, getFormattedDate} from 'sentry/utils/dates';
import {getDuration} from 'sentry/utils/duration/getDuration';
import {formatPercentage} from 'sentry/utils/number/formatPercentage';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {
DisplayModes,
transactionSummaryRouteWithQuery,
diff --git a/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx b/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
index 8bfb74bab1f4af..71e6db983bcd20 100644
--- a/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
+++ b/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
@@ -9,8 +9,8 @@ import type {Event} from 'sentry/types/event';
import {defined} from 'sentry/utils';
import {useProfileEventsStats} from 'sentry/utils/profiling/hooks/useProfileEventsStats';
import {useRelativeDateTime} from 'sentry/utils/profiling/hooks/useRelativeDateTime';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {RELATIVE_DAYS_WINDOW} from './consts';
diff --git a/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx b/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
index aa4204f13f0602..85f6bc29254c32 100644
--- a/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
+++ b/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
@@ -19,9 +19,9 @@ import type {Project} from 'sentry/types/project';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {EventAttachmentFilter} from 'sentry/views/issueDetails/groupEventAttachments/groupEventAttachmentsFilter';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
interface ScreenshotDataSectionProps {
diff --git a/static/app/components/events/eventTagsAndScreenshot/tags.tsx b/static/app/components/events/eventTagsAndScreenshot/tags.tsx
index db78ed223d2ecc..f5a8fdd7ed1fda 100644
--- a/static/app/components/events/eventTagsAndScreenshot/tags.tsx
+++ b/static/app/components/events/eventTagsAndScreenshot/tags.tsx
@@ -14,8 +14,8 @@ import {
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type Props = {
event: Event;
diff --git a/static/app/components/events/eventViewHierarchy.tsx b/static/app/components/events/eventViewHierarchy.tsx
index 928a02b13437a5..190f32972aac18 100644
--- a/static/app/components/events/eventViewHierarchy.tsx
+++ b/static/app/components/events/eventViewHierarchy.tsx
@@ -15,8 +15,8 @@ import {defined} from 'sentry/utils';
import type {getApiUrl} from 'sentry/utils/api/getApiUrl';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import type {ViewHierarchyData} from './viewHierarchy';
import {ViewHierarchy} from './viewHierarchy';
diff --git a/static/app/components/events/eventXrayDiff.tsx b/static/app/components/events/eventXrayDiff.tsx
index 6832694a17d87e..5abeb1538a04c3 100644
--- a/static/app/components/events/eventXrayDiff.tsx
+++ b/static/app/components/events/eventXrayDiff.tsx
@@ -10,8 +10,8 @@ import {
type MetricIds,
useSizeAnalysisComparison,
} from 'sentry/utils/preprod/useSizeAnalysisComparison';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {TreemapDiffSection} from 'sentry/views/preprod/buildComparison/main/treemapDiffSection';
type SectionProps = MetricIds & {project: Project};
diff --git a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
index 346dc0c249ad73..fc2fc3da7b11b8 100644
--- a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
+++ b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
@@ -36,9 +36,9 @@ import {MutableSearch} from 'sentry/utils/tokenizeSearch';
import {useLocation} from 'sentry/utils/useLocation';
import {useMedia} from 'sentry/utils/useMedia';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
-import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
+import {useIssueDetailsEventView} from 'sentry/views/issueDetails/hooks/useIssueDetailsDiscoverQuery';
export function EventFeatureFlagSection(props: EventFeatureFlagSectionProps) {
return (
diff --git a/static/app/components/events/groupingInfo/groupingInfoSection.tsx b/static/app/components/events/groupingInfo/groupingInfoSection.tsx
index 05df74bfbd10af..260c04563ea7e1 100644
--- a/static/app/components/events/groupingInfo/groupingInfoSection.tsx
+++ b/static/app/components/events/groupingInfo/groupingInfoSection.tsx
@@ -4,8 +4,8 @@ import {LazyLoad} from 'sentry/components/lazyLoad';
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface EventGroupingInfoSectionProps {
event: Event;
diff --git a/static/app/components/events/highlights/highlightsDataSection.tsx b/static/app/components/events/highlights/highlightsDataSection.tsx
index dfb8debc94939d..bcab1cc70efe05 100644
--- a/static/app/components/events/highlights/highlightsDataSection.tsx
+++ b/static/app/components/events/highlights/highlightsDataSection.tsx
@@ -33,8 +33,8 @@ import {useDetailedProject} from 'sentry/utils/project/useDetailedProject';
import {useReplayData} from 'sentry/utils/replays/hooks/useReplayData';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
interface HighlightsDataSectionProps {
event: Event;
diff --git a/static/app/components/events/highlights/highlightsIconSummary.tsx b/static/app/components/events/highlights/highlightsIconSummary.tsx
index 6dc1f3e5f0bf01..7cc5dfb25e6066 100644
--- a/static/app/components/events/highlights/highlightsIconSummary.tsx
+++ b/static/app/components/events/highlights/highlightsIconSummary.tsx
@@ -31,7 +31,7 @@ import type {Organization} from 'sentry/types/organization';
import {isMobilePlatform, isNativePlatform} from 'sentry/utils/platform';
import {useOrganization} from 'sentry/utils/useOrganization';
import {Divider} from 'sentry/views/issueDetails/divider';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
interface HighlightsIconSummaryProps {
event: Event;
diff --git a/static/app/components/events/interfaces/crashContent/exception/content.tsx b/static/app/components/events/interfaces/crashContent/exception/content.tsx
index de1fab3ad99383..7c3f945b7011ad 100644
--- a/static/app/components/events/interfaces/crashContent/exception/content.tsx
+++ b/static/app/components/events/interfaces/crashContent/exception/content.tsx
@@ -22,11 +22,8 @@ import {StackType} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
import {useRouteAnalyticsParams} from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
import {useProjects} from 'sentry/utils/useProjects';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {
- FoldSection,
- SectionDivider,
-} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection, SectionDivider} from 'sentry/views/issueDetails/foldSection';
import {useIsSampleEvent} from 'sentry/views/issueDetails/utils';
import {Mechanism} from './mechanism';
diff --git a/static/app/components/events/interfaces/csp/index.tsx b/static/app/components/events/interfaces/csp/index.tsx
index 2c7d93aa47a9ad..029658ace16a2d 100644
--- a/static/app/components/events/interfaces/csp/index.tsx
+++ b/static/app/components/events/interfaces/csp/index.tsx
@@ -6,8 +6,8 @@ import {KeyValueList} from 'sentry/components/events/interfaces/keyValueList';
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import type {HelpProps} from './help';
import {CSPHelp as Help} from './help';
diff --git a/static/app/components/events/interfaces/debugMeta/index.tsx b/static/app/components/events/interfaces/debugMeta/index.tsx
index f5e0a6212e0095..6791cc7ae63ad2 100644
--- a/static/app/components/events/interfaces/debugMeta/index.tsx
+++ b/static/app/components/events/interfaces/debugMeta/index.tsx
@@ -32,8 +32,8 @@ import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
import {defined} from 'sentry/utils';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {Status} from './debugImage/status';
import {DebugImage} from './debugImage';
diff --git a/static/app/components/events/interfaces/exception.tsx b/static/app/components/events/interfaces/exception.tsx
index 5d99cb27c37e65..fcf3be5f7ef122 100644
--- a/static/app/components/events/interfaces/exception.tsx
+++ b/static/app/components/events/interfaces/exception.tsx
@@ -9,7 +9,7 @@ import type {Event, ExceptionType} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
import {ExceptionContent} from './crashContent/exception';
import {NoStackTraceMessage} from './noStackTraceMessage';
diff --git a/static/app/components/events/interfaces/frame/deprecatedLine.tsx b/static/app/components/events/interfaces/frame/deprecatedLine.tsx
index 5bf851989d8246..a4e22566a91476 100644
--- a/static/app/components/events/interfaces/frame/deprecatedLine.tsx
+++ b/static/app/components/events/interfaces/frame/deprecatedLine.tsx
@@ -26,7 +26,7 @@ import type {StacktraceType} from 'sentry/types/stacktrace';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useSentryAppComponentsStore} from 'sentry/utils/useSentryAppComponentsStore';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
+import {SectionKey} from 'sentry/views/issueDetails/context';
import {Context} from './context';
import {DefaultTitle} from './defaultTitle';
diff --git a/static/app/components/events/interfaces/generic.spec.tsx b/static/app/components/events/interfaces/generic.spec.tsx
index 6b9601f48f4eae..1add23387a3a32 100644
--- a/static/app/components/events/interfaces/generic.spec.tsx
+++ b/static/app/components/events/interfaces/generic.spec.tsx
@@ -5,7 +5,7 @@ import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import {textWithMarkupMatcher} from 'sentry-test/utils';
import {Generic} from 'sentry/components/events/interfaces/generic';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
+import {SectionKey} from 'sentry/views/issueDetails/context';
describe('Generic entry', () => {
it('display redacted data', async () => {
diff --git a/static/app/components/events/interfaces/generic.tsx b/static/app/components/events/interfaces/generic.tsx
index bccb0f2853ef86..0fbcd8a385fd18 100644
--- a/static/app/components/events/interfaces/generic.tsx
+++ b/static/app/components/events/interfaces/generic.tsx
@@ -5,7 +5,7 @@ import {SegmentedControl} from '@sentry/scraps/segmentedControl';
import {KeyValueList} from 'sentry/components/events/interfaces/keyValueList';
import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
import {t} from 'sentry/locale';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
function getView({
data,
diff --git a/static/app/components/events/interfaces/message.tsx b/static/app/components/events/interfaces/message.tsx
index fce148da8abd38..95077281e42b84 100644
--- a/static/app/components/events/interfaces/message.tsx
+++ b/static/app/components/events/interfaces/message.tsx
@@ -7,8 +7,8 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type Props = {
data: {
diff --git a/static/app/components/events/interfaces/nativeFrame.tsx b/static/app/components/events/interfaces/nativeFrame.tsx
index e180402b5d805b..3e1a4e775aace4 100644
--- a/static/app/components/events/interfaces/nativeFrame.tsx
+++ b/static/app/components/events/interfaces/nativeFrame.tsx
@@ -40,8 +40,8 @@ import {StackView, type StacktraceType} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
import {useSentryAppComponentsStore} from 'sentry/utils/useSentryAppComponentsStore';
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
-import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {getFoldSectionKey} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/context';
+import {getFoldSectionKey} from 'sentry/views/issueDetails/foldSection';
import {useOptionalDebugMetaSearch} from './debugMeta/debugMetaSearchContext';
import {combineStatus} from './debugMeta/utils';
diff --git a/static/app/components/events/interfaces/performance/anrRootCause.tsx b/static/app/components/events/interfaces/performance/anrRootCause.tsx
index 577708c1632e17..4000ee3d4bea46 100644
--- a/static/app/components/events/interfaces/performance/anrRootCause.tsx
+++ b/static/app/components/events/interfaces/performance/anrRootCause.tsx
@@ -23,8 +23,8 @@ import {defined} from 'sentry/utils';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useLocation} from 'sentry/utils/useLocation';
import {useProjects} from 'sentry/utils/useProjects';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {useIssuesTraceTree} from 'sentry/views/performance/newTraceDetails/traceApi/useIssuesTraceTree';
import {useTrace} from 'sentry/views/performance/newTraceDetails/traceApi/useTrace';
import {useTraceStateAnalytics} from 'sentry/views/performance/newTraceDetails/useTraceStateAnalytics';
diff --git a/static/app/components/events/interfaces/performance/eventTraceView.tsx b/static/app/components/events/interfaces/performance/eventTraceView.tsx
index 2dc5d2d6e05bbe..e5eebcf9423ff6 100644
--- a/static/app/components/events/interfaces/performance/eventTraceView.tsx
+++ b/static/app/components/events/interfaces/performance/eventTraceView.tsx
@@ -19,8 +19,8 @@ import type {Organization} from 'sentry/types/organization';
import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
import {useRouteAnalyticsParams} from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
import {useLocation} from 'sentry/utils/useLocation';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {TraceIssueEvent} from 'sentry/views/issueDetails/traceTimeline/traceIssue';
import {useTraceTimelineEvents} from 'sentry/views/issueDetails/traceTimeline/useTraceTimelineEvents';
import {IssuesTraceWaterfall} from 'sentry/views/performance/newTraceDetails/issuesTraceWaterfall';
diff --git a/static/app/components/events/interfaces/performance/spanEvidence.tsx b/static/app/components/events/interfaces/performance/spanEvidence.tsx
index 840c932f78af96..75e7190ad60469 100644
--- a/static/app/components/events/interfaces/performance/spanEvidence.tsx
+++ b/static/app/components/events/interfaces/performance/spanEvidence.tsx
@@ -12,8 +12,8 @@ import {
} from 'sentry/types/group';
import type {Organization} from 'sentry/types/organization';
import {sanitizeQuerySelector} from 'sentry/utils/sanitizeQuerySelector';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {SpanEvidenceKeyValueList} from './spanEvidenceKeyValueList';
diff --git a/static/app/components/events/interfaces/request/index.tsx b/static/app/components/events/interfaces/request/index.tsx
index 6684623b48906d..1c4e918703f01d 100644
--- a/static/app/components/events/interfaces/request/index.tsx
+++ b/static/app/components/events/interfaces/request/index.tsx
@@ -24,8 +24,8 @@ import type {EntryRequest, Event} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {defined} from 'sentry/utils';
import {isValidUrl} from 'sentry/utils/string/isValidUrl';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {getTransformedData} from './getTransformedData';
diff --git a/static/app/components/events/interfaces/template.tsx b/static/app/components/events/interfaces/template.tsx
index 25f171eb10663c..e6486bb3e18d86 100644
--- a/static/app/components/events/interfaces/template.tsx
+++ b/static/app/components/events/interfaces/template.tsx
@@ -1,8 +1,8 @@
import {t} from 'sentry/locale';
import type {Event, Frame} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {DeprecatedLine} from './frame/deprecatedLine';
diff --git a/static/app/components/events/interfaces/threads.tsx b/static/app/components/events/interfaces/threads.tsx
index 8a50b30e458d01..96d3dff02a820b 100644
--- a/static/app/components/events/interfaces/threads.tsx
+++ b/static/app/components/events/interfaces/threads.tsx
@@ -36,9 +36,9 @@ import type {Group} from 'sentry/types/group';
import type {PlatformKey, Project} from 'sentry/types/project';
import {StackType, StackView} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
-import {setActiveThreadId} from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
+import {setActiveThreadId} from 'sentry/views/issueDetails/hooks/useCopyIssueDetails';
import {ExceptionContent} from './crashContent/exception';
import {StackTraceContent} from './crashContent/stackTrace';
diff --git a/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx b/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
index ad0cd019cb45cd..00a7dd26605fce 100644
--- a/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
+++ b/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
@@ -2,8 +2,8 @@ import {KeyValueList} from 'sentry/components/events/interfaces/keyValueList';
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {AssertionFailureTree} from 'sentry/views/alerts/rules/uptime/assertions/assertionFailure/assertionFailureTree';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
export function UptimeAssertionsSection({event}: {event: Event}) {
const evidenceData = event.occurrence?.evidenceData;
diff --git a/static/app/components/events/metrics/metricsSection.tsx b/static/app/components/events/metrics/metricsSection.tsx
index 47408d35ba56b6..da41162f5657b4 100644
--- a/static/app/components/events/metrics/metricsSection.tsx
+++ b/static/app/components/events/metrics/metricsSection.tsx
@@ -20,8 +20,8 @@ import {useOrganization} from 'sentry/utils/useOrganization';
import {METRICS_DRAWER_QUERY_PARAM} from 'sentry/views/explore/metrics/constants';
import {MetricsSamplesTable} from 'sentry/views/explore/metrics/metricInfoTabs/metricsSamplesTable';
import {canUseMetricsUI} from 'sentry/views/explore/metrics/metricsFlags';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {TraceViewMetricsProviderWrapper} from 'sentry/views/performance/newTraceDetails/traceMetrics';
import {NUMBER_ABBREVIATED_METRICS} from './useMetricsIssueSection';
diff --git a/static/app/components/events/ourlogs/ourlogsSection.tsx b/static/app/components/events/ourlogs/ourlogsSection.tsx
index 10b5fa33cf0af3..2da8aa313d2f83 100644
--- a/static/app/components/events/ourlogs/ourlogsSection.tsx
+++ b/static/app/components/events/ourlogs/ourlogsSection.tsx
@@ -28,8 +28,8 @@ import {LOGS_DRAWER_QUERY_PARAM} from 'sentry/views/explore/logs/constants';
import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParamsProvider';
import {LogRowContent} from 'sentry/views/explore/logs/tables/logsTableRow';
import {useQueryParamsSearch} from 'sentry/views/explore/queryParams/context';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
export function OurlogsSection({
event,
diff --git a/static/app/components/events/packageData.tsx b/static/app/components/events/packageData.tsx
index 3453744fd5b577..c284dd2cd47f7f 100644
--- a/static/app/components/events/packageData.tsx
+++ b/static/app/components/events/packageData.tsx
@@ -6,8 +6,8 @@ import {KeyValueData} from 'sentry/components/keyValueData';
import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type Props = {
event: Event;
diff --git a/static/app/components/events/profileEventEvidence.tsx b/static/app/components/events/profileEventEvidence.tsx
index be0ede36f78813..4e7c2bb2ed517a 100644
--- a/static/app/components/events/profileEventEvidence.tsx
+++ b/static/app/components/events/profileEventEvidence.tsx
@@ -8,8 +8,8 @@ import {generateLinkToEventInTraceView} from 'sentry/utils/discover/urls';
import {generateProfileFlamechartRouteWithHighlightFrame} from 'sentry/utils/profiling/routes';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type ProfileEvidenceProps = {event: Event; projectSlug: string};
diff --git a/static/app/components/events/rrwebIntegration.tsx b/static/app/components/events/rrwebIntegration.tsx
index 33144c637ae319..0b577be09ec0be 100644
--- a/static/app/components/events/rrwebIntegration.tsx
+++ b/static/app/components/events/rrwebIntegration.tsx
@@ -10,8 +10,8 @@ import type {Project} from 'sentry/types/project';
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
type Props = {
event: Event;
diff --git a/static/app/components/events/traceEventDataSection.tsx b/static/app/components/events/traceEventDataSection.tsx
index 3d1e7913829341..f04f7adf14ce2d 100644
--- a/static/app/components/events/traceEventDataSection.tsx
+++ b/static/app/components/events/traceEventDataSection.tsx
@@ -19,7 +19,7 @@ import {trackAnalytics} from 'sentry/utils/analytics';
import {isMobilePlatform, isNativePlatform} from 'sentry/utils/platform';
import {useApi} from 'sentry/utils/useApi';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
const sortByOptions = {
'recent-first': t('Newest'),
diff --git a/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx b/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx
index 0d00c36b77d6a4..69451e4b294cba 100644
--- a/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx
+++ b/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx
@@ -27,7 +27,7 @@ describe('FeedbackActivitySection', () => {
});
});
- it('renders feedback activity with the streamlined activity feed', async () => {
+ it('renders feedback activity with the issue details activity feed', async () => {
const feedbackItem = GroupFixture({
id: '1337',
activity: [
diff --git a/static/app/components/feedback/feedbackItem/feedbackAssignedTo.tsx b/static/app/components/feedback/feedbackItem/feedbackAssignedTo.tsx
index 87f1aad4b6777b..5707aa4cdc1664 100644
--- a/static/app/components/feedback/feedbackItem/feedbackAssignedTo.tsx
+++ b/static/app/components/feedback/feedbackItem/feedbackAssignedTo.tsx
@@ -8,8 +8,8 @@ import {getApiUrl} from 'sentry/utils/api/getApiUrl';
import type {FeedbackEvent} from 'sentry/utils/feedback/types';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
-import type {EventOwners} from 'sentry/views/issueDetails/streamline/header/getOwnerList';
-import {getOwnerList} from 'sentry/views/issueDetails/streamline/header/getOwnerList';
+import type {EventOwners} from 'sentry/views/issueDetails/header/getOwnerList';
+import {getOwnerList} from 'sentry/views/issueDetails/header/getOwnerList';
interface Props {
feedbackEvent: FeedbackEvent;
diff --git a/static/app/components/groupPreviewTooltip/utils.tsx b/static/app/components/groupPreviewTooltip/utils.tsx
index 15510de48a9e18..3c223445815475 100644
--- a/static/app/components/groupPreviewTooltip/utils.tsx
+++ b/static/app/components/groupPreviewTooltip/utils.tsx
@@ -5,7 +5,7 @@ import type {Event} from 'sentry/types/event';
import {defined} from 'sentry/utils';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useTimeout} from 'sentry/utils/useTimeout';
-import {getEventSearchFromIssueQuery} from 'sentry/views/issueDetails/streamline/hooks/useEventQuery';
+import {getEventSearchFromIssueQuery} from 'sentry/views/issueDetails/hooks/useEventQuery';
import {useGroup} from 'sentry/views/issueDetails/useGroup';
import {
groupEventApiOptions,
diff --git a/static/app/components/searchQueryBuilder/askSeer/askSeer.tsx b/static/app/components/searchQueryBuilder/askSeer/askSeer.tsx
index b1cf2b84fa530c..3467f365ba13c1 100644
--- a/static/app/components/searchQueryBuilder/askSeer/askSeer.tsx
+++ b/static/app/components/searchQueryBuilder/askSeer/askSeer.tsx
@@ -11,13 +11,13 @@ import {
AskSeerListItem,
AskSeerPane,
} from 'sentry/components/searchQueryBuilder/askSeer/components';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderAI} from 'sentry/components/searchQueryBuilder/context';
import {t} from 'sentry/locale';
import {useOrganization} from 'sentry/utils/useOrganization';
export function AskSeer({state}: {state: ComboBoxState}) {
const organization = useOrganization();
- const {displayAskSeerFeedback} = useSearchQueryBuilder();
+ const {displayAskSeerFeedback} = useSearchQueryBuilderAI();
const isMutating = useIsMutating({
mutationKey: [setupCheckQueryKey(organization.slug)],
diff --git a/static/app/components/searchQueryBuilder/askSeer/askSeerFeedback.tsx b/static/app/components/searchQueryBuilder/askSeer/askSeerFeedback.tsx
index 0e2e82b9d5da9c..4933a8efa82f9a 100644
--- a/static/app/components/searchQueryBuilder/askSeer/askSeerFeedback.tsx
+++ b/static/app/components/searchQueryBuilder/askSeer/askSeerFeedback.tsx
@@ -5,7 +5,7 @@ import {Text} from '@sentry/scraps/text';
import {useAnalyticsArea} from 'sentry/components/analyticsArea';
import {AskSeerLabel} from 'sentry/components/searchQueryBuilder/askSeer/components';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderAI} from 'sentry/components/searchQueryBuilder/context';
import {IconSeer, IconThumb} from 'sentry/icons';
import {t} from 'sentry/locale';
import {trackAnalytics} from 'sentry/utils/analytics';
@@ -15,7 +15,7 @@ export function AskSeerFeedback() {
const organization = useOrganization();
const analyticsArea = useAnalyticsArea();
const {setDisplayAskSeerFeedback, askSeerNLQueryRef, askSeerSuggestedQueryRef} =
- useSearchQueryBuilder();
+ useSearchQueryBuilderAI();
const handleClick = (type: 'positive' | 'negative') => {
trackAnalytics('ai_query.feedback', {
diff --git a/static/app/components/searchQueryBuilder/askSeer/askSeerOption.tsx b/static/app/components/searchQueryBuilder/askSeer/askSeerOption.tsx
index 0729dae919811b..f45ca54121a8a4 100644
--- a/static/app/components/searchQueryBuilder/askSeer/askSeerOption.tsx
+++ b/static/app/components/searchQueryBuilder/askSeer/askSeerOption.tsx
@@ -11,7 +11,7 @@ import {
AskSeerLabel,
AskSeerListItem,
} from 'sentry/components/searchQueryBuilder/askSeer/components';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderAI} from 'sentry/components/searchQueryBuilder/context';
import {IconSeer} from 'sentry/icons';
import {t} from 'sentry/locale';
import {trackAnalytics} from 'sentry/utils/analytics';
@@ -21,7 +21,7 @@ export const ASK_SEER_ITEM_KEY = 'ask_seer';
export function AskSeerOption({state}: {state: ComboBoxState}) {
const ref = useRef(null);
- const {setDisplayAskSeer, aiSearchBadgeType} = useSearchQueryBuilder();
+ const {setDisplayAskSeer, aiSearchBadgeType} = useSearchQueryBuilderAI();
const analyticsArea = useAnalyticsArea();
const organization = useOrganization();
diff --git a/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox.spec.tsx b/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox.spec.tsx
index de70de119131f0..6d6b2a89521e41 100644
--- a/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox.spec.tsx
+++ b/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox.spec.tsx
@@ -7,7 +7,7 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar
import {AskSeerComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
} from 'sentry/components/searchQueryBuilder/context';
import {fetchMutation} from 'sentry/utils/queryClient';
@@ -116,7 +116,7 @@ describe('AskSeerComboBox', () => {
it('closes seer search when close button is clicked', async () => {
function TestComponent() {
- const {displayAskSeer, setDisplayAskSeer} = useSearchQueryBuilder();
+ const {displayAskSeer, setDisplayAskSeer} = useSearchQueryBuilderAI();
return displayAskSeer ? (
({
autoSubmitSeer,
setAutoSubmitSeer,
enableAISearch,
- } = useSearchQueryBuilder();
+ } = useSearchQueryBuilderAI();
const analyticsArea = useAnalyticsArea();
diff --git a/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox.tsx b/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox.tsx
index 362f04cd0967fd..a27df53b420ebc 100644
--- a/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox.tsx
+++ b/static/app/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox.tsx
@@ -28,7 +28,7 @@ import {
generateQueryTokensString,
isNoneOfTheseItem,
} from 'sentry/components/searchQueryBuilder/askSeerCombobox/utils';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderAI} from 'sentry/components/searchQueryBuilder/context';
import {useSearchTokenCombobox} from 'sentry/components/searchQueryBuilder/tokens/useSearchTokenCombobox';
import {IconClose, IconMegaphone, IconSearch} from 'sentry/icons';
import {t} from 'sentry/locale';
@@ -139,7 +139,7 @@ export function AskSeerPollingComboBox({
autoSubmitSeer,
setAutoSubmitSeer,
enableAISearch,
- } = useSearchQueryBuilder();
+ } = useSearchQueryBuilderAI();
const analyticsArea = useAnalyticsArea();
diff --git a/static/app/components/searchQueryBuilder/askSeerCombobox/queryTokens.tsx b/static/app/components/searchQueryBuilder/askSeerCombobox/queryTokens.tsx
index c811b3ef5a7f48..c6dfc69b16c1c6 100644
--- a/static/app/components/searchQueryBuilder/askSeerCombobox/queryTokens.tsx
+++ b/static/app/components/searchQueryBuilder/askSeerCombobox/queryTokens.tsx
@@ -4,7 +4,7 @@ import {Flex} from '@sentry/scraps/layout';
import type {QueryTokensProps} from 'sentry/components/searchQueryBuilder/askSeerCombobox/types';
import {formatDateRange} from 'sentry/components/searchQueryBuilder/askSeerCombobox/utils';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
import {ProvidedFormattedQuery} from 'sentry/components/searchQueryBuilder/formattedQuery';
import {parseQueryBuilderValue} from 'sentry/components/searchQueryBuilder/utils';
import {t} from 'sentry/locale';
@@ -19,7 +19,7 @@ export function QueryTokens({
visualizations,
}: QueryTokensProps) {
const tokens = [];
- const {getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
const parsedQuery = query ? parseQueryBuilderValue(query, getFieldDefinition) : null;
if (query && parsedQuery?.length) {
tokens.push(
diff --git a/static/app/components/searchQueryBuilder/context.tsx b/static/app/components/searchQueryBuilder/context.tsx
index 07a6373cc2fe57..7a5c88e6bc4fda 100644
--- a/static/app/components/searchQueryBuilder/context.tsx
+++ b/static/app/components/searchQueryBuilder/context.tsx
@@ -35,72 +35,120 @@ import {useDimensions} from 'sentry/utils/useDimensions';
import {useOrganization} from 'sentry/utils/useOrganization';
import {usePrevious} from 'sentry/utils/usePrevious';
-interface SearchQueryBuilderContextData {
- actionBarRef: React.RefObject;
- aiSearchBadgeType: 'alpha' | 'beta';
- askSeerNLQueryRef: React.RefObject;
- askSeerSuggestedQueryRef: React.RefObject;
- autoSubmitSeer: boolean;
+interface SearchQueryBuilderStateContextData {
clearSearchQuery: (options?: {reopenDropdown?: boolean}) => void;
committedQuery: string;
- consumeReopenDropdownOnQueryClear: () => void;
- currentInputValueRef: React.RefObject;
+ dispatch: Dispatch;
+ focusOverride: FocusOverride | null;
+ handleSearch: (query: string) => void;
+ parseQuery: (query: string) => ParseResult | null;
+ parsedQuery: ParseResult | null;
+ query: string;
+}
+
+interface SearchQueryBuilderConfigContextData {
+ caseInsensitive: CaseInsensitive | undefined;
disabled: boolean;
disallowFreeText: boolean;
disallowLogicalOperators: boolean;
disallowWildcard: boolean;
- dispatch: Dispatch;
- displayAskSeer: boolean;
- displayAskSeerFeedback: boolean;
- enableAISearch: boolean;
- filterKeyMenuWidth: number;
+ filterKeyAliases: TagCollection | undefined;
filterKeySections: FilterKeySection[];
filterKeys: TagCollection;
- focusOverride: FocusOverride | null;
- // @deprecated: remove this, it's constant now
- gaveSeerConsent: true;
getFieldDefinition: (key: string, kind?: FieldKind) => FieldDefinition | null;
getSuggestedFilterKey: (key: string) => string | null;
+ getTagKeys: GetTagKeys | undefined;
getTagValues: GetTagValues;
- handleSearch: (query: string) => void;
invalidFilterKeys: string[];
- parseQuery: (query: string) => ParseResult | null;
- parsedQuery: ParseResult | null;
- query: string;
- reopenDropdownOnQueryClear: boolean;
+ matchKeySuggestions: Array<{key: string; valuePattern: RegExp}> | undefined;
+ namespace: string | undefined;
+ onCaseInsensitiveClick: ((value: CaseInsensitive) => void) | undefined;
+ placeholder: string | undefined;
+ recentSearches: SavedSearchType | undefined;
+ replaceRawSearchKeys: string[] | undefined;
searchSource: string;
+}
+
+interface SearchQueryBuilderLayoutContextData {
+ actionBarRef: React.RefObject;
+ currentInputValueRef: React.RefObject;
+ filterKeyMenuWidth: number;
+ portalTarget: HTMLElement | null | undefined;
+ size: 'small' | 'normal';
+ wrapperRef: React.RefObject;
+}
+
+interface SearchQueryBuilderAIContextData {
+ aiSearchBadgeType: 'alpha' | 'beta';
+ askSeerNLQueryRef: React.RefObject;
+ askSeerSuggestedQueryRef: React.RefObject;
+ autoSubmitSeer: boolean;
+ displayAskSeer: boolean;
+ displayAskSeerFeedback: boolean;
+ enableAISearch: boolean;
setAutoSubmitSeer: (enabled: boolean) => void;
setDisplayAskSeer: (enabled: boolean) => void;
setDisplayAskSeerFeedback: (enabled: boolean) => void;
- size: 'small' | 'normal';
- wrapperRef: React.RefObject;
- caseInsensitive?: CaseInsensitive;
- filterKeyAliases?: TagCollection;
- getTagKeys?: GetTagKeys;
- matchKeySuggestions?: Array<{key: string; valuePattern: RegExp}>;
- namespace?: string;
- onCaseInsensitiveClick?: (value: CaseInsensitive) => void;
- placeholder?: string;
- /**
- * The element to render the combobox popovers into.
- */
- portalTarget?: HTMLElement | null;
- recentSearches?: SavedSearchType;
- replaceRawSearchKeys?: string[];
}
-export function useSearchQueryBuilder() {
- const context = useContext(SearchQueryBuilderContext);
- if (!context) {
- throw new Error(
- 'useSearchQueryBuilder must be used within a SearchQueryBuilderProvider'
- );
+interface SearchQueryBuilderInteractionContextData {
+ consumeReopenDropdownOnQueryClear: () => void;
+ reopenDropdownOnQueryClear: boolean;
+}
+
+function useRequiredContext(context: React.Context, hookName: string) {
+ const contextValue = useContext(context);
+ if (!contextValue) {
+ throw new Error(`${hookName} must be used within a SearchQueryBuilderProvider`);
}
- return context;
+ return contextValue;
+}
+
+export function useSearchQueryBuilderState() {
+ return useRequiredContext(SearchQueryBuilderStateContext, 'useSearchQueryBuilderState');
+}
+
+export function useSearchQueryBuilderConfig() {
+ return useRequiredContext(
+ SearchQueryBuilderConfigContext,
+ 'useSearchQueryBuilderConfig'
+ );
+}
+
+export function useSearchQueryBuilderLayout() {
+ return useRequiredContext(
+ SearchQueryBuilderLayoutContext,
+ 'useSearchQueryBuilderLayout'
+ );
+}
+
+export function useSearchQueryBuilderAI() {
+ return useRequiredContext(SearchQueryBuilderAIContext, 'useSearchQueryBuilderAI');
}
-export const SearchQueryBuilderContext =
- createContext(null);
+export function useSearchQueryBuilderInteraction() {
+ return useRequiredContext(
+ SearchQueryBuilderInteractionContext,
+ 'useSearchQueryBuilderInteraction'
+ );
+}
+
+export function useHasSearchQueryBuilderProvider() {
+ return useContext(SearchQueryBuilderProviderContext);
+}
+
+const SearchQueryBuilderStateContext =
+ createContext(null);
+const SearchQueryBuilderConfigContext =
+ createContext(null);
+const SearchQueryBuilderLayoutContext =
+ createContext(null);
+const SearchQueryBuilderAIContext = createContext(
+ null
+);
+const SearchQueryBuilderInteractionContext =
+ createContext(null);
+const SearchQueryBuilderProviderContext = createContext(false);
export function SearchQueryBuilderProvider({
children,
@@ -267,96 +315,136 @@ export function SearchQueryBuilderProvider({
const size =
searchBarWidth && searchBarWidth < 600 ? ('small' as const) : ('normal' as const);
- const contextValue = useMemo((): SearchQueryBuilderContextData => {
+ const stateValue = useMemo((): SearchQueryBuilderStateContextData => {
return {
- ...state,
- aiSearchBadgeType,
- invalidFilterKeys: stableInvalidFilterKeys,
+ clearSearchQuery,
+ committedQuery: state.committedQuery,
+ dispatch,
+ focusOverride: state.focusOverride,
+ handleSearch,
+ parseQuery,
+ parsedQuery,
+ query: state.query,
+ };
+ }, [
+ clearSearchQuery,
+ dispatch,
+ handleSearch,
+ parseQuery,
+ parsedQuery,
+ state.committedQuery,
+ state.focusOverride,
+ state.query,
+ ]);
+
+ const configValue = useMemo((): SearchQueryBuilderConfigContextData => {
+ return {
+ caseInsensitive,
disabled,
disallowFreeText: Boolean(disallowFreeText),
disallowLogicalOperators: Boolean(disallowLogicalOperators),
disallowWildcard: Boolean(disallowWildcard),
- enableAISearch,
- parseQuery,
- parsedQuery,
+ filterKeyAliases,
filterKeySections: filterKeySections ?? [],
- filterKeyMenuWidth,
filterKeys: stableFilterKeys,
+ getFieldDefinition: stableFieldDefinitionGetter,
getSuggestedFilterKey: stableGetSuggestedFilterKey,
- getTagValues,
getTagKeys,
- getFieldDefinition: stableFieldDefinitionGetter,
- dispatch,
- clearSearchQuery,
- consumeReopenDropdownOnQueryClear,
- wrapperRef,
- actionBarRef,
- handleSearch,
+ getTagValues,
+ invalidFilterKeys: stableInvalidFilterKeys,
+ matchKeySuggestions,
+ namespace,
+ onCaseInsensitiveClick,
placeholder,
recentSearches,
- namespace,
- searchSource,
- size,
- portalTarget,
- autoSubmitSeer,
- setAutoSubmitSeer,
- displayAskSeer,
- setDisplayAskSeer: setDisplayAskSeerState,
replaceRawSearchKeys,
- matchKeySuggestions,
- filterKeyAliases,
- gaveSeerConsent: true,
- currentInputValueRef,
- reopenDropdownOnQueryClear,
- displayAskSeerFeedback,
- setDisplayAskSeerFeedback,
- askSeerNLQueryRef,
- askSeerSuggestedQueryRef,
- caseInsensitive,
- onCaseInsensitiveClick,
+ searchSource,
};
}, [
- aiSearchBadgeType,
- autoSubmitSeer,
caseInsensitive,
- clearSearchQuery,
- consumeReopenDropdownOnQueryClear,
disabled,
disallowFreeText,
disallowLogicalOperators,
disallowWildcard,
- dispatch,
- displayAskSeer,
- displayAskSeerFeedback,
- enableAISearch,
filterKeyAliases,
- filterKeyMenuWidth,
filterKeySections,
getTagKeys,
getTagValues,
- handleSearch,
stableInvalidFilterKeys,
matchKeySuggestions,
+ namespace,
onCaseInsensitiveClick,
- parseQuery,
- parsedQuery,
placeholder,
- portalTarget,
recentSearches,
- reopenDropdownOnQueryClear,
- namespace,
replaceRawSearchKeys,
searchSource,
- size,
stableFieldDefinitionGetter,
stableFilterKeys,
stableGetSuggestedFilterKey,
- state,
]);
+ const layoutValue = useMemo((): SearchQueryBuilderLayoutContextData => {
+ return {
+ actionBarRef,
+ currentInputValueRef,
+ filterKeyMenuWidth,
+ portalTarget,
+ size,
+ wrapperRef,
+ };
+ }, [
+ actionBarRef,
+ currentInputValueRef,
+ filterKeyMenuWidth,
+ portalTarget,
+ size,
+ wrapperRef,
+ ]);
+
+ const aiValue = useMemo((): SearchQueryBuilderAIContextData => {
+ return {
+ aiSearchBadgeType,
+ askSeerNLQueryRef,
+ askSeerSuggestedQueryRef,
+ autoSubmitSeer,
+ displayAskSeer,
+ displayAskSeerFeedback,
+ enableAISearch,
+ setAutoSubmitSeer,
+ setDisplayAskSeer: setDisplayAskSeerState,
+ setDisplayAskSeerFeedback,
+ };
+ }, [
+ aiSearchBadgeType,
+ askSeerNLQueryRef,
+ askSeerSuggestedQueryRef,
+ autoSubmitSeer,
+ displayAskSeer,
+ displayAskSeerFeedback,
+ enableAISearch,
+ setDisplayAskSeerFeedback,
+ ]);
+
+ const interactionValue = useMemo((): SearchQueryBuilderInteractionContextData => {
+ return {
+ consumeReopenDropdownOnQueryClear,
+ reopenDropdownOnQueryClear,
+ };
+ }, [consumeReopenDropdownOnQueryClear, reopenDropdownOnQueryClear]);
+
return (
-
- {children}
-
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
);
}
diff --git a/static/app/components/searchQueryBuilder/formattedQuery.spec.tsx b/static/app/components/searchQueryBuilder/formattedQuery.spec.tsx
index 355ab1dd934468..d15a41aaa4343f 100644
--- a/static/app/components/searchQueryBuilder/formattedQuery.spec.tsx
+++ b/static/app/components/searchQueryBuilder/formattedQuery.spec.tsx
@@ -15,10 +15,12 @@ const FILTER_KEYS: TagCollection = {
};
jest.mock('sentry/components/searchQueryBuilder/context', () => ({
- useSearchQueryBuilder: () => ({
- size: 'normal',
+ useSearchQueryBuilderConfig: () => ({
getFieldDefinition: () => null,
}),
+ useSearchQueryBuilderLayout: () => ({
+ size: 'normal',
+ }),
}));
describe('FormattedQuery', () => {
diff --git a/static/app/components/searchQueryBuilder/formattedQuery.tsx b/static/app/components/searchQueryBuilder/formattedQuery.tsx
index 0b6361b4a82066..c4c736a134dbf6 100644
--- a/static/app/components/searchQueryBuilder/formattedQuery.tsx
+++ b/static/app/components/searchQueryBuilder/formattedQuery.tsx
@@ -5,7 +5,7 @@ import {Text} from '@sentry/scraps/text';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderConfig,
} from 'sentry/components/searchQueryBuilder/context';
import {AggregateKeyVisual} from 'sentry/components/searchQueryBuilder/tokens/filter/aggregateKey';
import {FilterValueText} from 'sentry/components/searchQueryBuilder/tokens/filter/filter';
@@ -54,7 +54,7 @@ function FilterKey({token}: {token: TokenResult}) {
}
function Filter({token}: {token: TokenResult}) {
- const {getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
const label = useMemo(
() =>
getOperatorInfo({
diff --git a/static/app/components/searchQueryBuilder/hooks/useOnChange.tsx b/static/app/components/searchQueryBuilder/hooks/useOnChange.tsx
index 9e6d9889847db3..4a513bcf37888a 100644
--- a/static/app/components/searchQueryBuilder/hooks/useOnChange.tsx
+++ b/static/app/components/searchQueryBuilder/hooks/useOnChange.tsx
@@ -1,11 +1,11 @@
import type {SearchQueryBuilderProps} from 'sentry/components/searchQueryBuilder';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderState} from 'sentry/components/searchQueryBuilder/context';
import {queryIsValid} from 'sentry/components/searchQueryBuilder/utils';
import {useEffectAfterFirstRender} from 'sentry/utils/useEffectAfterFirstRender';
import {usePrevious} from 'sentry/utils/usePrevious';
export function useOnChange({onChange}: Pick) {
- const {committedQuery, handleSearch, parseQuery} = useSearchQueryBuilder();
+ const {committedQuery, handleSearch, parseQuery} = useSearchQueryBuilderState();
const previousCommittedQuery = usePrevious(committedQuery);
diff --git a/static/app/components/searchQueryBuilder/hooks/useQueryBuilderGridItem.tsx b/static/app/components/searchQueryBuilder/hooks/useQueryBuilderGridItem.tsx
index 69cfc0fdf52b00..6910465a9db716 100644
--- a/static/app/components/searchQueryBuilder/hooks/useQueryBuilderGridItem.tsx
+++ b/static/app/components/searchQueryBuilder/hooks/useQueryBuilderGridItem.tsx
@@ -5,7 +5,7 @@ import {isMac} from '@react-aria/utils';
import type {ListState} from '@react-stately/list';
import type {FocusableElement, Node} from '@react-types/shared';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderLayout} from 'sentry/components/searchQueryBuilder/context';
import {useKeyboardSelection} from 'sentry/components/searchQueryBuilder/hooks/useKeyboardSelection';
import {findNearestFreeTextKey} from 'sentry/components/searchQueryBuilder/utils';
import type {ParseResultToken} from 'sentry/components/searchSyntax/parser';
@@ -94,7 +94,7 @@ export function useQueryBuilderGridItem(
state: ListState,
ref: RefObject
) {
- const {wrapperRef} = useSearchQueryBuilder();
+ const {wrapperRef} = useSearchQueryBuilderLayout();
const {rowProps, gridCellProps} = useGridListItem({node: item}, state, ref);
const {selectInDirection} = useKeyboardSelection();
diff --git a/static/app/components/searchQueryBuilder/hooks/useSelectOnDrag.tsx b/static/app/components/searchQueryBuilder/hooks/useSelectOnDrag.tsx
index 05c0416a7a25ac..84a65d33cb4d35 100644
--- a/static/app/components/searchQueryBuilder/hooks/useSelectOnDrag.tsx
+++ b/static/app/components/searchQueryBuilder/hooks/useSelectOnDrag.tsx
@@ -2,7 +2,7 @@ import {useCallback, useEffect, useRef} from 'react';
import type {ListState} from '@react-stately/list';
import type {Key} from '@react-types/shared';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderLayout} from 'sentry/components/searchQueryBuilder/context';
import {Token, type ParseResultToken} from 'sentry/components/searchSyntax/parser';
type DraggingState = {
@@ -118,7 +118,7 @@ function getItemIndexAtPosition(
* and should behave similarly to selection within a textarea.
*/
export function useSelectOnDrag(state: ListState) {
- const {wrapperRef} = useSearchQueryBuilder();
+ const {wrapperRef} = useSearchQueryBuilderLayout();
const dragState = useRef(null);
const cachedTokenCoordinates = useRef(null);
// Mouse move events fire more than once per frame, so we use this ref to
diff --git a/static/app/components/searchQueryBuilder/hooks/useUndoStack.tsx b/static/app/components/searchQueryBuilder/hooks/useUndoStack.tsx
index 388edd7c3c77bc..2c7db1f1a95e0b 100644
--- a/static/app/components/searchQueryBuilder/hooks/useUndoStack.tsx
+++ b/static/app/components/searchQueryBuilder/hooks/useUndoStack.tsx
@@ -2,7 +2,7 @@ import {useCallback, useRef} from 'react';
import type {ListState} from '@react-stately/list';
import type {Key} from '@react-types/shared';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderState} from 'sentry/components/searchQueryBuilder/context';
import type {FocusOverride} from 'sentry/components/searchQueryBuilder/types';
import type {ParseResultToken} from 'sentry/components/searchSyntax/parser';
import {defined} from 'sentry/utils';
@@ -77,7 +77,7 @@ function updateUndoStack({
* Hook that manages the undo stack for the search query builder.
*/
export function useUndoStack(state: ListState) {
- const {query, focusOverride, dispatch} = useSearchQueryBuilder();
+ const {query, focusOverride, dispatch} = useSearchQueryBuilderState();
const undoStackRef = useRef([]);
const trimmedQuery = query.trim();
diff --git a/static/app/components/searchQueryBuilder/index.spec.tsx b/static/app/components/searchQueryBuilder/index.spec.tsx
index ffdcb054166301..26e065245eb2f8 100644
--- a/static/app/components/searchQueryBuilder/index.spec.tsx
+++ b/static/app/components/searchQueryBuilder/index.spec.tsx
@@ -19,7 +19,8 @@ import {
import {AskSeerComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderState,
} from 'sentry/components/searchQueryBuilder/context';
import {
QueryInterfaceType,
@@ -5807,7 +5808,8 @@ describe('SearchQueryBuilder', () => {
});
function AskSeerTestComponent({children}: {children: React.ReactNode}) {
- const {displayAskSeer, query} = useSearchQueryBuilder();
+ const {displayAskSeer} = useSearchQueryBuilderAI();
+ const {query} = useSearchQueryBuilderState();
return displayAskSeer ? (
{
story('SearchQueryBuilderProvider', () => {
function OpenDropdownButton() {
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
return (
- The provider will give you access to the context values within the search bar.
- Access these values using the useSearchQueryBuilder hook within any
- of the provider's child components.
+ The provider will give you access to focused context values within the search
+ bar. Access query state using the useSearchQueryBuilderState hook
+ within any of the provider's child components.
Here is an example of a custom component that uses the provider. In this
@@ -899,7 +899,7 @@ export default Storybook.story('SearchQueryBuilder', story => {
{`
function OpenDropdownButton() {
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
const handleClick = () => {
dispatch({
diff --git a/static/app/components/searchQueryBuilder/index.tsx b/static/app/components/searchQueryBuilder/index.tsx
index dad371549b22d7..5474636b470765 100644
--- a/static/app/components/searchQueryBuilder/index.tsx
+++ b/static/app/components/searchQueryBuilder/index.tsx
@@ -1,4 +1,4 @@
-import {useContext, useLayoutEffect} from 'react';
+import {useLayoutEffect} from 'react';
import {css} from '@emotion/react';
import styled from '@emotion/styled';
@@ -7,9 +7,11 @@ import {Input} from '@sentry/scraps/input';
import {Tooltip} from '@sentry/scraps/tooltip';
import {
- SearchQueryBuilderContext,
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useHasSearchQueryBuilderProvider,
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
} from 'sentry/components/searchQueryBuilder/context';
import type {CaseInsensitive} from 'sentry/components/searchQueryBuilder/hooks';
import {useOnChange} from 'sentry/components/searchQueryBuilder/hooks/useOnChange';
@@ -217,8 +219,9 @@ function ActionButtons({
ref?: React.Ref;
trailingItems?: React.ReactNode;
}) {
- const {clearSearchQuery, disabled, query, caseInsensitive, onCaseInsensitiveClick} =
- useSearchQueryBuilder();
+ const {clearSearchQuery, query} = useSearchQueryBuilderState();
+ const {disabled, caseInsensitive, onCaseInsensitiveClick} =
+ useSearchQueryBuilderConfig();
if (disabled) {
return null;
@@ -269,8 +272,8 @@ function SearchQueryBuilderUI({
trailingItems,
onChange,
}: SearchQueryBuilderProps) {
- const {parsedQuery, query, dispatch, wrapperRef, actionBarRef, size} =
- useSearchQueryBuilder();
+ const {parsedQuery, query, dispatch} = useSearchQueryBuilderState();
+ const {wrapperRef, actionBarRef, size} = useSearchQueryBuilderLayout();
useOnChange({onChange});
useLayoutEffect(() => {
@@ -311,9 +314,9 @@ function SearchQueryBuilderUI({
}
export function SearchQueryBuilder({...props}: SearchQueryBuilderProps) {
- const contextValue = useContext(SearchQueryBuilderContext);
+ const hasProvider = useHasSearchQueryBuilderProvider();
- if (contextValue) {
+ if (hasProvider) {
return ;
}
return (
diff --git a/static/app/components/searchQueryBuilder/plainTextQueryInput.tsx b/static/app/components/searchQueryBuilder/plainTextQueryInput.tsx
index a597540787b931..c14133d4cc767d 100644
--- a/static/app/components/searchQueryBuilder/plainTextQueryInput.tsx
+++ b/static/app/components/searchQueryBuilder/plainTextQueryInput.tsx
@@ -8,7 +8,11 @@ import {
} from 'react';
import styled from '@emotion/styled';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {HighlightQuery} from 'sentry/components/searchSyntax/renderer';
interface PlainTextQueryInputProps {
@@ -17,8 +21,9 @@ interface PlainTextQueryInputProps {
export function PlainTextQueryInput({label}: PlainTextQueryInputProps) {
const inputRef = useRef(null);
- const {query, parsedQuery, dispatch, handleSearch, size, placeholder, disabled} =
- useSearchQueryBuilder();
+ const {query, parsedQuery, dispatch, handleSearch} = useSearchQueryBuilderState();
+ const {placeholder, disabled} = useSearchQueryBuilderConfig();
+ const {size} = useSearchQueryBuilderLayout();
const [cursorPosition, setCursorPosition] = useState(0);
const setCursorPositionOnEvent = (event: SyntheticEvent) => {
diff --git a/static/app/components/searchQueryBuilder/selectionKeyHandler.tsx b/static/app/components/searchQueryBuilder/selectionKeyHandler.tsx
index 89d24b09f2ab38..0fd75ea93e90f3 100644
--- a/static/app/components/searchQueryBuilder/selectionKeyHandler.tsx
+++ b/static/app/components/searchQueryBuilder/selectionKeyHandler.tsx
@@ -1,7 +1,11 @@
import {VisuallyHidden} from '@react-aria/visually-hidden';
import type {ListState} from '@react-stately/list';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useKeyboardSelection} from 'sentry/components/searchQueryBuilder/hooks/useKeyboardSelection';
import {findNearestFreeTextKey} from 'sentry/components/searchQueryBuilder/utils';
import type {ParseResultToken} from 'sentry/components/searchSyntax/parser';
@@ -29,7 +33,9 @@ export function SelectionKeyHandler({
undo,
gridRef,
}: SelectionKeyHandlerProps) {
- const {dispatch, disabled, currentInputValueRef} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
const {selectInDirection} = useKeyboardSelection();
const selectedTokens = [...state.collection.getKeys()]
diff --git a/static/app/components/searchQueryBuilder/tokenizedQueryGrid.tsx b/static/app/components/searchQueryBuilder/tokenizedQueryGrid.tsx
index d33a325d87a263..fae7113840dfea 100644
--- a/static/app/components/searchQueryBuilder/tokenizedQueryGrid.tsx
+++ b/static/app/components/searchQueryBuilder/tokenizedQueryGrid.tsx
@@ -6,7 +6,10 @@ import type {ListState} from '@react-stately/list';
import {useListState} from '@react-stately/list';
import type {CollectionChildren} from '@react-types/shared';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {KeyboardSelection} from 'sentry/components/searchQueryBuilder/hooks/useKeyboardSelection';
import {useQueryBuilderGrid} from 'sentry/components/searchQueryBuilder/hooks/useQueryBuilderGrid';
import {useSelectOnDrag} from 'sentry/components/searchQueryBuilder/hooks/useSelectOnDrag';
@@ -34,7 +37,7 @@ interface GridProps extends AriaGridListOptions {
}
function useAutoFocus(autoFocus: boolean, state: ListState) {
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
const autoFocused = useRef(!autoFocus);
useEffect(() => {
@@ -49,7 +52,7 @@ function useAutoFocus(autoFocus: boolean, state: ListState) {
}
function useApplyFocusOverride(state: ListState) {
- const {focusOverride, dispatch} = useSearchQueryBuilder();
+ const {focusOverride, dispatch} = useSearchQueryBuilderState();
useLayoutEffect(() => {
if (focusOverride && !focusOverride.part) {
@@ -68,7 +71,8 @@ function useApplyFocusOverride(state: ListState) {
function Grid(props: GridProps) {
const ref = useRef(null);
const selectionKeyHandlerRef = useRef(null);
- const {size, dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {size} = useSearchQueryBuilderLayout();
const state = useListState({
...props,
selectionBehavior: 'replace',
@@ -168,7 +172,7 @@ export function TokenizedQueryGrid({
label,
actionBarWidth,
}: TokenizedQueryGridProps) {
- const {parsedQuery} = useSearchQueryBuilder();
+ const {parsedQuery} = useSearchQueryBuilderState();
// Shouldn't ever get here since we will render the plain text input instead
if (!parsedQuery) {
diff --git a/static/app/components/searchQueryBuilder/tokens/boolean.tsx b/static/app/components/searchQueryBuilder/tokens/boolean.tsx
index 5cc8eeea18d6ea..9de3c11b9378ec 100644
--- a/static/app/components/searchQueryBuilder/tokens/boolean.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/boolean.tsx
@@ -9,7 +9,10 @@ import type {Node} from '@react-types/shared';
import {CompactSelect} from '@sentry/scraps/compactSelect';
import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useQueryBuilderGridItem} from 'sentry/components/searchQueryBuilder/hooks/useQueryBuilderGridItem';
import {
BaseGridCell,
@@ -34,7 +37,8 @@ type SearchQueryBuilderBooleanProps = {
};
function FilterDelete({token, state, item}: SearchQueryBuilderBooleanProps) {
- const {dispatch, disabled} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
const filterButtonProps = useFilterButtonProps({state, item});
return (
@@ -64,7 +68,8 @@ export function SearchQueryBuilderBoolean({
}: SearchQueryBuilderBooleanProps) {
const ref = useRef(null);
const [filterMenuOpen, setFilterMenuOpen] = useState(false);
- const {disabled, dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
const {rowProps, gridCellProps} = useQueryBuilderGridItem(item, state, ref);
const {focusWithinProps} = useFocusWithin({});
const filterButtonProps = useFilterButtonProps({state, item});
diff --git a/static/app/components/searchQueryBuilder/tokens/combobox.tsx b/static/app/components/searchQueryBuilder/tokens/combobox.tsx
index 5d343c5edef841..18ba6f4a63ad1b 100644
--- a/static/app/components/searchQueryBuilder/tokens/combobox.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/combobox.tsx
@@ -30,7 +30,12 @@ import {Overlay} from 'sentry/components/overlay';
import {AskSeer} from 'sentry/components/searchQueryBuilder/askSeer/askSeer';
import {ASK_SEER_CONSENT_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerConsentOption';
import {ASK_SEER_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerOption';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useSearchTokenCombobox} from 'sentry/components/searchQueryBuilder/tokens/useSearchTokenCombobox';
import {
findItemInSections,
@@ -295,7 +300,7 @@ function OverlayContent>({
isLoading?: boolean;
portalTarget?: HTMLElement | null;
}) {
- const {enableAISearch} = useSearchQueryBuilder();
+ const {enableAISearch} = useSearchQueryBuilderAI();
const anyItemsShowing = totalOptions > hiddenOptions.size;
if (customMenu) {
@@ -381,8 +386,10 @@ export function SearchQueryBuilderCombobox<
['data-test-id']: dataTestId,
ref,
}: SearchQueryBuilderComboboxProps) {
- const {clearSearchQuery, disabled, portalTarget, enableAISearch, wrapperRef} =
- useSearchQueryBuilder();
+ const {clearSearchQuery} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
+ const {portalTarget, wrapperRef} = useSearchQueryBuilderLayout();
+ const {enableAISearch} = useSearchQueryBuilderAI();
const listBoxRef = useRef(null);
const inputRef = useRef(null);
const popoverRef = useRef(null);
diff --git a/static/app/components/searchQueryBuilder/tokens/deletableToken.tsx b/static/app/components/searchQueryBuilder/tokens/deletableToken.tsx
index 53397a75fbffe6..8a4a804ed4af1a 100644
--- a/static/app/components/searchQueryBuilder/tokens/deletableToken.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/deletableToken.tsx
@@ -7,7 +7,7 @@ import type {Node} from '@react-types/shared';
import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderState} from 'sentry/components/searchQueryBuilder/context';
import {useQueryBuilderGridItem} from 'sentry/components/searchQueryBuilder/hooks/useQueryBuilderGridItem';
import {InvalidTokenTooltip} from 'sentry/components/searchQueryBuilder/tokens/invalidTokenTooltip';
import {
@@ -39,7 +39,7 @@ export function DeletableToken({
invalid,
}: DeletableTokenProps) {
const ref = useRef(null);
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
const {rowProps, gridCellProps} = useQueryBuilderGridItem(item, state, ref);
const {shiftFocusProps} = useShiftFocusToChild(item, state);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/aggregateKey.tsx b/static/app/components/searchQueryBuilder/tokens/filter/aggregateKey.tsx
index 3176fe4507a69b..bd86bb945acd7b 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/aggregateKey.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/aggregateKey.tsx
@@ -7,7 +7,10 @@ import type {Node} from '@react-types/shared';
import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {SearchQueryBuilderParametersCombobox} from 'sentry/components/searchQueryBuilder/tokens/filter/parametersCombobox';
import {UnstyledButton} from 'sentry/components/searchQueryBuilder/tokens/filter/unstyledButton';
import {useAggregateParamVisual} from 'sentry/components/searchQueryBuilder/tokens/filter/useAggregateParamVisual';
@@ -49,7 +52,8 @@ export function AggregateKey({
filterRef,
}: AggregateKeyProps) {
const ref = useRef(null);
- const {dispatch, focusOverride, disabled} = useSearchQueryBuilder();
+ const {dispatch, focusOverride} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
const [isEditing, setIsEditing] = useState(false);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/filter.tsx b/static/app/components/searchQueryBuilder/tokens/filter/filter.tsx
index 7b8d2976cca52a..44319a016fd38a 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/filter.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/filter.tsx
@@ -9,7 +9,11 @@ import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
import {Flex} from '@sentry/scraps/layout';
import {DateTime} from 'sentry/components/dateTime';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useQueryBuilderGridItem} from 'sentry/components/searchQueryBuilder/hooks/useQueryBuilderGridItem';
import {
BaseGridCell,
@@ -51,7 +55,8 @@ interface FilterValueProps extends SearchQueryTokenProps {
}
export function FilterValueText({token}: {token: TokenResult}) {
- const {size, getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
+ const {size} = useSearchQueryBuilderLayout();
const valueType = getFilterValueType(token, getFieldDefinition(getKeyName(token.key)));
if (token.filter === FilterType.HAS) {
@@ -113,7 +118,8 @@ export function FilterValueText({token}: {token: TokenResult}) {
function FilterValue({token, state, item, filterRef, onActiveChange}: FilterValueProps) {
const ref = useRef(null);
- const {dispatch, focusOverride, disabled} = useSearchQueryBuilder();
+ const {dispatch, focusOverride} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
const [isEditing, setIsEditing] = useState(false);
@@ -181,7 +187,8 @@ function FilterValue({token, state, item, filterRef, onActiveChange}: FilterValu
}
function FilterDelete({token, state, item}: SearchQueryTokenProps) {
- const {dispatch, disabled} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {disabled} = useSearchQueryBuilderConfig();
const filterButtonProps = useFilterButtonProps({state, item});
return (
@@ -205,7 +212,8 @@ export function SearchQueryBuilderFilter({item, state, token}: SearchQueryTokenP
const isFocused = item.key === state.selectionManager.focusedKey;
- const {dispatch, invalidFilterKeys} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {invalidFilterKeys} = useSearchQueryBuilderConfig();
const {rowProps, gridCellProps} = useQueryBuilderGridItem(item, state, ref);
const onKeyDown = (e: React.KeyboardEvent) => {
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/filterKey.tsx b/static/app/components/searchQueryBuilder/tokens/filter/filterKey.tsx
index b997d07ad2e8a7..a02dc262407827 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/filterKey.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/filterKey.tsx
@@ -8,7 +8,7 @@ import type {Node} from '@react-types/shared';
import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
import {Tooltip} from '@sentry/scraps/tooltip';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
import {FilterKeyCombobox} from 'sentry/components/searchQueryBuilder/tokens/filter/filterKeyCombobox';
import {UnstyledButton} from 'sentry/components/searchQueryBuilder/tokens/filter/unstyledButton';
import {useFilterButtonProps} from 'sentry/components/searchQueryBuilder/tokens/filter/useFilterButtonProps';
@@ -30,7 +30,7 @@ type FilterKeyProps = {
export function FilterKey({item, state, token, onActiveChange}: FilterKeyProps) {
const ref = useRef(null);
- const {disabled, getFieldDefinition} = useSearchQueryBuilder();
+ const {disabled, getFieldDefinition} = useSearchQueryBuilderConfig();
const fieldDefinition = getFieldDefinition(token.key.text);
const [isEditing, setIsEditing] = useState(false);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/filterKeyCombobox.tsx b/static/app/components/searchQueryBuilder/tokens/filter/filterKeyCombobox.tsx
index ecb0f8c077f88f..28328e65586d30 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/filterKeyCombobox.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/filterKeyCombobox.tsx
@@ -8,7 +8,12 @@ import {useAnalyticsArea} from 'sentry/components/analyticsArea';
import {useSeerAcknowledgeMutation} from 'sentry/components/events/autofix/useSeerAcknowledgeMutation';
import {ASK_SEER_CONSENT_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerConsentOption';
import {ASK_SEER_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerOption';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {SearchQueryBuilderCombobox} from 'sentry/components/searchQueryBuilder/tokens/combobox';
import {getFilterValueType} from 'sentry/components/searchQueryBuilder/tokens/filter/utils';
import type {SearchKeyItem} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/types';
@@ -42,14 +47,10 @@ export function FilterKeyCombobox({token, onCommit, item}: KeyComboboxProps) {
inputValue,
includeSuggestions: false,
});
- const {
- dispatch,
- getFieldDefinition,
- getSuggestedFilterKey,
- setDisplayAskSeer,
- currentInputValueRef,
- setAutoSubmitSeer,
- } = useSearchQueryBuilder();
+ const {getFieldDefinition, getSuggestedFilterKey} = useSearchQueryBuilderConfig();
+ const {dispatch} = useSearchQueryBuilderState();
+ const {setDisplayAskSeer, setAutoSubmitSeer} = useSearchQueryBuilderAI();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
const analyticsArea = useAnalyticsArea();
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/filterOperator.tsx b/static/app/components/searchQueryBuilder/tokens/filter/filterOperator.tsx
index cd30b54cb9fbe2..9ebc3221bfc31a 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/filterOperator.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/filterOperator.tsx
@@ -11,7 +11,10 @@ import InteractionStateLayer from '@sentry/scraps/interactionStateLayer';
import {Flex} from '@sentry/scraps/layout';
import {Tooltip} from '@sentry/scraps/tooltip';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {UnstyledButton} from 'sentry/components/searchQueryBuilder/tokens/filter/unstyledButton';
import {useFilterButtonProps} from 'sentry/components/searchQueryBuilder/tokens/filter/useFilterButtonProps';
import {
@@ -72,7 +75,7 @@ function FilterKeyOperatorLabel({
includeKeyLabel?: boolean;
opLabel?: string;
}) {
- const {getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
const fieldDefinition = getFieldDefinition(keyValue);
if (!includeKeyLabel) {
@@ -219,15 +222,9 @@ export function getOperatorInfo({
export function FilterOperator({state, item, token, onOpenChange}: FilterOperatorProps) {
const organization = useOrganization();
- const {
- dispatch,
- searchSource,
- query,
- recentSearches,
- disabled,
- focusOverride,
- getFieldDefinition,
- } = useSearchQueryBuilder();
+ const {dispatch, query, focusOverride} = useSearchQueryBuilderState();
+ const {searchSource, recentSearches, disabled, getFieldDefinition} =
+ useSearchQueryBuilderConfig();
const filterButtonProps = useFilterButtonProps({state, item});
const {focusWithinProps} = useFocusWithin({});
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/functionDescription.tsx b/static/app/components/searchQueryBuilder/tokens/filter/functionDescription.tsx
index 40716420973f3b..f9ed9b8adac861 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/functionDescription.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/functionDescription.tsx
@@ -1,7 +1,7 @@
import {Fragment} from 'react';
import styled from '@emotion/styled';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
import type {AggregateFilter} from 'sentry/components/searchSyntax/parser';
import {getKeyName} from 'sentry/components/searchSyntax/utils';
import type {AggregateParameter} from 'sentry/utils/fields';
@@ -24,7 +24,7 @@ function getParameterLabel(param: AggregateParameter) {
}
export function FunctionDescription({token, parameterIndex}: FunctionDescriptionProps) {
- const {getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
const fnName = getKeyName(token.key);
const fieldDefinition = getFieldDefinition(fnName);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/parametersCombobox.tsx b/static/app/components/searchQueryBuilder/tokens/filter/parametersCombobox.tsx
index b4e6b0c5638014..3e4963dfd7ac1b 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/parametersCombobox.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/parametersCombobox.tsx
@@ -7,7 +7,10 @@ import type {KeyboardEvent} from '@react-types/shared';
import type {SelectOptionWithKey} from '@sentry/scraps/compactSelect';
import {getEscapedKey} from '@sentry/scraps/compactSelect';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {SearchQueryBuilderCombobox} from 'sentry/components/searchQueryBuilder/tokens/combobox';
import {FunctionDescription} from 'sentry/components/searchQueryBuilder/tokens/filter/functionDescription';
import {replaceCommaSeparatedValue} from 'sentry/components/searchQueryBuilder/tokens/filter/replaceCommaSeparatedValue';
@@ -160,7 +163,7 @@ function useParameterSuggestions({
parameterIndex: number;
token: AggregateFilter;
}): Array> {
- const {getFieldDefinition, filterKeys} = useSearchQueryBuilder();
+ const {getFieldDefinition, filterKeys} = useSearchQueryBuilderConfig();
const fieldDefinition = getFieldDefinition(token.key.name.text);
const parameterDefinition = fieldDefinition?.parameters?.[parameterIndex];
@@ -240,10 +243,10 @@ export function SearchQueryBuilderParametersCombobox({
onDelete,
onKeyDown: passedOnKeyDown,
}: ParametersComboboxProps) {
- const {getFieldDefinition, getSuggestedFilterKey} = useSearchQueryBuilder();
+ const {getFieldDefinition, getSuggestedFilterKey} = useSearchQueryBuilderConfig();
const inputRef = useRef(null);
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
const initialValue = getInitialInputValue(token);
const [inputValue, setInputValue] = useState('');
const [inputChanged, setInputChanged] = useState(false);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/useAggregateParamVisual.tsx b/static/app/components/searchQueryBuilder/tokens/filter/useAggregateParamVisual.tsx
index c9dc17d763a4aa..b09288b32ba0fa 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/useAggregateParamVisual.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/useAggregateParamVisual.tsx
@@ -1,6 +1,6 @@
import {useMemo} from 'react';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
import {getKeyLabel} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/utils';
import type {AggregateFilter} from 'sentry/components/searchSyntax/parser';
@@ -9,7 +9,7 @@ interface UseAggregateParamVisualOptions {
}
export function useAggregateParamVisual({token}: UseAggregateParamVisualOptions) {
- const {filterKeys, getFieldDefinition} = useSearchQueryBuilder();
+ const {filterKeys, getFieldDefinition} = useSearchQueryBuilderConfig();
return useMemo(() => {
const aggregateDefinition = getFieldDefinition(token.key.name.text);
diff --git a/static/app/components/searchQueryBuilder/tokens/filter/valueCombobox.tsx b/static/app/components/searchQueryBuilder/tokens/filter/valueCombobox.tsx
index 660c19633d2cbc..000ce055dcffc1 100644
--- a/static/app/components/searchQueryBuilder/tokens/filter/valueCombobox.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filter/valueCombobox.tsx
@@ -17,7 +17,11 @@ import {
} from 'sentry/components/searchBar/types';
import {ASK_SEER_CONSENT_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerConsentOption';
import {ASK_SEER_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerOption';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {HighlightText} from 'sentry/components/searchQueryBuilder/highlightText';
import {
SearchQueryBuilderCombobox,
@@ -360,7 +364,7 @@ function useFilterSuggestions({
token: TokenResult;
}) {
const keyName = getKeyName(token.key);
- const {getFieldDefinition, getTagValues, filterKeys} = useSearchQueryBuilder();
+ const {getFieldDefinition, getTagValues, filterKeys} = useSearchQueryBuilderConfig();
const key = filterKeys[keyName];
const fieldDefinition = getFieldDefinition(keyName);
const valueType = getFilterValueType(token, fieldDefinition);
@@ -516,7 +520,7 @@ function ItemCheckbox({
value: string;
}) {
const {ctrlKeyPressed, selectedValueMap, token} = useValueComboboxContext();
- const {dispatch} = useSearchQueryBuilder();
+ const {dispatch} = useSearchQueryBuilderState();
const selected = selectedValueMap.get(value) ?? false;
return (
@@ -618,16 +622,16 @@ export function SearchQueryBuilderValueCombobox({
const ref = useRef(null);
const inputRef = useRef(null);
const organization = useOrganization();
+ const {dispatch} = useSearchQueryBuilderState();
const {
getFieldDefinition,
getSuggestedFilterKey,
filterKeys,
- dispatch,
searchSource,
recentSearches,
disallowWildcard,
- wrapperRef: topLevelWrapperRef,
- } = useSearchQueryBuilder();
+ } = useSearchQueryBuilderConfig();
+ const {wrapperRef: topLevelWrapperRef} = useSearchQueryBuilderLayout();
const keyName = getKeyName(token.key);
const fieldDefinition = getFieldDefinition(keyName);
const canSelectMultipleValues = tokenSupportsMultipleValues(
diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx
index cb5303289fd434..4f171aa9b55ea3 100644
--- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/index.tsx
@@ -16,7 +16,12 @@ import {Overlay} from 'sentry/components/overlay';
import {AskSeer} from 'sentry/components/searchQueryBuilder/askSeer/askSeer';
import {ASK_SEER_CONSENT_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerConsentOption';
import {ASK_SEER_ITEM_KEY} from 'sentry/components/searchQueryBuilder/askSeer/askSeerOption';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import type {CustomComboboxMenuProps} from 'sentry/components/searchQueryBuilder/tokens/combobox';
import {KeyDescription} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/keyDescription';
import type {Section} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/types';
@@ -74,7 +79,7 @@ function ListBoxSectionButton({
}
function FeedbackFooter() {
- const {searchSource} = useSearchQueryBuilder();
+ const {searchSource} = useSearchQueryBuilderConfig();
return (
@@ -204,7 +209,8 @@ function FilterKeyMenuContent>({
fullWidth,
sections,
}: FilterKeyMenuContentProps) {
- const {filterKeys, enableAISearch} = useSearchQueryBuilder();
+ const {filterKeys} = useSearchQueryBuilderConfig();
+ const {enableAISearch} = useSearchQueryBuilderAI();
const focusedItem = state.selectionManager.focusedKey
? (state.collection.getItem(state.selectionManager.focusedKey)?.props?.value as
| string
@@ -290,8 +296,10 @@ export function FilterKeyListBox>
setSelectedSection,
overlayProps,
}: FilterKeyListBoxProps) {
- const {filterKeyMenuWidth, wrapperRef, query, portalTarget, enableAISearch, size} =
- useSearchQueryBuilder();
+ const {query} = useSearchQueryBuilderState();
+ const {filterKeyMenuWidth, wrapperRef, portalTarget, size} =
+ useSearchQueryBuilderLayout();
+ const {enableAISearch} = useSearchQueryBuilderAI();
const hiddenOptionsWithRecentsAndAskSeerAdded = useMemo>(() => {
const baseHidden = [
diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/keyDescription.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/keyDescription.tsx
index a82cbda53ceaa8..a169a46b6373e7 100644
--- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/keyDescription.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/keyDescription.tsx
@@ -1,6 +1,6 @@
import styled from '@emotion/styled';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
import {getKeyLabel} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/utils';
import {t} from 'sentry/locale';
import type {Tag} from 'sentry/types/group';
@@ -33,7 +33,7 @@ export function ValueType({
}
export function KeyDescription({size = 'sm', tag}: KeyDescriptionProps) {
- const {getFieldDefinition} = useSearchQueryBuilder();
+ const {getFieldDefinition} = useSearchQueryBuilderConfig();
const fieldDefinition = getFieldDefinition(tag.key);
diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useFilterKeyListBox.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useFilterKeyListBox.tsx
index 16ea2ecff84757..216c27326dc9b2 100644
--- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useFilterKeyListBox.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useFilterKeyListBox.tsx
@@ -5,7 +5,12 @@ import type {Node} from '@react-types/shared';
import {useAnalyticsArea} from 'sentry/components/analyticsArea';
import {useSeerAcknowledgeMutation} from 'sentry/components/events/autofix/useSeerAcknowledgeMutation';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import type {CustomComboboxMenu} from 'sentry/components/searchQueryBuilder/tokens/combobox';
import {FilterKeyListBox} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox';
import type {
@@ -91,7 +96,8 @@ function findNextMatchingItem(
}
function useFilterKeyItems() {
- const {filterKeySections, getFieldDefinition, filterKeys} = useSearchQueryBuilder();
+ const {filterKeySections, getFieldDefinition, filterKeys} =
+ useSearchQueryBuilderConfig();
const sectionedItems = useMemo(() => {
const flatFilterKeys = Object.keys(filterKeys);
@@ -134,7 +140,8 @@ function useFilterKeySections({
}: {
recentSearches: RecentSearch[] | undefined;
}) {
- const {filterKeySections, query, disallowLogicalOperators} = useSearchQueryBuilder();
+ const {query} = useSearchQueryBuilderState();
+ const {filterKeySections, disallowLogicalOperators} = useSearchQueryBuilderConfig();
const sections = useMemo(() => {
const definedSections = filterKeySections.map(section => ({
value: section.value,
@@ -192,15 +199,11 @@ interface UseFilterKeyListBoxArgs {
}
export function useFilterKeyListBox({filterValue}: UseFilterKeyListBoxArgs) {
- const {
- filterKeys,
- getFieldDefinition,
- setAutoSubmitSeer,
- setDisplayAskSeer,
- enableAISearch,
- currentInputValueRef,
- disallowLogicalOperators,
- } = useSearchQueryBuilder();
+ const {filterKeys, getFieldDefinition, disallowLogicalOperators} =
+ useSearchQueryBuilderConfig();
+ const {setAutoSubmitSeer, setDisplayAskSeer, enableAISearch} =
+ useSearchQueryBuilderAI();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
const analyticsArea = useAnalyticsArea();
const {sectionedItems} = useFilterKeyItems();
const recentFilters = useRecentSearchFilters();
diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearchFilters.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearchFilters.tsx
index 8058c9877253ca..3a91d8c22ba1bb 100644
--- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearchFilters.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearchFilters.tsx
@@ -1,6 +1,9 @@
import {useMemo} from 'react';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useRecentSearches} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearches';
import type {FieldDefinitionGetter} from 'sentry/components/searchQueryBuilder/types';
import {parseQueryBuilderValue} from 'sentry/components/searchQueryBuilder/utils';
@@ -117,8 +120,9 @@ function getFiltersFromRecentSearches(
* Orders by highest count of filter key occurrences.
*/
export function useRecentSearchFilters() {
- const {parsedQuery, filterKeys, getFieldDefinition, filterKeyAliases} =
- useSearchQueryBuilder();
+ const {parsedQuery} = useSearchQueryBuilderState();
+ const {filterKeys, getFieldDefinition, filterKeyAliases} =
+ useSearchQueryBuilderConfig();
const {data: recentSearchesData} = useRecentSearches();
const filters = useMemo(
diff --git a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearches.tsx b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearches.tsx
index ff0784dc3af13b..8074f276894549 100644
--- a/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearches.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/filterKeyListBox/useRecentSearches.tsx
@@ -1,8 +1,8 @@
import {useFetchRecentSearches} from 'sentry/actionCreators/savedSearches';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {useSearchQueryBuilderConfig} from 'sentry/components/searchQueryBuilder/context';
export function useRecentSearches() {
- const {recentSearches, namespace} = useSearchQueryBuilder();
+ const {recentSearches, namespace} = useSearchQueryBuilderConfig();
return useFetchRecentSearches(
{
diff --git a/static/app/components/searchQueryBuilder/tokens/freeText.tsx b/static/app/components/searchQueryBuilder/tokens/freeText.tsx
index dc85843fea7c51..89fe79782f8599 100644
--- a/static/app/components/searchQueryBuilder/tokens/freeText.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/freeText.tsx
@@ -5,7 +5,12 @@ import {Item, Section} from '@react-stately/collections';
import type {ListState} from '@react-stately/list';
import type {KeyboardEvent, Node} from '@react-types/shared';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderConfig,
+ useSearchQueryBuilderInteraction,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {useQueryBuilderGridItem} from 'sentry/components/searchQueryBuilder/hooks/useQueryBuilderGridItem';
import {SearchQueryBuilderCombobox} from 'sentry/components/searchQueryBuilder/tokens/combobox';
import {useFilterKeyListBox} from 'sentry/components/searchQueryBuilder/tokens/filterKeyListBox/useFilterKeyListBox';
@@ -260,20 +265,18 @@ function SearchQueryBuilderInputInternal({
const filterValue = getWordAtCursorPosition(inputValue, selectionIndex);
+ const {query, dispatch, handleSearch} = useSearchQueryBuilderState();
const {
- query,
filterKeys,
- dispatch,
getFieldDefinition,
getSuggestedFilterKey,
- handleSearch,
placeholder,
searchSource,
recentSearches,
- currentInputValueRef,
- consumeReopenDropdownOnQueryClear,
- reopenDropdownOnQueryClear,
- } = useSearchQueryBuilder();
+ } = useSearchQueryBuilderConfig();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
+ const {consumeReopenDropdownOnQueryClear, reopenDropdownOnQueryClear} =
+ useSearchQueryBuilderInteraction();
const resetInputValue = useCallback(() => {
setInputValue(trimmedTokenValue);
diff --git a/static/app/components/searchQueryBuilder/tokens/useSortedFilterKeyItems.tsx b/static/app/components/searchQueryBuilder/tokens/useSortedFilterKeyItems.tsx
index 739c0d0340a7b2..3847cb86dd2c50 100644
--- a/static/app/components/searchQueryBuilder/tokens/useSortedFilterKeyItems.tsx
+++ b/static/app/components/searchQueryBuilder/tokens/useSortedFilterKeyItems.tsx
@@ -2,7 +2,10 @@ import {useMemo, type ReactNode} from 'react';
import {useQuery} from '@tanstack/react-query';
import type Fuse from 'fuse.js';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderConfig,
+} from 'sentry/components/searchQueryBuilder/context';
import type {
KeySectionItem,
SearchKeyItem,
@@ -171,9 +174,9 @@ export function useSortedFilterKeyItems({
disallowLogicalOperators,
replaceRawSearchKeys,
matchKeySuggestions,
- enableAISearch,
getTagKeys,
- } = useSearchQueryBuilder();
+ } = useSearchQueryBuilderConfig();
+ const {enableAISearch} = useSearchQueryBuilderAI();
// Async key fetching with debounce when getTagKeys is provided
const shouldFetchAsync = !!getTagKeys;
diff --git a/static/app/components/stackTrace/issueStackTrace/index.tsx b/static/app/components/stackTrace/issueStackTrace/index.tsx
index ae28dece7063fa..edd0fdc44a144d 100644
--- a/static/app/components/stackTrace/issueStackTrace/index.tsx
+++ b/static/app/components/stackTrace/issueStackTrace/index.tsx
@@ -38,8 +38,8 @@ import {defined} from 'sentry/utils';
import {useDetailedProject} from 'sentry/utils/project/useDetailedProject';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {IssueFrameActions} from './issueFrameActions';
import {IssueStackTraceFrameContext} from './issueStackTraceFrameContext';
diff --git a/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx b/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
index a86f40bdae152e..9b2489684cb6f3 100644
--- a/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
+++ b/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
@@ -30,8 +30,8 @@ import type {Event, ExceptionValue} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import type {StacktraceType} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
import {
formatExceptionsAsText,
diff --git a/static/app/types/overrides.tsx b/static/app/types/overrides.tsx
index 7276f6385dfc29..a2eefec856f4d9 100644
--- a/static/app/types/overrides.tsx
+++ b/static/app/types/overrides.tsx
@@ -19,7 +19,7 @@ import type {
useMaxPickableDays,
} from 'sentry/utils/useMaxPickableDays';
import type {WidgetType} from 'sentry/views/dashboards/types';
-import type {AutofixContentProps} from 'sentry/views/issueDetails/streamline/sidebar/autofixSection';
+import type {AutofixContentProps} from 'sentry/views/issueDetails/sidebar/autofixSection';
import type {UseScmFeatureMetaResult} from 'sentry/views/onboarding/components/useScmFeatureMeta';
import type {OrganizationStatsProps} from 'sentry/views/organizationStats';
import type {RouteAnalyticsContext} from 'sentry/views/routeAnalyticsContextProvider';
diff --git a/static/app/utils/number/NUMBER_FORMATTING.md b/static/app/utils/number/NUMBER_FORMATTING.md
index 13bf6f13d87c8c..d2435815dfd586 100644
--- a/static/app/utils/number/NUMBER_FORMATTING.md
+++ b/static/app/utils/number/NUMBER_FORMATTING.md
@@ -527,13 +527,13 @@ Only `static/app/utils/discover/charts.tsx` (discover y-axis formatter for durat
## `getExactDuration` — ~7 call sites
-| Where | Pattern |
-| -------------------------------------------------------------------------- | ------------------------------------------------ |
-| `gsApp/views/spikeProtection/spikeProtectionHistoryTable.tsx` | `getExactDuration(duration, true)` (abbreviated) |
-| `views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection.tsx` | Default |
-| `views/detectors/components/details/metric/detect.tsx` (×2) | Default |
-| `views/settings/project/projectKeys/details/keyRateLimitsForm.tsx` (×2) | Default |
-| `components/duration.tsx` | Conditional via `` prop |
+| Where | Pattern |
+| ----------------------------------------------------------------------- | ------------------------------------------------ |
+| `gsApp/views/spikeProtection/spikeProtectionHistoryTable.tsx` | `getExactDuration(duration, true)` (abbreviated) |
+| `views/issueDetails/sidebar/metricDetectorTriggeredSection.tsx` | Default |
+| `views/detectors/components/details/metric/detect.tsx` (×2) | Default |
+| `views/settings/project/projectKeys/details/keyRateLimitsForm.tsx` (×2) | Default |
+| `components/duration.tsx` | Conditional via `` prop |
Used only where a full breakdown is desired (e.g., `"1 hour 25 minutes 15 seconds"` for an alert time window, not `"1.4 hours"`).
diff --git a/static/app/utils/useIssueEventOwners.tsx b/static/app/utils/useIssueEventOwners.tsx
index b5f600c65bb03b..c24c28c0622d9a 100644
--- a/static/app/utils/useIssueEventOwners.tsx
+++ b/static/app/utils/useIssueEventOwners.tsx
@@ -2,7 +2,7 @@ import {getApiUrl} from 'sentry/utils/api/getApiUrl';
import type {ApiQueryKey, UseApiQueryOptions} from 'sentry/utils/queryClient';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
-import type {EventOwners} from 'sentry/views/issueDetails/streamline/header/getOwnerList';
+import type {EventOwners} from 'sentry/views/issueDetails/header/getOwnerList';
interface UseIssueEventOwnersProps {
eventId: string;
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs.spec.ts b/static/app/views/dashboards/utils/prebuiltConfigs.spec.ts
new file mode 100644
index 00000000000000..0ee4a66b71b070
--- /dev/null
+++ b/static/app/views/dashboards/utils/prebuiltConfigs.spec.ts
@@ -0,0 +1,43 @@
+import {NUM_DESKTOP_COLS} from 'sentry/views/dashboards/constants';
+import {
+ PREBUILT_DASHBOARDS,
+ PrebuiltDashboardId,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+
+// Must match the limits enforced by the backend serializer at
+// src/sentry/api/serializers/rest_framework/dashboard.py.
+const MAX_WIDGET_DESCRIPTION_LENGTH = 350;
+const MAX_WIDGET_TITLE_LENGTH = 255;
+const MAX_DASHBOARD_TITLE_LENGTH = 255;
+
+const entries = Object.entries(PREBUILT_DASHBOARDS) as Array<
+ [`${PrebuiltDashboardId}`, (typeof PREBUILT_DASHBOARDS)[PrebuiltDashboardId]]
+>;
+
+describe('PREBUILT_DASHBOARDS', () => {
+ it.each(entries)('dashboard %s has a title within the backend limit', (_id, config) => {
+ expect(config.title.length).toBeLessThanOrEqual(MAX_DASHBOARD_TITLE_LENGTH);
+ });
+
+ describe.each(entries)('dashboard %s widgets', (_id, config) => {
+ it.each(
+ config.widgets.map((widget, index) => [index, widget.title, widget] as const)
+ )('widget %i (%s) passes backend validation', (_index, _title, widget) => {
+ expect(widget.title.length).toBeLessThanOrEqual(MAX_WIDGET_TITLE_LENGTH);
+ expect(widget.description?.length ?? 0).toBeLessThanOrEqual(
+ MAX_WIDGET_DESCRIPTION_LENGTH
+ );
+
+ // x and w bounds are enforced by PrebuiltWidgetLayout's literal-union
+ // types; only the wide fields and the cross-field x+w invariant
+ // need runtime checks.
+ const layout = widget.layout;
+ if (layout) {
+ expect(layout.y).toBeGreaterThanOrEqual(0);
+ expect(layout.h).toBeGreaterThanOrEqual(1);
+ expect(layout.minH).toBeGreaterThanOrEqual(1);
+ expect(layout.x + layout.w).toBeLessThanOrEqual(NUM_DESKTOP_COLS);
+ }
+ });
+ });
+});
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs.tsx b/static/app/views/dashboards/utils/prebuiltConfigs.tsx
index 31bfbbe2047240..29ef57c650612f 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs.tsx
+++ b/static/app/views/dashboards/utils/prebuiltConfigs.tsx
@@ -1,5 +1,9 @@
import type {Project} from 'sentry/types/project';
-import {type DashboardDetails} from 'sentry/views/dashboards/types';
+import {
+ type DashboardDetails,
+ type Widget,
+ type WidgetLayout,
+} from 'sentry/views/dashboards/types';
import {AI_AGENTS_MODELS_PREBUILT_CONFIG} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsModels';
import {AI_AGENTS_OVERVIEW_PREBUILT_CONFIG} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsOverview';
import {AI_AGENTS_TOOLS_PREBUILT_CONFIG} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsTools';
@@ -90,7 +94,21 @@ type OnboardingConfig =
type: 'overview';
};
-export type PrebuiltDashboard = Omit & {
+// Narrow x/w to literal unions so the desktop-grid invariants (x in [0,5],
+// w in [1,6]) are checked at compile time for prebuilt configs. User-created
+// widgets stay on the wider `WidgetLayout` because their layouts come from
+// react-grid-layout arithmetic, not hand-written literals.
+export type PrebuiltWidgetLayout = Omit & {
+ w: 1 | 2 | 3 | 4 | 5 | 6;
+ x: 0 | 1 | 2 | 3 | 4 | 5;
+};
+
+export type PrebuiltWidget = Omit & {
+ layout?: PrebuiltWidgetLayout | null;
+};
+
+export type PrebuiltDashboard = Omit & {
+ widgets: PrebuiltWidget[];
onboarding?: OnboardingConfig;
};
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsModels.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsModels.ts
index 0fcbd8738c360b..ab59d25dfcf320 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsModels.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsModels.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {AI_AGENTS_MODELS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -97,7 +100,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const MODELS_TABLE = {
+const MODELS_TABLE: PrebuiltWidget = {
id: 'ai-agents-models-table',
title: t('Models'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsOverview.ts
index 64dcdcf3b20a29..85494331b30fb9 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsOverview.ts
@@ -2,7 +2,10 @@ import {COL_WIDTH_UNDEFINED} from 'sentry/components/tables/gridEditable';
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, MAX_TABLE_LIMIT, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {AI_AGENTS_OVERVIEW_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {
WIDGET_COLUMN_LABELS,
@@ -206,7 +209,7 @@ const SECOND_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const AGENTS_TRACES_TABLE = {
+const AGENTS_TRACES_TABLE: PrebuiltWidget = {
id: 'ai-agents-traces-table',
title: t('Traces'),
description: t('Agent traces with duration, token, cost, and tool usage.'),
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsTools.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsTools.ts
index acc1cfd9ad15b0..1ade63e690a12d 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsTools.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/aiAgentsTools.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {AI_AGENTS_TOOLS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -56,7 +59,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const TOOLS_TABLE = {
+const TOOLS_TABLE: PrebuiltWidget = {
id: 'ai-agents-tools-table',
title: t('Tools'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpOverview.ts
index 4402cbdc225d2d..fa9974cdec535d 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpOverview.ts
@@ -1,6 +1,9 @@
import {t} from 'sentry/locale';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {MCP_OVERVIEW_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -164,7 +167,7 @@ const SECOND_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const OVERVIEW_TABLE = {
+const OVERVIEW_TABLE: PrebuiltWidget = {
id: 'mcp-overview-table',
title: t('MCP Overview'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpPrompts.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpPrompts.ts
index 914f705a9440b1..f958f2b4d2ec91 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpPrompts.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpPrompts.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {MCP_PROMPTS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -76,7 +79,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const PROMPTS_TABLE = {
+const PROMPTS_TABLE: PrebuiltWidget = {
id: 'mcp-prompts-table',
title: t('Prompts'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpResources.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpResources.ts
index 363a577582af87..767082f0129821 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpResources.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpResources.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {MCP_RESOURCES_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -76,7 +79,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const RESOURCES_TABLE = {
+const RESOURCES_TABLE: PrebuiltWidget = {
id: 'mcp-resources-table',
title: t('Resources'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpTools.ts b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpTools.ts
index cf49305811d13d..e620c6e94a57f4 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpTools.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/ai/mcpTools.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {MCP_TOOLS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/ai/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -76,7 +79,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 3, minH: 3}
);
-const TOOLS_TABLE = {
+const TOOLS_TABLE: PrebuiltWidget = {
id: 'mcp-tools-table',
title: t('Tools'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/backendOverview/backendOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/backendOverview/backendOverview.ts
index 48105ec26d72fd..f34bc777f10d4a 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/backendOverview/backendOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/backendOverview/backendOverview.ts
@@ -2,8 +2,11 @@ import {COL_WIDTH_UNDEFINED} from 'sentry/components/tables/gridEditable';
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/backendOverview/settings';
import {BASE_FILTER_STRING} from 'sentry/views/dashboards/utils/prebuiltConfigs/queries/settings';
import {
@@ -215,7 +218,7 @@ const TABLE_FIELDS = [
`sum(${SpanFields.SPAN_DURATION})`,
];
-const TRANSACTIONS_TABLE: Widget = {
+const TRANSACTIONS_TABLE: PrebuiltWidget = {
id: 'backend-overview-transactions-table',
title: t('Transactions'),
description: '',
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/caches/caches.ts b/static/app/views/dashboards/utils/prebuiltConfigs/caches/caches.ts
index 8cef72382c079b..ae6de6c7e52dd7 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/caches/caches.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/caches/caches.ts
@@ -1,6 +1,9 @@
import {t} from 'sentry/locale';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/caches/settings';
import {
WIDGET_COLUMN_LABELS,
@@ -55,7 +58,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
0
);
-const TRANSACTION_TABLE: Widget = {
+const TRANSACTION_TABLE: PrebuiltWidget = {
id: 'transaction-table',
title: t('Transactions'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssets.ts b/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssets.ts
index de895c04bfad78..a5d8833a1b1745 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssets.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssets.ts
@@ -1,8 +1,11 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/frontendAssets/settings';
import {
WIDGET_COLUMN_LABELS,
@@ -57,7 +60,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
{h: 2, minH: 2}
);
-const ASSETS_TABLE: Widget = {
+const ASSETS_TABLE: PrebuiltWidget = {
id: 'assets-table',
title: t('Assets'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssetsDetails.ts b/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssetsDetails.ts
index 9272c872298c75..75e72de8a2fe84 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssetsDetails.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/frontendAssets/frontendAssetsDetails.ts
@@ -1,14 +1,17 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DETAILS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/frontendAssets/settings';
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
import type {DefaultDetailWidgetFields} from 'sentry/views/dashboards/widgets/detailsWidget/types';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-const ASSET_DESCRIPTION_WIDGET: Widget = {
+const ASSET_DESCRIPTION_WIDGET: PrebuiltWidget = {
id: 'domain-widget',
title: t('Example Asset'),
displayType: DisplayType.DETAILS,
@@ -229,7 +232,7 @@ const THIRD_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
3
);
-const ASSETS_TABLE_WIDGET: Widget = {
+const ASSETS_TABLE_WIDGET: PrebuiltWidget = {
id: 'assets-table-widget',
title: t('Pages Containing This Asset'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/frontendOverview/frontendOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/frontendOverview/frontendOverview.ts
index b1310ac4da9373..e9d532a49f5140 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/frontendOverview/frontendOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/frontendOverview/frontendOverview.ts
@@ -1,8 +1,11 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
DASHBOARD_TITLE,
FRONTEND_SDK_NAMES,
@@ -188,7 +191,7 @@ const TABLE_FIELDS = [
'performance_score(measurements.score.total)',
];
-const TRANSACTIONS_TABLE: Widget = {
+const TRANSACTIONS_TABLE: PrebuiltWidget = {
id: 'frontend-overview-table',
title: t('Transactions'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/http/domainSummary.ts b/static/app/views/dashboards/utils/prebuiltConfigs/http/domainSummary.ts
index bcb9055eb1e55f..b513b02cdcee71 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/http/domainSummary.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/http/domainSummary.ts
@@ -1,8 +1,11 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
PERCENTAGE_3XX,
PERCENTAGE_4XX,
@@ -23,7 +26,7 @@ import {ModuleName, SpanFields} from 'sentry/views/insights/types';
const FILTER_STRING = MutableSearch.fromQueryObject(BASE_FILTERS).formatString();
-const DOMAIN_WIDGET: Widget = {
+const DOMAIN_WIDGET: PrebuiltWidget = {
id: 'domain-widget',
title: t('Domain'),
displayType: DisplayType.DETAILS,
@@ -229,7 +232,7 @@ const CHART_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
2
);
-const TRANSACTIONS_TABLE: Widget = {
+const TRANSACTIONS_TABLE: PrebuiltWidget = {
id: 'transactions-table',
title: t('Transactions Making Requests to This Domain'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/http/http.ts b/static/app/views/dashboards/utils/prebuiltConfigs/http/http.ts
index bf1f86319c37d0..6a1257b73bb426 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/http/http.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/http/http.ts
@@ -2,8 +2,11 @@ import {t} from 'sentry/locale';
import {RATE_UNIT_TITLE, RateUnit} from 'sentry/utils/discover/fields';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import {type PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
PERCENTAGE_3XX,
PERCENTAGE_4XX,
@@ -80,7 +83,7 @@ const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
0
);
-const DOMAIN_TABLE: Widget = {
+const DOMAIN_TABLE: PrebuiltWidget = {
id: 'domain-table',
title: t('Domains'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/laravelOverview/laravelOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/laravelOverview/laravelOverview.ts
index 9d424168b99561..7bd98c8c5afd2a 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/laravelOverview/laravelOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/laravelOverview/laravelOverview.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
BACKEND_OVERVIEW_FIRST_ROW_WIDGETS,
BACKEND_OVERVIEW_SECOND_ROW_WIDGETS,
@@ -13,7 +16,7 @@ import {
} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {SpanFields} from 'sentry/views/insights/types';
-const PATHS_TABLE: Widget = {
+const PATHS_TABLE: PrebuiltWidget = {
id: 'paths-table',
title: t('Paths'),
displayType: DisplayType.TABLE,
@@ -64,7 +67,7 @@ const PATHS_TABLE: Widget = {
},
};
-const COMMANDS_TABLE: Widget = {
+const COMMANDS_TABLE: PrebuiltWidget = {
id: 'commands-table',
title: t('Commands'),
displayType: DisplayType.TABLE,
@@ -110,7 +113,7 @@ const COMMANDS_TABLE: Widget = {
},
};
-const JOBS_TABLE: Widget = {
+const JOBS_TABLE: PrebuiltWidget = {
id: 'jobs-table',
title: t('Jobs'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/mobileSessionHealth.ts b/static/app/views/dashboards/utils/prebuiltConfigs/mobileSessionHealth.ts
index 235432226cc315..0466949140b528 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/mobileSessionHealth.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/mobileSessionHealth.ts
@@ -1,6 +1,9 @@
import {t} from 'sentry/locale';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
@@ -143,7 +146,7 @@ const THIRD_ROW_WIDGETS = spaceWidgetsEquallyOnRow(
4
);
-const CRASH_RATE_TABLE: Widget = {
+const CRASH_RATE_TABLE: PrebuiltWidget = {
id: 'crash-rate-table',
title: t('Crash Free Rate by Project'),
displayType: DisplayType.TABLE,
@@ -163,7 +166,7 @@ const CRASH_RATE_TABLE: Widget = {
layout: {x: 0, y: 6, w: 6, h: 2, minH: 2},
};
-const RELEASE_TABLE: Widget = {
+const RELEASE_TABLE: PrebuiltWidget = {
id: 'release-table',
title: t('Releases'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/appStarts.ts b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/appStarts.ts
index 30887745c40226..45a4701d07ff18 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/appStarts.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/appStarts.ts
@@ -1,7 +1,7 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {Widget} from 'sentry/views/dashboards/types';
+import type {PrebuiltWidget} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
COLD_START_CONDITION,
@@ -14,7 +14,7 @@ import {APP_STARTS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuilt
import {WIDGET_COLUMN_LABELS} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-const AVG_COLD_STARTS_BIG_NUMBER_WIDGET: Widget = {
+const AVG_COLD_STARTS_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-cold-starts-big-number',
title: t('Average Cold Start'),
description: '',
@@ -41,7 +41,7 @@ const AVG_COLD_STARTS_BIG_NUMBER_WIDGET: Widget = {
},
};
-const TOTAL_COLD_START_COUNT_BIG_NUMBER_WIDGET: Widget = {
+const TOTAL_COLD_START_COUNT_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'total-cold-start-count-big-number',
title: t('Cold Start Count'),
description: '',
@@ -68,7 +68,7 @@ const TOTAL_COLD_START_COUNT_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_WARM_STARTS_BIG_NUMBER_WIDGET: Widget = {
+const AVG_WARM_STARTS_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-warm-starts-big-number',
title: t('Average Warm Start'),
description: '',
@@ -95,7 +95,7 @@ const AVG_WARM_STARTS_BIG_NUMBER_WIDGET: Widget = {
},
};
-const TOTAL_WARM_START_COUNT_BIG_NUMBER_WIDGET: Widget = {
+const TOTAL_WARM_START_COUNT_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'total-warm-start-count-big-number',
title: t('Warm Start Count'),
description: '',
@@ -122,7 +122,7 @@ const TOTAL_WARM_START_COUNT_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_COLD_START_LINE_WIDGET: Widget = {
+const AVG_COLD_START_LINE_WIDGET: PrebuiltWidget = {
id: 'avg-cold-start-line',
title: t('Average Cold Start'),
description: '',
@@ -150,7 +150,7 @@ const AVG_COLD_START_LINE_WIDGET: Widget = {
},
};
-const AVG_WARM_START_LINE_WIDGET: Widget = {
+const AVG_WARM_START_LINE_WIDGET: PrebuiltWidget = {
id: 'avg-warm-start-line',
title: t('Average Warm Start'),
description: '',
@@ -178,7 +178,7 @@ const AVG_WARM_START_LINE_WIDGET: Widget = {
},
};
-const COLD_START_DEVICE_DISTRIBUTION_WIDGET: Widget = {
+const COLD_START_DEVICE_DISTRIBUTION_WIDGET: PrebuiltWidget = {
id: 'cold-start-device-distribution-bar',
title: t('Cold Start Device Distribution'),
description: '',
@@ -205,7 +205,7 @@ const COLD_START_DEVICE_DISTRIBUTION_WIDGET: Widget = {
},
};
-const WARM_START_DEVICE_DISTRIBUTION_WIDGET: Widget = {
+const WARM_START_DEVICE_DISTRIBUTION_WIDGET: PrebuiltWidget = {
id: 'warm-start-device-distribution-bar',
title: t('Warm Start Device Distribution'),
description: '',
@@ -232,7 +232,7 @@ const WARM_START_DEVICE_DISTRIBUTION_WIDGET: Widget = {
},
};
-const COLD_OPERATIONS_TABLE: Widget = {
+const COLD_OPERATIONS_TABLE: PrebuiltWidget = {
id: 'cold-operations-table',
title: t('Cold Start Operations'),
description: '',
@@ -270,7 +270,7 @@ const COLD_OPERATIONS_TABLE: Widget = {
},
};
-const WARM_OPERATIONS_TABLE: Widget = {
+const WARM_OPERATIONS_TABLE: PrebuiltWidget = {
id: 'warm-operations-table',
title: t('Warm Start Operations'),
description: '',
@@ -308,19 +308,19 @@ const WARM_OPERATIONS_TABLE: Widget = {
},
};
-const HEADER_ROW_WIDGETS: Widget[] = [
+const HEADER_ROW_WIDGETS: PrebuiltWidget[] = [
AVG_COLD_STARTS_BIG_NUMBER_WIDGET,
AVG_WARM_STARTS_BIG_NUMBER_WIDGET,
TOTAL_COLD_START_COUNT_BIG_NUMBER_WIDGET,
TOTAL_WARM_START_COUNT_BIG_NUMBER_WIDGET,
];
-const FIRST_ROW_WIDGETS: Widget[] = [
+const FIRST_ROW_WIDGETS: PrebuiltWidget[] = [
AVG_COLD_START_LINE_WIDGET,
AVG_WARM_START_LINE_WIDGET,
];
-const SECOND_ROW_WIDGETS: Widget[] = [
+const SECOND_ROW_WIDGETS: PrebuiltWidget[] = [
COLD_START_DEVICE_DISTRIBUTION_WIDGET,
WARM_START_DEVICE_DISTRIBUTION_WIDGET,
];
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/mobileVitals.ts b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/mobileVitals.ts
index 6240ac7d66bc0b..e81cbd9da5aedc 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/mobileVitals.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/mobileVitals.ts
@@ -1,7 +1,7 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {Widget} from 'sentry/views/dashboards/types';
+import type {PrebuiltWidget} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
APP_START_TABLE_CONDITION,
@@ -18,7 +18,7 @@ import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/mob
import {TABLE_MIN_HEIGHT} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-const COLD_START_BIG_NUMBER_WIDGET: Widget = {
+const COLD_START_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'cold-start-big-number',
title: t('Average Cold App Start'),
description: 'Average cold app start duration',
@@ -51,7 +51,7 @@ const COLD_START_BIG_NUMBER_WIDGET: Widget = {
},
};
-const WARM_START_BIG_NUMBER_WIDGET: Widget = {
+const WARM_START_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'warm-start-big-number',
title: t('Average Warm App Start'),
description: 'Average warm app start duration',
@@ -84,7 +84,7 @@ const WARM_START_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_TTID_BIG_NUMBER_WIDGET: Widget = {
+const AVG_TTID_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-ttid-big-number',
title: t('Average TTID'),
description: 'Average time to initial display',
@@ -111,7 +111,7 @@ const AVG_TTID_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_TTFD_BIG_NUMBER_WIDGET: Widget = {
+const AVG_TTFD_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-ttfd-big-number',
title: t('Average TTFD'),
description: 'Average time to full display',
@@ -140,7 +140,7 @@ const AVG_TTFD_BIG_NUMBER_WIDGET: Widget = {
// Uses the Sessions (Release) dataset, so most dashboard global filters (which target Spans)
// don't apply. Still valuable as a top-level health signal alongside the span-based vitals.
-const CRASH_FREE_SESSION_RATE_BIG_NUMBER_WIDGET: Widget = {
+const CRASH_FREE_SESSION_RATE_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'crash-free-session-rate-big-number',
title: t('Crash Free Session Rate'),
description:
@@ -168,7 +168,7 @@ const CRASH_FREE_SESSION_RATE_BIG_NUMBER_WIDGET: Widget = {
},
};
-const SLOW_FRAME_RATE_WIDGET: Widget = {
+const SLOW_FRAME_RATE_WIDGET: PrebuiltWidget = {
id: 'slow-frame-rate-big-number',
title: t('Slow Frame Rate'),
description:
@@ -205,7 +205,7 @@ const SLOW_FRAME_RATE_WIDGET: Widget = {
},
};
-const FROZEN_FRAME_RATE_WIDGET: Widget = {
+const FROZEN_FRAME_RATE_WIDGET: PrebuiltWidget = {
id: 'frozen-frame-rate-big-number',
title: t('Frozen Frame Rate'),
description:
@@ -242,7 +242,7 @@ const FROZEN_FRAME_RATE_WIDGET: Widget = {
},
};
-const AVG_FRAME_DELAY_WIDGET: Widget = {
+const AVG_FRAME_DELAY_WIDGET: PrebuiltWidget = {
id: 'avg-frame-delay-big-number',
title: t('Average Frame Delay'),
description: 'Average frame delay',
@@ -269,7 +269,7 @@ const AVG_FRAME_DELAY_WIDGET: Widget = {
},
};
-const APP_START_TABLE: Widget = {
+const APP_START_TABLE: PrebuiltWidget = {
id: 'app-start-table',
title: t('App Starts'),
description: t(
@@ -320,7 +320,7 @@ const APP_START_TABLE: Widget = {
},
};
-const SCREEN_RENDERING_TABLE: Widget = {
+const SCREEN_RENDERING_TABLE: PrebuiltWidget = {
id: 'screen-rendering-table',
title: t('Screen Rendering'),
description:
@@ -370,7 +370,7 @@ const SCREEN_RENDERING_TABLE: Widget = {
},
};
-const SCREEN_LOAD_TABLE: Widget = {
+const SCREEN_LOAD_TABLE: PrebuiltWidget = {
id: 'screen-load-table',
title: t('Screen Loads'),
description: '',
@@ -414,14 +414,14 @@ const SCREEN_LOAD_TABLE: Widget = {
},
};
-const FIRST_ROW_WIDGETS: Widget[] = [
+const FIRST_ROW_WIDGETS: PrebuiltWidget[] = [
COLD_START_BIG_NUMBER_WIDGET,
WARM_START_BIG_NUMBER_WIDGET,
AVG_TTID_BIG_NUMBER_WIDGET,
AVG_TTFD_BIG_NUMBER_WIDGET,
];
-const SECOND_ROW_WIDGETS: Widget[] = [
+const SECOND_ROW_WIDGETS: PrebuiltWidget[] = [
SLOW_FRAME_RATE_WIDGET,
FROZEN_FRAME_RATE_WIDGET,
AVG_FRAME_DELAY_WIDGET,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenLoads.ts b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenLoads.ts
index 73eb34a2f75425..b084e6721380bf 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenLoads.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenLoads.ts
@@ -1,7 +1,7 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {Widget} from 'sentry/views/dashboards/types';
+import type {PrebuiltWidget} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {
SCREEN_LOAD_CONDITION,
@@ -13,7 +13,7 @@ import {
import {SCREEN_LOADS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/mobileVitals/settings';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-const AVG_TTID_BIG_NUMBER_WIDGET: Widget = {
+const AVG_TTID_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-ttid-big-number',
title: t('Average TTID'),
description: '',
@@ -40,7 +40,7 @@ const AVG_TTID_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_TTFD_BIG_NUMBER_WIDGET: Widget = {
+const AVG_TTFD_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'avg-ttfd-big-number',
title: t('Average TTFD'),
description: '',
@@ -67,7 +67,7 @@ const AVG_TTFD_BIG_NUMBER_WIDGET: Widget = {
},
};
-const TOTAL_COUNT_BIG_NUMBER_WIDGET: Widget = {
+const TOTAL_COUNT_BIG_NUMBER_WIDGET: PrebuiltWidget = {
id: 'total-count-big-number',
title: t('Total Count'),
description: '',
@@ -94,7 +94,7 @@ const TOTAL_COUNT_BIG_NUMBER_WIDGET: Widget = {
},
};
-const AVG_TTID_LINE_WIDGET: Widget = {
+const AVG_TTID_LINE_WIDGET: PrebuiltWidget = {
id: 'average-ttid-line',
title: t('Average TTID'),
description: '',
@@ -122,7 +122,7 @@ const AVG_TTID_LINE_WIDGET: Widget = {
},
};
-const AVG_TTFD_LINE_WIDGET: Widget = {
+const AVG_TTFD_LINE_WIDGET: PrebuiltWidget = {
id: 'average-ttfd-line',
title: t('Average TTFD'),
description: '',
@@ -150,7 +150,7 @@ const AVG_TTFD_LINE_WIDGET: Widget = {
},
};
-const TOTAL_COUNT_LINE_WIDGET: Widget = {
+const TOTAL_COUNT_LINE_WIDGET: PrebuiltWidget = {
id: 'total-count-line',
title: t('Total Count'),
description: '',
@@ -178,7 +178,7 @@ const TOTAL_COUNT_LINE_WIDGET: Widget = {
},
};
-const TTID_BAR_CHART_WIDGET: Widget = {
+const TTID_BAR_CHART_WIDGET: PrebuiltWidget = {
id: 'ttid-device-class-bar',
title: t('TTID by Device Class'),
description: '',
@@ -206,7 +206,7 @@ const TTID_BAR_CHART_WIDGET: Widget = {
},
};
-const TTFD_BAR_CHART_WIDGET: Widget = {
+const TTFD_BAR_CHART_WIDGET: PrebuiltWidget = {
id: 'ttfd-device-class-bar',
title: t('TTFD by Device Class'),
description: '',
@@ -234,7 +234,7 @@ const TTFD_BAR_CHART_WIDGET: Widget = {
},
};
-const SPAN_OPERATIONS_TABLE: Widget = {
+const SPAN_OPERATIONS_TABLE: PrebuiltWidget = {
id: 'span-operations-table',
title: t('Span Operations'),
description: '',
@@ -283,19 +283,22 @@ const SPAN_OPERATIONS_TABLE: Widget = {
},
};
-const HEADER_ROW_WIDGETS: Widget[] = [
+const HEADER_ROW_WIDGETS: PrebuiltWidget[] = [
AVG_TTID_BIG_NUMBER_WIDGET,
AVG_TTFD_BIG_NUMBER_WIDGET,
TOTAL_COUNT_BIG_NUMBER_WIDGET,
];
-const SECOND_ROW_WIDGETS: Widget[] = [
+const SECOND_ROW_WIDGETS: PrebuiltWidget[] = [
AVG_TTID_LINE_WIDGET,
AVG_TTFD_LINE_WIDGET,
TOTAL_COUNT_LINE_WIDGET,
];
-const THIRD_ROW_WIDGETS: Widget[] = [TTID_BAR_CHART_WIDGET, TTFD_BAR_CHART_WIDGET];
+const THIRD_ROW_WIDGETS: PrebuiltWidget[] = [
+ TTID_BAR_CHART_WIDGET,
+ TTFD_BAR_CHART_WIDGET,
+];
export const MOBILE_VITALS_SCREEN_LOADS_PREBUILT_CONFIG: PrebuiltDashboard = {
dateCreated: '',
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenRendering.ts b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenRendering.ts
index b06c0013606766..1b84de1da4b2a3 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenRendering.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/mobileVitals/screenRendering.ts
@@ -1,13 +1,13 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
-import type {Widget} from 'sentry/views/dashboards/types';
+import type {PrebuiltWidget} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {SCREEN_RENDERING_SPAN_OPERATIONS_CONDITION} from 'sentry/views/dashboards/utils/prebuiltConfigs/mobileVitals/constants';
import {SCREEN_RENDERING_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/mobileVitals/settings';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-const SPAN_OPERATIONS_TABLE: Widget = {
+const SPAN_OPERATIONS_TABLE: PrebuiltWidget = {
id: 'span-operations-table',
title: t('Span Operations'),
description: '',
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/nextJsOverview/nextJsOverview.ts b/static/app/views/dashboards/utils/prebuiltConfigs/nextJsOverview/nextJsOverview.ts
index f6d18ff0c89ba5..f033717223763c 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/nextJsOverview/nextJsOverview.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/nextJsOverview/nextJsOverview.ts
@@ -1,8 +1,11 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/nextJsOverview/settings';
import {
WIDGET_COLUMN_LABELS,
@@ -141,7 +144,7 @@ const CLIENT_TRANSACTIONS_TABLE_FIELDS = [
`performance_score(${SpanFields.TOTAL_SCORE})`,
];
-const CLIENT_TRANSACTIONS_TABLE: Widget = {
+const CLIENT_TRANSACTIONS_TABLE: PrebuiltWidget = {
id: 'client-transactions-table',
title: t('Client Transactions'),
displayType: DisplayType.TABLE,
@@ -193,7 +196,7 @@ const SERVER_TRANSACTIONS_TABLE_FIELDS = [
`sum(${SpanFields.SPAN_DURATION})`,
];
-const SERVER_TRANSACTIONS_TABLE: Widget = {
+const SERVER_TRANSACTIONS_TABLE: PrebuiltWidget = {
id: 'server-transactions-table',
title: t('Server Transactions'),
displayType: DisplayType.TABLE,
@@ -234,7 +237,7 @@ const SERVER_TRANSACTIONS_TABLE: Widget = {
},
};
-const SERVER_TREE_WIDGET: Widget = {
+const SERVER_TREE_WIDGET: PrebuiltWidget = {
...SERVER_TREE_WIDGET_TEMPLATE,
layout: {
x: 0,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/nodeRuntimeMetrics/nodeRuntimeMetrics.ts b/static/app/views/dashboards/utils/prebuiltConfigs/nodeRuntimeMetrics/nodeRuntimeMetrics.ts
index b8e8d18bd842c7..e66218a5f45a4a 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/nodeRuntimeMetrics/nodeRuntimeMetrics.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/nodeRuntimeMetrics/nodeRuntimeMetrics.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {DurationUnit, SizeUnit} from 'sentry/utils/discover/fields';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/nodeRuntimeMetrics/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
import {traceMetricField} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/traceMetricField';
@@ -198,7 +201,11 @@ const CORRELATION_WIDGETS = spaceWidgetsEquallyOnRow(
3
);
-const WIDGETS: Widget[] = [...KPI_WIDGETS, ...MEMORY_WIDGETS, ...CORRELATION_WIDGETS];
+const WIDGETS: PrebuiltWidget[] = [
+ ...KPI_WIDGETS,
+ ...MEMORY_WIDGETS,
+ ...CORRELATION_WIDGETS,
+];
export const NODE_RUNTIME_METRICS_PREBUILT_CONFIG: PrebuiltDashboard = {
dateCreated: '',
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueCharts.ts b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueCharts.ts
index 68df7e0f56fe4c..7651de8fd85681 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueCharts.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueCharts.ts
@@ -1,8 +1,9 @@
import {t} from 'sentry/locale';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {PrebuiltWidget} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {SpanFields} from 'sentry/views/insights/types';
-export const QUEUE_CHARTS: Widget[] = [
+export const QUEUE_CHARTS: PrebuiltWidget[] = [
{
id: 'average-duration-widget',
title: t('Average Duration'),
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueDetails.ts b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueDetails.ts
index 4a64a03f9b3a69..8215cd052adca9 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueDetails.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queueDetails.ts
@@ -1,6 +1,9 @@
import {t} from 'sentry/locale';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {QUEUE_CHARTS} from 'sentry/views/dashboards/utils/prebuiltConfigs/queues/queueCharts';
import {DETAILS_DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/queues/settings';
import {spaceWidgetsEquallyOnRow} from 'sentry/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow';
@@ -127,7 +130,7 @@ const FIRST_ROW_WIDGTS = spaceWidgetsEquallyOnRow(
const SECOND_ROW_WIDGETS = spaceWidgetsEquallyOnRow([...QUEUE_CHARTS], 1);
-const PRODUCER_TABLE: Widget = {
+const PRODUCER_TABLE: PrebuiltWidget = {
id: 'producer-table',
title: t('Producer Transactions'),
displayType: DisplayType.TABLE,
@@ -162,7 +165,7 @@ const PRODUCER_TABLE: Widget = {
},
};
-const CONSUMER_TABLE: Widget = {
+const CONSUMER_TABLE: PrebuiltWidget = {
id: 'consumer-table',
title: t('Consumer Transactions'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queues.ts b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queues.ts
index 777937b8b714c7..8bed62d629238a 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/queues/queues.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/queues/queues.ts
@@ -1,7 +1,10 @@
import {t} from 'sentry/locale';
import {FieldKind} from 'sentry/utils/fields';
-import {DisplayType, WidgetType, type Widget} from 'sentry/views/dashboards/types';
-import type {PrebuiltDashboard} from 'sentry/views/dashboards/utils/prebuiltConfigs';
+import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltDashboard,
+ PrebuiltWidget,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
import {QUEUE_CHARTS} from 'sentry/views/dashboards/utils/prebuiltConfigs/queues/queueCharts';
import {DASHBOARD_TITLE} from 'sentry/views/dashboards/utils/prebuiltConfigs/queues/settings';
import {TABLE_MIN_HEIGHT} from 'sentry/views/dashboards/utils/prebuiltConfigs/settings';
@@ -10,7 +13,7 @@ import {ModuleName, SpanFields} from 'sentry/views/insights/types';
const FIRST_ROW_WIDGETS = spaceWidgetsEquallyOnRow([...QUEUE_CHARTS], 0);
-const DESTINATION_TABLE: Widget = {
+const DESTINATION_TABLE: PrebuiltWidget = {
id: 'destination-table',
title: t('Destinations'),
displayType: DisplayType.TABLE,
diff --git a/static/app/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow.ts b/static/app/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow.ts
index 84e32ae3f2c82c..3c67328bd4efcd 100644
--- a/static/app/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow.ts
+++ b/static/app/views/dashboards/utils/prebuiltConfigs/utils/spaceWidgetsEquallyOnRow.ts
@@ -1,11 +1,15 @@
import {NUM_DESKTOP_COLS} from 'sentry/views/dashboards/constants';
import type {Widget, WidgetLayout} from 'sentry/views/dashboards/types';
+import type {
+ PrebuiltWidget,
+ PrebuiltWidgetLayout,
+} from 'sentry/views/dashboards/utils/prebuiltConfigs';
export function spaceWidgetsEquallyOnRow(
widgets: Widget[],
y: number,
height: Pick = {h: 2, minH: 2}
-): Widget[] {
+): PrebuiltWidget[] {
if (widgets.length > NUM_DESKTOP_COLS) {
throw new Error(
`Expected no more than ${NUM_DESKTOP_COLS} widgets, got ${widgets.length}`
@@ -18,12 +22,14 @@ export function spaceWidgetsEquallyOnRow(
const widgetWidth = Math.floor(NUM_DESKTOP_COLS / widgets.length);
+ // Casts are safe: the early-return above caps widgets.length at
+ // NUM_DESKTOP_COLS, so widgetWidth in [1,6] and idx*widgetWidth in [0,5].
return widgets.map((widget, idx) => ({
...widget,
layout: {
- x: idx * widgetWidth,
+ x: (idx * widgetWidth) as PrebuiltWidgetLayout['x'],
y,
- w: widgetWidth,
+ w: widgetWidth as PrebuiltWidgetLayout['w'],
...height,
},
}));
diff --git a/static/app/views/discover/results/issueListSeerComboBox.tsx b/static/app/views/discover/results/issueListSeerComboBox.tsx
index e7ab8a7009d64d..62f3a3515030d3 100644
--- a/static/app/views/discover/results/issueListSeerComboBox.tsx
+++ b/static/app/views/discover/results/issueListSeerComboBox.tsx
@@ -6,7 +6,11 @@ import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {useAiQueryContext} from 'sentry/components/searchQueryBuilder/askSeerCombobox/aiQueryContext';
import {AskSeerPollingComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox';
import type {AskSeerSearchQuery} from 'sentry/components/searchQueryBuilder/askSeerCombobox/types';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {Token} from 'sentry/components/searchSyntax/parser';
import {stringifyToken} from 'sentry/components/searchSyntax/utils';
import {ConfigStore} from 'sentry/stores/configStore';
@@ -46,14 +50,9 @@ export function IssueListSeerComboBox({onSearch}: IssueListSeerComboBoxProps) {
const organization = useOrganization();
const analyticsArea = useAnalyticsArea();
const {setRunId} = useAiQueryContext();
- const {
- currentInputValueRef,
- query,
- committedQuery,
- askSeerSuggestedQueryRef,
- enableAISearch,
- parseQuery,
- } = useSearchQueryBuilder();
+ const {query, committedQuery, parseQuery} = useSearchQueryBuilderState();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
+ const {askSeerSuggestedQueryRef, enableAISearch} = useSearchQueryBuilderAI();
let initialSeerQuery = '';
const queryDetails = useMemo(() => {
diff --git a/static/app/views/discover/results/resultsSearchQueryBuilder.tsx b/static/app/views/discover/results/resultsSearchQueryBuilder.tsx
index c13dc5390a6b7f..689ff76368b8bf 100644
--- a/static/app/views/discover/results/resultsSearchQueryBuilder.tsx
+++ b/static/app/views/discover/results/resultsSearchQueryBuilder.tsx
@@ -20,7 +20,7 @@ import {
} from 'sentry/components/searchQueryBuilder';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
} from 'sentry/components/searchQueryBuilder/context';
import type {
CallbackSearchState,
@@ -109,7 +109,7 @@ function ErrorsSearchBar({
recentSearches,
searchSource,
}: ErrorsSearchBarProps) {
- const {displayAskSeer} = useSearchQueryBuilder();
+ const {displayAskSeer} = useSearchQueryBuilderAI();
if (displayAskSeer && onSearch) {
return ;
diff --git a/static/app/views/explore/components/schemaHints/schemaHintsList.spec.tsx b/static/app/views/explore/components/schemaHints/schemaHintsList.spec.tsx
index 19d616f352c55a..d6a494cbe70294 100644
--- a/static/app/views/explore/components/schemaHints/schemaHintsList.spec.tsx
+++ b/static/app/views/explore/components/schemaHints/schemaHintsList.spec.tsx
@@ -27,12 +27,13 @@ const mockBooleanTags: TagCollection = {
const mockDispatch = jest.fn();
-// Add mock for useSearchQueryBuilder
+// Add mock for search query builder contexts
jest.mock('sentry/components/searchQueryBuilder/context', () => ({
- useSearchQueryBuilder: () => ({
+ useSearchQueryBuilderState: () => ({
query: '',
- getTagValues: () => Promise.resolve(['tagValue1', 'tagValue2']),
dispatch: mockDispatch,
+ }),
+ useSearchQueryBuilderLayout: () => ({
wrapperRef: {current: null},
}),
SearchQueryBuilderProvider: ({children}: {children: React.ReactNode}) => children,
@@ -275,16 +276,14 @@ describe('SchemaHintsList', () => {
});
it('should remove hint from query when checkbox is unchecked on drawer', async () => {
- const mockUseSearchQueryBuilder = jest
+ const mockUseSearchQueryBuilderState = jest
.spyOn(
require('sentry/components/searchQueryBuilder/context'),
- 'useSearchQueryBuilder'
+ 'useSearchQueryBuilderState'
)
.mockImplementation(() => ({
query: '!stringTag1:"" numberTag1:>0',
- getTagValues: () => Promise.resolve(['tagValue1', 'tagValue2']),
dispatch: mockDispatch,
- wrapperRef: {current: null},
}));
render(
@@ -313,20 +312,18 @@ describe('SchemaHintsList', () => {
shouldCommitQuery: false,
});
- mockUseSearchQueryBuilder.mockRestore();
+ mockUseSearchQueryBuilderState.mockRestore();
});
it('should remove aggregate hint from query when checkbox is unchecked on drawer', async () => {
- const mockUseSearchQueryBuilder = jest
+ const mockUseSearchQueryBuilderState = jest
.spyOn(
require('sentry/components/searchQueryBuilder/context'),
- 'useSearchQueryBuilder'
+ 'useSearchQueryBuilderState'
)
.mockImplementation(() => ({
query: 'stringTag1:"" numberTag1:>0 count_unique(user):>0',
- getTagValues: () => Promise.resolve(['tagValue1', 'tagValue2']),
dispatch: mockDispatch,
- wrapperRef: {current: null},
}));
render(
@@ -355,7 +352,7 @@ describe('SchemaHintsList', () => {
shouldCommitQuery: false,
});
- mockUseSearchQueryBuilder.mockRestore();
+ mockUseSearchQueryBuilderState.mockRestore();
});
it('should keep drawer open when query is updated', async () => {
@@ -415,16 +412,14 @@ describe('SchemaHintsList', () => {
});
it('should set focus override propely on duplicate filters', async () => {
- const mockUseSearchQueryBuilder = jest
+ const mockUseSearchQueryBuilderState = jest
.spyOn(
require('sentry/components/searchQueryBuilder/context'),
- 'useSearchQueryBuilder'
+ 'useSearchQueryBuilderState'
)
.mockImplementation(() => ({
query: 'stringTag1:"something"',
- getTagValues: () => Promise.resolve(['tagValue1', 'tagValue2']),
dispatch: mockDispatch,
- wrapperRef: {current: null},
}));
render(
@@ -449,7 +444,7 @@ describe('SchemaHintsList', () => {
shouldCommitQuery: false,
});
- mockUseSearchQueryBuilder.mockRestore();
+ mockUseSearchQueryBuilderState.mockRestore();
});
it('should filter schema hints in bar but show all in drawer for logs source', async () => {
diff --git a/static/app/views/explore/components/schemaHints/schemaHintsList.tsx b/static/app/views/explore/components/schemaHints/schemaHintsList.tsx
index 9915146786f005..252f0e2fc9fb67 100644
--- a/static/app/views/explore/components/schemaHints/schemaHintsList.tsx
+++ b/static/app/views/explore/components/schemaHints/schemaHintsList.tsx
@@ -11,7 +11,10 @@ import {Text} from '@sentry/scraps/text';
import {getFunctionTags} from 'sentry/components/performance/spanSearchQueryBuilder';
import {Placeholder} from 'sentry/components/placeholder';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import type {FilterKeySection} from 'sentry/components/searchQueryBuilder/types';
import {t} from 'sentry/locale';
import type {Tag, TagCollection} from 'sentry/types/group';
@@ -171,7 +174,8 @@ export function SchemaHintsList({
const organization = useOrganization();
const {openDrawer, panelRef} = useDrawer();
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
- const {dispatch, query, wrapperRef: searchBarWrapperRef} = useSearchQueryBuilder();
+ const {dispatch, query} = useSearchQueryBuilderState();
+ const {wrapperRef: searchBarWrapperRef} = useSearchQueryBuilderLayout();
// Create a ref to hold the latest query for the drawer
const queryRef = useRef(query);
diff --git a/static/app/views/explore/conversations/layout.spec.tsx b/static/app/views/explore/conversations/layout.spec.tsx
index 4e9e15201f3343..ea8dfb61f728fd 100644
--- a/static/app/views/explore/conversations/layout.spec.tsx
+++ b/static/app/views/explore/conversations/layout.spec.tsx
@@ -45,7 +45,7 @@ describe('ConversationsLayout', () => {
expect(within(topBar).getByText('6c5b72fc')).toBeInTheDocument();
expect(within(topBar).getByRole('link', {name: 'Conversations'})).toHaveAttribute(
'href',
- `/organizations/${organization.slug}/explore/conversations/?environment=prod&project=1&statsPeriod=7d`
+ `/organizations/${organization.slug}/explore/conversations/?environment=prod&project=1&statsPeriod=24h`
);
});
});
diff --git a/static/app/views/explore/conversations/layout.tsx b/static/app/views/explore/conversations/layout.tsx
index 2942daddcdfdaa..c1fe760fafd1a6 100644
--- a/static/app/views/explore/conversations/layout.tsx
+++ b/static/app/views/explore/conversations/layout.tsx
@@ -87,7 +87,10 @@ function ConversationsHeader() {
crumbs={[
{
label: CONVERSATIONS_SIDEBAR_LABEL,
- to: conversationsBaseUrl,
+ to: {
+ pathname: conversationsBaseUrl,
+ query: {statsPeriod: '24h', start: undefined, end: undefined},
+ },
preservePageFilters: true,
},
{
diff --git a/static/app/views/explore/logs/logsTab.tsx b/static/app/views/explore/logs/logsTab.tsx
index 71e5c5b7b16d45..3f6507bba4d216 100644
--- a/static/app/views/explore/logs/logsTab.tsx
+++ b/static/app/views/explore/logs/logsTab.tsx
@@ -16,7 +16,7 @@ import {ProjectPageFilter} from 'sentry/components/pageFilters/project/projectPa
import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
} from 'sentry/components/searchQueryBuilder/context';
import {IconChevron, IconEdit, IconRefresh} from 'sentry/icons';
import {t} from 'sentry/locale';
@@ -110,7 +110,7 @@ interface LogsSearchBarProps {
}
function LogsSearchBar({tracesItemSearchQueryBuilderProps}: LogsSearchBarProps) {
- const {displayAskSeer} = useSearchQueryBuilder();
+ const {displayAskSeer} = useSearchQueryBuilderAI();
if (displayAskSeer) {
return ;
diff --git a/static/app/views/explore/logs/logsTabSeerComboBox.tsx b/static/app/views/explore/logs/logsTabSeerComboBox.tsx
index 012b4e2f4f3039..a1e0772835b929 100644
--- a/static/app/views/explore/logs/logsTabSeerComboBox.tsx
+++ b/static/app/views/explore/logs/logsTabSeerComboBox.tsx
@@ -5,7 +5,11 @@ import {useAnalyticsArea} from 'sentry/components/analyticsArea';
import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {useAiQueryContext} from 'sentry/components/searchQueryBuilder/askSeerCombobox/aiQueryContext';
import {AskSeerPollingComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {parseQueryBuilderValue} from 'sentry/components/searchQueryBuilder/utils';
import {Token} from 'sentry/components/searchSyntax/parser';
import {stringifyToken} from 'sentry/components/searchSyntax/utils';
@@ -58,13 +62,9 @@ export function LogsTabSeerComboBox() {
const queryParams = useQueryParams();
const analyticsArea = useAnalyticsArea();
const {setRunId} = useAiQueryContext();
- const {
- currentInputValueRef,
- query,
- committedQuery,
- askSeerSuggestedQueryRef,
- enableAISearch,
- } = useSearchQueryBuilder();
+ const {query, committedQuery} = useSearchQueryBuilderState();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
+ const {askSeerSuggestedQueryRef, enableAISearch} = useSearchQueryBuilderAI();
let initialSeerQuery = '';
const queryDetails = useMemo(() => {
diff --git a/static/app/views/explore/metrics/metricToolbar/filter.tsx b/static/app/views/explore/metrics/metricToolbar/filter.tsx
index 0b05a579ca6f60..56583d0f19b5bc 100644
--- a/static/app/views/explore/metrics/metricToolbar/filter.tsx
+++ b/static/app/views/explore/metrics/metricToolbar/filter.tsx
@@ -4,7 +4,7 @@ import {useQuery} from '@tanstack/react-query';
import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
} from 'sentry/components/searchQueryBuilder/context';
import type {TagCollection} from 'sentry/types/group';
import {FieldKind} from 'sentry/utils/fields';
@@ -52,7 +52,7 @@ function MetricsSearchBar({
tracesItemSearchQueryBuilderProps,
traceMetric,
}: MetricsSearchBarProps) {
- const {displayAskSeer} = useSearchQueryBuilder();
+ const {displayAskSeer} = useSearchQueryBuilderAI();
if (displayAskSeer) {
return ;
diff --git a/static/app/views/explore/metrics/metricsTabSeerComboBox.tsx b/static/app/views/explore/metrics/metricsTabSeerComboBox.tsx
index 1c9132810284c6..71d2fe1c51a385 100644
--- a/static/app/views/explore/metrics/metricsTabSeerComboBox.tsx
+++ b/static/app/views/explore/metrics/metricsTabSeerComboBox.tsx
@@ -6,7 +6,11 @@ import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {useAiQueryContext} from 'sentry/components/searchQueryBuilder/askSeerCombobox/aiQueryContext';
import {AskSeerComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox';
import {AskSeerPollingComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {parseQueryBuilderValue} from 'sentry/components/searchQueryBuilder/utils';
import {Token} from 'sentry/components/searchSyntax/parser';
import {stringifyToken} from 'sentry/components/searchSyntax/utils';
@@ -81,13 +85,9 @@ export function MetricsTabSeerComboBox({traceMetric}: MetricsTabSeerComboBoxProp
const queryParams = useQueryParams();
const metricQueries = useMultiMetricsQueryParams();
const analyticsArea = useAnalyticsArea();
- const {
- currentInputValueRef,
- query,
- committedQuery,
- askSeerSuggestedQueryRef,
- enableAISearch,
- } = useSearchQueryBuilder();
+ const {query, committedQuery} = useSearchQueryBuilderState();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
+ const {askSeerSuggestedQueryRef, enableAISearch} = useSearchQueryBuilderAI();
let initialSeerQuery = '';
const queryDetails = useMemo(() => {
diff --git a/static/app/views/explore/releases/drawer/releasesDrawerList.tsx b/static/app/views/explore/releases/drawer/releasesDrawerList.tsx
index 6f9a945a469c26..26d4d932421669 100644
--- a/static/app/views/explore/releases/drawer/releasesDrawerList.tsx
+++ b/static/app/views/explore/releases/drawer/releasesDrawerList.tsx
@@ -30,7 +30,7 @@ import {useReleaseStats} from 'sentry/utils/useReleaseStats';
import {formatVersion} from 'sentry/utils/versions/formatVersion';
import {ReleasesDrawerFeatureFlagsTable} from 'sentry/views/explore/releases/drawer/releasesDrawerFeatureFlagsTable';
import {ReleasesDrawerFields} from 'sentry/views/explore/releases/drawer/utils';
-import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/streamline/eventGraphWidget';
+import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/eventGraphWidget';
import {ReleasesDrawerTable} from './releasesDrawerTable';
diff --git a/static/app/views/explore/spans/spansTabSearchSection.tsx b/static/app/views/explore/spans/spansTabSearchSection.tsx
index 480c47c2bc684f..871e8ea92e4ff8 100644
--- a/static/app/views/explore/spans/spansTabSearchSection.tsx
+++ b/static/app/views/explore/spans/spansTabSearchSection.tsx
@@ -13,7 +13,7 @@ import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {useSpanSearchQueryBuilderProps} from 'sentry/components/performance/spanSearchQueryBuilder';
import {
SearchQueryBuilderProvider,
- useSearchQueryBuilder,
+ useSearchQueryBuilderAI,
} from 'sentry/components/searchQueryBuilder/context';
import {useCaseInsensitivity} from 'sentry/components/searchQueryBuilder/hooks';
import {TourElement} from 'sentry/components/tours/components';
@@ -54,7 +54,7 @@ function SpansSearchBar({
}: {
spanSearchQueryBuilderProps: TraceItemSearchQueryBuilderProps;
}) {
- const {displayAskSeer} = useSearchQueryBuilder();
+ const {displayAskSeer} = useSearchQueryBuilderAI();
if (displayAskSeer) {
return ;
diff --git a/static/app/views/explore/spans/spansTabSeerComboBox.tsx b/static/app/views/explore/spans/spansTabSeerComboBox.tsx
index 4689a37557c9bb..73ae680e35eab9 100644
--- a/static/app/views/explore/spans/spansTabSeerComboBox.tsx
+++ b/static/app/views/explore/spans/spansTabSeerComboBox.tsx
@@ -6,7 +6,11 @@ import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
import {useAiQueryContext} from 'sentry/components/searchQueryBuilder/askSeerCombobox/aiQueryContext';
import {AskSeerComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerComboBox';
import {AskSeerPollingComboBox} from 'sentry/components/searchQueryBuilder/askSeerCombobox/askSeerPollingComboBox';
-import {useSearchQueryBuilder} from 'sentry/components/searchQueryBuilder/context';
+import {
+ useSearchQueryBuilderAI,
+ useSearchQueryBuilderLayout,
+ useSearchQueryBuilderState,
+} from 'sentry/components/searchQueryBuilder/context';
import {parseQueryBuilderValue} from 'sentry/components/searchQueryBuilder/utils';
import {Token} from 'sentry/components/searchSyntax/parser';
import {stringifyToken} from 'sentry/components/searchSyntax/utils';
@@ -78,13 +82,9 @@ export function SpansTabSeerComboBox() {
const organization = useOrganization();
const analyticsArea = useAnalyticsArea();
const {setRunId} = useAiQueryContext();
- const {
- currentInputValueRef,
- query,
- committedQuery,
- askSeerSuggestedQueryRef,
- enableAISearch,
- } = useSearchQueryBuilder();
+ const {query, committedQuery} = useSearchQueryBuilderState();
+ const {currentInputValueRef} = useSearchQueryBuilderLayout();
+ const {askSeerSuggestedQueryRef, enableAISearch} = useSearchQueryBuilderAI();
const useTranslateEndpoint = organization.features.includes(
'gen-ai-search-agent-translate'
diff --git a/static/app/views/feedback/feedbackListPage.tsx b/static/app/views/feedback/feedbackListPage.tsx
index 29e715f9ece3e2..49208026cf9a9a 100644
--- a/static/app/views/feedback/feedbackListPage.tsx
+++ b/static/app/views/feedback/feedbackListPage.tsx
@@ -314,11 +314,7 @@ const LayoutGrid = styled('div')<{hideTop?: boolean}>`
gap: ${p => p.theme.space.xl};
place-items: stretch;
- padding: ${p => p.theme.space.xl};
-
- @media (min-width: ${p => p.theme.breakpoints.lg}) {
- padding: ${p => p.theme.space.xl} ${p => p.theme.space['3xl']};
- }
+ padding: ${p => p.theme.space.lg} ${p => p.theme.space.xl};
grid-template-rows: max-content minmax(0, 1fr);
grid-template-areas:
diff --git a/static/app/views/issueDetails/actions/index.tsx b/static/app/views/issueDetails/actions/index.tsx
index 8d456258f57d8b..526e78178af5bc 100644
--- a/static/app/views/issueDetails/actions/index.tsx
+++ b/static/app/views/issueDetails/actions/index.tsx
@@ -62,7 +62,7 @@ import {ShareIssueModal} from 'sentry/views/issueDetails/actions/shareModal';
import {SubscribeAction} from 'sentry/views/issueDetails/actions/subscribeAction';
import {Divider} from 'sentry/views/issueDetails/divider';
import {GroupPriorityCommandPaletteAction} from 'sentry/views/issueDetails/groupPriority';
-import {GroupHeaderAssigneeCommandPaletteAction} from 'sentry/views/issueDetails/streamline/header/assigneeSelector';
+import {GroupHeaderAssigneeCommandPaletteAction} from 'sentry/views/issueDetails/header/assigneeSelector';
import {groupApiOptions} from 'sentry/views/issueDetails/useGroup';
import {useProjectReleaseVersionIsSemver} from 'sentry/views/issueDetails/useProjectReleaseVersionIsSemver';
import {useEnvironmentsFromUrl} from 'sentry/views/issueDetails/utils';
diff --git a/static/app/views/issueDetails/actions/seerCommandPaletteActions.tsx b/static/app/views/issueDetails/actions/seerCommandPaletteActions.tsx
index 042fc46e6973f0..596398f8559808 100644
--- a/static/app/views/issueDetails/actions/seerCommandPaletteActions.tsx
+++ b/static/app/views/issueDetails/actions/seerCommandPaletteActions.tsx
@@ -23,8 +23,8 @@ import type {Project} from 'sentry/types/project';
import {defined} from 'sentry/utils';
import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {useAiConfig} from 'sentry/views/issueDetails/streamline/hooks/useAiConfig';
-import {useOpenSeerDrawer} from 'sentry/views/issueDetails/streamline/sidebar/seerDrawer';
+import {useAiConfig} from 'sentry/views/issueDetails/hooks/useAiConfig';
+import {useOpenSeerDrawer} from 'sentry/views/issueDetails/sidebar/seerDrawer';
function useSeerState(group: Group, project: Project) {
const organization = useOrganization();
diff --git a/static/app/views/issueDetails/actions/shareModal.tsx b/static/app/views/issueDetails/actions/shareModal.tsx
index 9e8ea5e19eed16..bce3bf102c1741 100644
--- a/static/app/views/issueDetails/actions/shareModal.tsx
+++ b/static/app/views/issueDetails/actions/shareModal.tsx
@@ -23,7 +23,7 @@ import {normalizeUrl} from 'sentry/utils/url/normalizeUrl';
import {useApi} from 'sentry/utils/useApi';
import {useCopyToClipboard} from 'sentry/utils/useCopyToClipboard';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
interface ShareIssueModalProps extends ModalRenderProps {
event: Event | null;
diff --git a/static/app/views/issueDetails/activitySection/index.tsx b/static/app/views/issueDetails/activitySection/index.tsx
index a2a4bb301f1afd..4111701496e137 100644
--- a/static/app/views/issueDetails/activitySection/index.tsx
+++ b/static/app/views/issueDetails/activitySection/index.tsx
@@ -31,9 +31,9 @@ import {useUser} from 'sentry/utils/useUser';
import {CommentActionsDropdown} from 'sentry/views/issueDetails/activitySection/commentActionsDropdown';
import {groupActivityTypeIconMapping} from 'sentry/views/issueDetails/activitySection/groupActivityIcons';
import {getGroupActivityItem} from 'sentry/views/issueDetails/activitySection/groupActivityItem';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {SidebarFoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
-import {SidebarSectionTitle} from 'sentry/views/issueDetails/streamline/sidebar/sidebar';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {SidebarFoldSection} from 'sentry/views/issueDetails/foldSection';
+import {SidebarSectionTitle} from 'sentry/views/issueDetails/sidebar/sidebar';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
diff --git a/static/app/views/issueDetails/configurationIssues/lowValueSpanIssues/lowValueSpanIssueDetails.tsx b/static/app/views/issueDetails/configurationIssues/lowValueSpanIssues/lowValueSpanIssueDetails.tsx
index 5ec8a4fd0b37a9..9822f9c6f6acc9 100644
--- a/static/app/views/issueDetails/configurationIssues/lowValueSpanIssues/lowValueSpanIssueDetails.tsx
+++ b/static/app/views/issueDetails/configurationIssues/lowValueSpanIssues/lowValueSpanIssueDetails.tsx
@@ -1,7 +1,7 @@
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
import {ProblemSection} from './problemSection';
import {TroubleshootingSection} from './troubleshootingSection';
diff --git a/static/app/views/issueDetails/configurationIssues/sourceMapIssues/impactSection.tsx b/static/app/views/issueDetails/configurationIssues/sourceMapIssues/impactSection.tsx
index d55f39e68a3cff..30ed78cc6b6eb2 100644
--- a/static/app/views/issueDetails/configurationIssues/sourceMapIssues/impactSection.tsx
+++ b/static/app/views/issueDetails/configurationIssues/sourceMapIssues/impactSection.tsx
@@ -12,7 +12,7 @@ import {t, tn} from 'sentry/locale';
import type {Project} from 'sentry/types/project';
import {normalizeUrl} from 'sentry/utils/url/normalizeUrl';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
import {useAffectedReleases} from './queries/useAffectedReleases';
import {useImpactedEventsCount} from './queries/useImpactedEventsCount';
diff --git a/static/app/views/issueDetails/configurationIssues/sourceMapIssues/sourceMapIssueDetails.tsx b/static/app/views/issueDetails/configurationIssues/sourceMapIssues/sourceMapIssueDetails.tsx
index ab3bdbb44ccfac..1b764e5b83ad0d 100644
--- a/static/app/views/issueDetails/configurationIssues/sourceMapIssues/sourceMapIssueDetails.tsx
+++ b/static/app/views/issueDetails/configurationIssues/sourceMapIssues/sourceMapIssueDetails.tsx
@@ -6,7 +6,7 @@ import {
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
-import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionDivider} from 'sentry/views/issueDetails/foldSection';
import {DiagnosisSection} from './diagnosisSection';
import {ImpactSection} from './impactSection';
diff --git a/static/app/views/issueDetails/streamline/context.tsx b/static/app/views/issueDetails/context.tsx
similarity index 98%
rename from static/app/views/issueDetails/streamline/context.tsx
rename to static/app/views/issueDetails/context.tsx
index 06ac51ad77db89..6814d2ed7c7669 100644
--- a/static/app/views/issueDetails/streamline/context.tsx
+++ b/static/app/views/issueDetails/context.tsx
@@ -8,7 +8,7 @@ import {
type Reducer,
} from 'react';
-import type {DetectorDetails} from 'sentry/views/issueDetails/streamline/sidebar/detectorSection';
+import type {DetectorDetails} from 'sentry/views/issueDetails/sidebar/detectorSection';
export const enum SectionKey {
/**
diff --git a/static/app/views/issueDetails/streamline/downtimeDuration.tsx b/static/app/views/issueDetails/downtimeDuration.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/downtimeDuration.tsx
rename to static/app/views/issueDetails/downtimeDuration.tsx
diff --git a/static/app/views/issueDetails/streamline/eventDetails.tsx b/static/app/views/issueDetails/eventDetails.tsx
similarity index 92%
rename from static/app/views/issueDetails/streamline/eventDetails.tsx
rename to static/app/views/issueDetails/eventDetails.tsx
index 0fc4773f06675a..9276c249db0604 100644
--- a/static/app/views/issueDetails/streamline/eventDetails.tsx
+++ b/static/app/views/issueDetails/eventDetails.tsx
@@ -7,13 +7,13 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
+import {useIssueDetails} from 'sentry/views/issueDetails/context';
+import {EventMissingBanner} from 'sentry/views/issueDetails/eventMissingBanner';
+import {EventTitle} from 'sentry/views/issueDetails/eventTitle';
import {
EventDetailsContent,
type EventDetailsContentProps,
} from 'sentry/views/issueDetails/groupEventDetails/groupEventDetailsContent';
-import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {EventMissingBanner} from 'sentry/views/issueDetails/streamline/eventMissingBanner';
-import {EventTitle} from 'sentry/views/issueDetails/streamline/eventTitle';
import {useTopOffset} from 'sentry/views/navigation/useTopOffset';
export function EventDetails({group, event, project}: EventDetailsContentProps) {
diff --git a/static/app/views/issueDetails/streamline/eventDetailsHeader.spec.tsx b/static/app/views/issueDetails/eventDetailsHeader.spec.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/eventDetailsHeader.spec.tsx
rename to static/app/views/issueDetails/eventDetailsHeader.spec.tsx
diff --git a/static/app/views/issueDetails/streamline/eventDetailsHeader.tsx b/static/app/views/issueDetails/eventDetailsHeader.tsx
similarity index 94%
rename from static/app/views/issueDetails/streamline/eventDetailsHeader.tsx
rename to static/app/views/issueDetails/eventDetailsHeader.tsx
index e826c4c785a9d5..b36c3885088ce9 100644
--- a/static/app/views/issueDetails/streamline/eventDetailsHeader.tsx
+++ b/static/app/views/issueDetails/eventDetailsHeader.tsx
@@ -23,21 +23,21 @@ import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
import {useLocation} from 'sentry/utils/useLocation';
import {useNavigate} from 'sentry/utils/useNavigate';
import {useOrganization} from 'sentry/utils/useOrganization';
+import {useIssueDetails} from 'sentry/views/issueDetails/context';
+import {EventGraph} from 'sentry/views/issueDetails/eventGraph';
+import {EventSearch} from 'sentry/views/issueDetails/eventSearch';
+import {useEventQuery} from 'sentry/views/issueDetails/hooks/useEventQuery';
+import {IssueCronCheckTimeline} from 'sentry/views/issueDetails/issueCronCheckTimeline';
import {
IssueDetailsTour,
IssueDetailsTourContext,
} from 'sentry/views/issueDetails/issueDetailsTour';
+import {IssueTagsPreview} from 'sentry/views/issueDetails/issueTagsPreview';
+import {IssueUptimeCheckTimeline} from 'sentry/views/issueDetails/issueUptimeCheckTimeline';
import {MetricIssueChart} from 'sentry/views/issueDetails/metricIssues/metricIssueChart';
-import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {EventGraph} from 'sentry/views/issueDetails/streamline/eventGraph';
-import {EventSearch} from 'sentry/views/issueDetails/streamline/eventSearch';
-import {useEventQuery} from 'sentry/views/issueDetails/streamline/hooks/useEventQuery';
-import {IssueCronCheckTimeline} from 'sentry/views/issueDetails/streamline/issueCronCheckTimeline';
-import {IssueTagsPreview} from 'sentry/views/issueDetails/streamline/issueTagsPreview';
-import {IssueUptimeCheckTimeline} from 'sentry/views/issueDetails/streamline/issueUptimeCheckTimeline';
-import {OccurrenceSummary} from 'sentry/views/issueDetails/streamline/occurrenceSummary';
-import {getDetectorDetails} from 'sentry/views/issueDetails/streamline/sidebar/detectorSection';
-import {ToggleSidebar} from 'sentry/views/issueDetails/streamline/sidebar/toggleSidebar';
+import {OccurrenceSummary} from 'sentry/views/issueDetails/occurrenceSummary';
+import {getDetectorDetails} from 'sentry/views/issueDetails/sidebar/detectorSection';
+import {ToggleSidebar} from 'sentry/views/issueDetails/sidebar/toggleSidebar';
import {useGroupDefaultStatsPeriod} from 'sentry/views/issueDetails/useGroupDefaultStatsPeriod';
import {
getGroupReprocessingStatus,
diff --git a/static/app/views/issueDetails/streamline/eventGraph.spec.tsx b/static/app/views/issueDetails/eventGraph.spec.tsx
similarity index 99%
rename from static/app/views/issueDetails/streamline/eventGraph.spec.tsx
rename to static/app/views/issueDetails/eventGraph.spec.tsx
index 9385d3c42e5536..fc88aa8504eeae 100644
--- a/static/app/views/issueDetails/streamline/eventGraph.spec.tsx
+++ b/static/app/views/issueDetails/eventGraph.spec.tsx
@@ -9,7 +9,7 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar
import {PageFiltersStore} from 'sentry/components/pageFilters/store';
import {ProjectsStore} from 'sentry/stores/projectsStore';
-import {EventGraph} from 'sentry/views/issueDetails/streamline/eventGraph';
+import {EventGraph} from 'sentry/views/issueDetails/eventGraph';
import {EventDetailsHeader} from './eventDetailsHeader';
diff --git a/static/app/views/issueDetails/streamline/eventGraph.tsx b/static/app/views/issueDetails/eventGraph.tsx
similarity index 98%
rename from static/app/views/issueDetails/streamline/eventGraph.tsx
rename to static/app/views/issueDetails/eventGraph.tsx
index 92b08410747ec4..e279ae5af375b4 100644
--- a/static/app/views/issueDetails/streamline/eventGraph.tsx
+++ b/static/app/views/issueDetails/eventGraph.tsx
@@ -36,14 +36,14 @@ import {getBucketSize} from 'sentry/views/dashboards/utils/getBucketSize';
import {useReleasesDrawer} from 'sentry/views/explore/releases/drawer/useReleasesDrawer';
import {useReleaseBubbles} from 'sentry/views/explore/releases/releaseBubbles/useReleaseBubbles';
import {makeReleaseDrawerPathname} from 'sentry/views/explore/releases/utils/pathnames';
-import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/streamline/eventGraphWidget';
-import {useCurrentEventMarklineSeries} from 'sentry/views/issueDetails/streamline/hooks/useEventMarkLineSeries';
+import {useIssueDetails} from 'sentry/views/issueDetails/context';
+import {EVENT_GRAPH_WIDGET_ID} from 'sentry/views/issueDetails/eventGraphWidget';
+import {useCurrentEventMarklineSeries} from 'sentry/views/issueDetails/hooks/useEventMarkLineSeries';
import {
useIssueDetailsDiscoverQuery,
useIssueDetailsEventView,
-} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
-import {useReleaseMarkLineSeries} from 'sentry/views/issueDetails/streamline/hooks/useReleaseMarkLineSeries';
+} from 'sentry/views/issueDetails/hooks/useIssueDetailsDiscoverQuery';
+import {useReleaseMarkLineSeries} from 'sentry/views/issueDetails/hooks/useReleaseMarkLineSeries';
import {Tab} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
diff --git a/static/app/views/issueDetails/streamline/eventGraphWidget.tsx b/static/app/views/issueDetails/eventGraphWidget.tsx
similarity index 95%
rename from static/app/views/issueDetails/streamline/eventGraphWidget.tsx
rename to static/app/views/issueDetails/eventGraphWidget.tsx
index df183d54f418cf..e37a2ad79b4f1f 100644
--- a/static/app/views/issueDetails/streamline/eventGraphWidget.tsx
+++ b/static/app/views/issueDetails/eventGraphWidget.tsx
@@ -13,8 +13,8 @@ import {useParams} from 'sentry/utils/useParams';
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
import {ReleasesDrawerFields} from 'sentry/views/explore/releases/drawer/utils';
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
-import {EventGraph} from 'sentry/views/issueDetails/streamline/eventGraph';
-import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
+import {EventGraph} from 'sentry/views/issueDetails/eventGraph';
+import {useIssueDetailsEventView} from 'sentry/views/issueDetails/hooks/useIssueDetailsDiscoverQuery';
export default function EventGraphWidget({
pageFilters,
diff --git a/static/app/views/issueDetails/streamline/eventList.spec.tsx b/static/app/views/issueDetails/eventList.spec.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/eventList.spec.tsx
rename to static/app/views/issueDetails/eventList.spec.tsx
diff --git a/static/app/views/issueDetails/streamline/eventList.tsx b/static/app/views/issueDetails/eventList.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/eventList.tsx
rename to static/app/views/issueDetails/eventList.tsx
index 4181a4bb3ad909..5f0d0ba620f0ef 100644
--- a/static/app/views/issueDetails/streamline/eventList.tsx
+++ b/static/app/views/issueDetails/eventList.tsx
@@ -18,9 +18,9 @@ import {
PaginationButton,
PaginationText,
Title,
-} from 'sentry/views/issueDetails/streamline/eventListTable';
-import {ALL_EVENTS_EXCLUDED_TAGS} from 'sentry/views/issueDetails/streamline/hooks/useEventQuery';
-import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
+} from 'sentry/views/issueDetails/eventListTable';
+import {ALL_EVENTS_EXCLUDED_TAGS} from 'sentry/views/issueDetails/hooks/useEventQuery';
+import {useIssueDetailsEventView} from 'sentry/views/issueDetails/hooks/useIssueDetailsDiscoverQuery';
import {EventsTable} from 'sentry/views/performance/transactionSummary/transactionEvents/eventsTable';
interface EventListProps {
diff --git a/static/app/views/issueDetails/streamline/eventListTable.tsx b/static/app/views/issueDetails/eventListTable.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/eventListTable.tsx
rename to static/app/views/issueDetails/eventListTable.tsx
index bbbe0087b5f431..255009f7e11d07 100644
--- a/static/app/views/issueDetails/streamline/eventListTable.tsx
+++ b/static/app/views/issueDetails/eventListTable.tsx
@@ -21,7 +21,7 @@ import {useLocation} from 'sentry/utils/useLocation';
interface EventListTableProps {
/**
- * Should contain a to apply the streamlined styles
+ * Should contain a to apply the issue details styles
*/
children: React.ReactNode;
pagination?: {
@@ -81,7 +81,7 @@ export function EventListTable({children, pagination, title}: EventListTableProp
const hasHeader = title !== undefined || isPaginationEnabled;
return (
-
+
{hasHeader ? (
{title}
@@ -132,7 +132,7 @@ export function EventListTable({children, pagination, title}: EventListTableProp
) : null}
{children}
-
+
);
}
@@ -163,7 +163,7 @@ export const HeaderItem = styled('div')`
font-size: ${p => p.theme.font.size.sm};
`;
-const StreamlineGridEditable = styled('div')`
+const StyledGridEditable = styled('div')`
border: 1px solid ${p => p.theme.tokens.border.primary};
border-radius: ${p => p.theme.radius.md};
diff --git a/static/app/views/issueDetails/streamline/eventMissingBanner.spec.tsx b/static/app/views/issueDetails/eventMissingBanner.spec.tsx
similarity index 95%
rename from static/app/views/issueDetails/streamline/eventMissingBanner.spec.tsx
rename to static/app/views/issueDetails/eventMissingBanner.spec.tsx
index 14cc0ac253a104..e45f78ec53a638 100644
--- a/static/app/views/issueDetails/streamline/eventMissingBanner.spec.tsx
+++ b/static/app/views/issueDetails/eventMissingBanner.spec.tsx
@@ -1,6 +1,6 @@
import {render, screen} from 'sentry-test/reactTestingLibrary';
-import {EventMissingBanner} from 'sentry/views/issueDetails/streamline/eventMissingBanner';
+import {EventMissingBanner} from 'sentry/views/issueDetails/eventMissingBanner';
describe('EventMissingBanner', () => {
it('renders elements for known event IDs', () => {
diff --git a/static/app/views/issueDetails/streamline/eventMissingBanner.tsx b/static/app/views/issueDetails/eventMissingBanner.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/eventMissingBanner.tsx
rename to static/app/views/issueDetails/eventMissingBanner.tsx
diff --git a/static/app/views/issueDetails/streamline/eventNavigation.spec.tsx b/static/app/views/issueDetails/eventNavigation/index.spec.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/eventNavigation.spec.tsx
rename to static/app/views/issueDetails/eventNavigation/index.spec.tsx
index 67147524d662a4..5db6d78c8c245a 100644
--- a/static/app/views/issueDetails/streamline/eventNavigation.spec.tsx
+++ b/static/app/views/issueDetails/eventNavigation/index.spec.tsx
@@ -6,12 +6,12 @@ import {OrganizationFixture} from 'sentry-fixture/organization';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
-import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
+import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/context';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
-import {IssueEventNavigation} from './eventNavigation';
+import {IssueEventNavigation} from '.';
-jest.mock('sentry/views/issueDetails/streamline/context');
+jest.mock('sentry/views/issueDetails/context');
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useMatches: jest.fn(),
diff --git a/static/app/views/issueDetails/streamline/eventNavigation.tsx b/static/app/views/issueDetails/eventNavigation/index.tsx
similarity index 98%
rename from static/app/views/issueDetails/streamline/eventNavigation.tsx
rename to static/app/views/issueDetails/eventNavigation/index.tsx
index 601e6e159ff7b3..a3dfed99440709 100644
--- a/static/app/views/issueDetails/streamline/eventNavigation.tsx
+++ b/static/app/views/issueDetails/eventNavigation/index.tsx
@@ -27,18 +27,18 @@ import {useReplayCountForIssues} from 'sentry/utils/replayCount/useReplayCountFo
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {hasDatasetSelector} from 'sentry/views/dashboards/utils';
+import {useIssueDetails} from 'sentry/views/issueDetails/context';
+import {IssueDetailsEventNavigation} from 'sentry/views/issueDetails/eventNavigation/issueDetailsEventNavigation';
import {useGroupEventAttachments} from 'sentry/views/issueDetails/groupEventAttachments/useGroupEventAttachments';
+import {
+ issueAndEventToMarkdown,
+ useActiveThreadId,
+} from 'sentry/views/issueDetails/hooks/useCopyIssueDetails';
+import {useIssueDetailsEventView} from 'sentry/views/issueDetails/hooks/useIssueDetailsDiscoverQuery';
import {
IssueDetailsTour,
IssueDetailsTourContext,
} from 'sentry/views/issueDetails/issueDetailsTour';
-import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {
- issueAndEventToMarkdown,
- useActiveThreadId,
-} from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails';
-import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
-import {IssueDetailsEventNavigation} from 'sentry/views/issueDetails/streamline/issueDetailsEventNavigation';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
diff --git a/static/app/views/issueDetails/streamline/issueDetailsEventNavigation.spec.tsx b/static/app/views/issueDetails/eventNavigation/issueDetailsEventNavigation.spec.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/issueDetailsEventNavigation.spec.tsx
rename to static/app/views/issueDetails/eventNavigation/issueDetailsEventNavigation.spec.tsx
diff --git a/static/app/views/issueDetails/streamline/issueDetailsEventNavigation.tsx b/static/app/views/issueDetails/eventNavigation/issueDetailsEventNavigation.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/issueDetailsEventNavigation.tsx
rename to static/app/views/issueDetails/eventNavigation/issueDetailsEventNavigation.tsx
diff --git a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.spec.tsx b/static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.spec.tsx
similarity index 94%
rename from static/app/views/issueDetails/streamline/issueDetailsJumpTo.spec.tsx
rename to static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.spec.tsx
index 89928b5a7e08d3..fe32f19354e0aa 100644
--- a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.spec.tsx
+++ b/static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.spec.tsx
@@ -8,8 +8,9 @@ import {
within,
} from 'sentry-test/reactTestingLibrary';
-import {IssueDetailsContextProvider, SectionKey} from './context';
-import {FoldSection} from './foldSection';
+import {IssueDetailsContextProvider, SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
+
import {IssueDetailsJumpTo} from './issueDetailsJumpTo';
describe('IssueDetailsJumpTo', () => {
diff --git a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx b/static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
rename to static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.tsx
index a1df2b128e4940..628ba1de6765b8 100644
--- a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
+++ b/static/app/views/issueDetails/eventNavigation/issueDetailsJumpTo.tsx
@@ -12,8 +12,8 @@ import {
SectionKey,
useIssueDetails,
type SectionConfig,
-} from 'sentry/views/issueDetails/streamline/context';
-import {getFoldSectionKey} from 'sentry/views/issueDetails/streamline/foldSection';
+} from 'sentry/views/issueDetails/context';
+import {getFoldSectionKey} from 'sentry/views/issueDetails/foldSection';
const sectionLabels: Partial> = {
[SectionKey.HIGHLIGHTS]: t('Highlights'),
diff --git a/static/app/views/issueDetails/streamline/eventSearch.spec.tsx b/static/app/views/issueDetails/eventSearch.spec.tsx
similarity index 96%
rename from static/app/views/issueDetails/streamline/eventSearch.spec.tsx
rename to static/app/views/issueDetails/eventSearch.spec.tsx
index 1784fa73f79174..3b67f021fb50dc 100644
--- a/static/app/views/issueDetails/streamline/eventSearch.spec.tsx
+++ b/static/app/views/issueDetails/eventSearch.spec.tsx
@@ -6,7 +6,7 @@ import {TagsFixture} from 'sentry-fixture/tags';
import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import {OrganizationStore} from 'sentry/stores/organizationStore';
-import {EventSearch} from 'sentry/views/issueDetails/streamline/eventSearch';
+import {EventSearch} from 'sentry/views/issueDetails/eventSearch';
const mockHandleSearch = jest.fn();
diff --git a/static/app/views/issueDetails/streamline/eventSearch.tsx b/static/app/views/issueDetails/eventSearch.tsx
similarity index 99%
rename from static/app/views/issueDetails/streamline/eventSearch.tsx
rename to static/app/views/issueDetails/eventSearch.tsx
index 340b2c634efb57..a4a7960bf2337e 100644
--- a/static/app/views/issueDetails/streamline/eventSearch.tsx
+++ b/static/app/views/issueDetails/eventSearch.tsx
@@ -14,7 +14,7 @@ import {useApi} from 'sentry/utils/useApi';
import {useOrganization} from 'sentry/utils/useOrganization';
import {Dataset} from 'sentry/views/alerts/rules/metric/types';
import {useGroupTags} from 'sentry/views/issueDetails/groupTags/useGroupTags';
-import {ALL_EVENTS_EXCLUDED_TAGS} from 'sentry/views/issueDetails/streamline/hooks/useEventQuery';
+import {ALL_EVENTS_EXCLUDED_TAGS} from 'sentry/views/issueDetails/hooks/useEventQuery';
import {mergeAndSortTagValues} from 'sentry/views/issueDetails/utils';
import {makeGetIssueTagValues} from 'sentry/views/issueList/utils/getIssueTagValues';
diff --git a/static/app/views/issueDetails/streamline/eventTitle.spec.tsx b/static/app/views/issueDetails/eventTitle.spec.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/eventTitle.spec.tsx
rename to static/app/views/issueDetails/eventTitle.spec.tsx
index 340609679c8332..0cc7509bc7ee19 100644
--- a/static/app/views/issueDetails/streamline/eventTitle.spec.tsx
+++ b/static/app/views/issueDetails/eventTitle.spec.tsx
@@ -3,11 +3,11 @@ import {GroupFixture} from 'sentry-fixture/group';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
-import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
+import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/context';
import {EventTitle} from './eventTitle';
-jest.mock('sentry/views/issueDetails/streamline/context');
+jest.mock('sentry/views/issueDetails/context');
describe('EventNavigation', () => {
const testEvent = EventFixture({
diff --git a/static/app/views/issueDetails/streamline/eventTitle.tsx b/static/app/views/issueDetails/eventTitle.tsx
similarity index 96%
rename from static/app/views/issueDetails/streamline/eventTitle.tsx
rename to static/app/views/issueDetails/eventTitle.tsx
index d7e86d5f366401..456ba5281f3074 100644
--- a/static/app/views/issueDetails/streamline/eventTitle.tsx
+++ b/static/app/views/issueDetails/eventTitle.tsx
@@ -23,11 +23,11 @@ import {
import {useCopyToClipboard} from 'sentry/utils/useCopyToClipboard';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
+import {SectionKey} from 'sentry/views/issueDetails/context';
import {Divider} from 'sentry/views/issueDetails/divider';
import {EventCreatedTooltip} from 'sentry/views/issueDetails/eventCreatedTooltip';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {getFoldSectionKey} from 'sentry/views/issueDetails/streamline/foldSection';
-import {IssueDetailsJumpTo} from 'sentry/views/issueDetails/streamline/issueDetailsJumpTo';
+import {IssueDetailsJumpTo} from 'sentry/views/issueDetails/eventNavigation/issueDetailsJumpTo';
+import {getFoldSectionKey} from 'sentry/views/issueDetails/foldSection';
type EventNavigationProps = {
event: Event;
diff --git a/static/app/views/issueDetails/streamline/foldSection.spec.tsx b/static/app/views/issueDetails/foldSection.spec.tsx
similarity index 98%
rename from static/app/views/issueDetails/streamline/foldSection.spec.tsx
rename to static/app/views/issueDetails/foldSection.spec.tsx
index ab034700581084..5a2a8c89282b7a 100644
--- a/static/app/views/issueDetails/streamline/foldSection.spec.tsx
+++ b/static/app/views/issueDetails/foldSection.spec.tsx
@@ -7,14 +7,11 @@ import {Button} from '@sentry/scraps/button';
import {trackAnalytics} from 'sentry/utils/analytics';
import {localStorageWrapper} from 'sentry/utils/localStorage';
-import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-import {
- FoldSection,
- getFoldSectionKey,
-} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey, useIssueDetails} from 'sentry/views/issueDetails/context';
+import {FoldSection, getFoldSectionKey} from 'sentry/views/issueDetails/foldSection';
// Mock dependencies
-jest.mock('sentry/views/issueDetails/streamline/context');
+jest.mock('sentry/views/issueDetails/context');
jest.mock('sentry/utils/analytics', () => ({
trackAnalytics: jest.fn(),
}));
diff --git a/static/app/views/issueDetails/streamline/foldSection.stories.tsx b/static/app/views/issueDetails/foldSection.stories.tsx
similarity index 94%
rename from static/app/views/issueDetails/streamline/foldSection.stories.tsx
rename to static/app/views/issueDetails/foldSection.stories.tsx
index 3f27a72138bfd1..6250578b53e076 100644
--- a/static/app/views/issueDetails/streamline/foldSection.stories.tsx
+++ b/static/app/views/issueDetails/foldSection.stories.tsx
@@ -5,15 +5,15 @@ import {CodeBlock} from '@sentry/scraps/code';
import {IconAdd, IconCopy, IconSubtract} from 'sentry/icons';
import * as Storybook from 'sentry/stories';
-import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
export default Storybook.story('FoldSection', story => {
story('Usage', () => (
- {`import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
+ {`import {SectionKey} from 'sentry/views/issueDetails/context';
+import {FoldSection} from 'sentry/views/issueDetails/foldSection';
diff --git a/static/app/views/issueDetails/streamline/foldSection.tsx b/static/app/views/issueDetails/foldSection.tsx
similarity index 97%
rename from static/app/views/issueDetails/streamline/foldSection.tsx
rename to static/app/views/issueDetails/foldSection.tsx
index c94340676a2a60..925ba923e071b8 100644
--- a/static/app/views/issueDetails/streamline/foldSection.tsx
+++ b/static/app/views/issueDetails/foldSection.tsx
@@ -18,8 +18,8 @@ import {t} from 'sentry/locale';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
-import type {FoldSectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
+import type {FoldSectionKey} from 'sentry/views/issueDetails/context';
+import {useIssueDetails} from 'sentry/views/issueDetails/context';
export function getFoldSectionKey(key: FoldSectionKey) {
// Original key had a typo, this will migrate existing keys to the correct key
diff --git a/static/app/views/issueDetails/groupCheckIns.tsx b/static/app/views/issueDetails/groupCheckIns.tsx
index 78464e83f6cf89..ba01c3a74668cc 100644
--- a/static/app/views/issueDetails/groupCheckIns.tsx
+++ b/static/app/views/issueDetails/groupCheckIns.tsx
@@ -12,8 +12,8 @@ import {useOrganization} from 'sentry/utils/useOrganization';
import {useParams} from 'sentry/utils/useParams';
import {MonitorCheckInsGrid} from 'sentry/views/insights/crons/components/monitorCheckInsGrid';
import {monitorCheckInsApiOptions} from 'sentry/views/insights/crons/utils/monitorCheckInsApiOptions';
-import {EventListTable} from 'sentry/views/issueDetails/streamline/eventListTable';
-import {useCronIssueAlertId} from 'sentry/views/issueDetails/streamline/issueCronCheckTimeline';
+import {EventListTable} from 'sentry/views/issueDetails/eventListTable';
+import {useCronIssueAlertId} from 'sentry/views/issueDetails/issueCronCheckTimeline';
import {useGroup} from 'sentry/views/issueDetails/useGroup';
export default function GroupCheckIns() {
diff --git a/static/app/views/issueDetails/groupDetails.tsx b/static/app/views/issueDetails/groupDetails.tsx
index ac0a3c10db674e..7ffa24cec83f85 100644
--- a/static/app/views/issueDetails/groupDetails.tsx
+++ b/static/app/views/issueDetails/groupDetails.tsx
@@ -52,8 +52,13 @@ import {useParams} from 'sentry/utils/useParams';
import {useProjects} from 'sentry/utils/useProjects';
import {useUser} from 'sentry/utils/useUser';
import {ERROR_TYPES} from 'sentry/views/issueDetails/constants';
+import {GroupDetailsLayout} from 'sentry/views/issueDetails/groupDetailsLayout';
import {useGroupDistributionsDrawer} from 'sentry/views/issueDetails/groupDistributions/useGroupDistributionsDrawer';
import GroupEventDetails from 'sentry/views/issueDetails/groupEventDetails/groupEventDetails';
+import {useAiConfig} from 'sentry/views/issueDetails/hooks/useAiConfig';
+import {useIssueActivityDrawer} from 'sentry/views/issueDetails/hooks/useIssueActivityDrawer';
+import {useMergedIssuesDrawer} from 'sentry/views/issueDetails/hooks/useMergedIssuesDrawer';
+import {useSimilarIssuesDrawer} from 'sentry/views/issueDetails/hooks/useSimilarIssuesDrawer';
import {
ISSUE_DETAILS_TOUR_GUIDE_KEY,
IssueDetailsTourContext,
@@ -61,12 +66,7 @@ import {
type IssueDetailsTour,
} from 'sentry/views/issueDetails/issueDetailsTour';
import {SampleEventAlert} from 'sentry/views/issueDetails/sampleEventAlert';
-import {GroupDetailsLayout} from 'sentry/views/issueDetails/streamline/groupDetailsLayout';
-import {useAiConfig} from 'sentry/views/issueDetails/streamline/hooks/useAiConfig';
-import {useIssueActivityDrawer} from 'sentry/views/issueDetails/streamline/hooks/useIssueActivityDrawer';
-import {useMergedIssuesDrawer} from 'sentry/views/issueDetails/streamline/hooks/useMergedIssuesDrawer';
-import {useSimilarIssuesDrawer} from 'sentry/views/issueDetails/streamline/hooks/useSimilarIssuesDrawer';
-import {useOpenSeerDrawer} from 'sentry/views/issueDetails/streamline/sidebar/seerDrawer';
+import {useOpenSeerDrawer} from 'sentry/views/issueDetails/sidebar/seerDrawer';
import {Tab} from 'sentry/views/issueDetails/types';
import {useEngagedViewTracking} from 'sentry/views/issueDetails/useEngagedViewTracking';
import {groupApiOptions, useGroup} from 'sentry/views/issueDetails/useGroup';
diff --git a/static/app/views/issueDetails/streamline/groupDetailsLayout.spec.tsx b/static/app/views/issueDetails/groupDetailsLayout.spec.tsx
similarity index 100%
rename from static/app/views/issueDetails/streamline/groupDetailsLayout.spec.tsx
rename to static/app/views/issueDetails/groupDetailsLayout.spec.tsx
diff --git a/static/app/views/issueDetails/streamline/groupDetailsLayout.tsx b/static/app/views/issueDetails/groupDetailsLayout.tsx
similarity index 89%
rename from static/app/views/issueDetails/streamline/groupDetailsLayout.tsx
rename to static/app/views/issueDetails/groupDetailsLayout.tsx
index 53eb93687a2463..5eb1b7c161ffa5 100644
--- a/static/app/views/issueDetails/streamline/groupDetailsLayout.tsx
+++ b/static/app/views/issueDetails/groupDetailsLayout.tsx
@@ -9,19 +9,19 @@ import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
import {DemoTourStep, SharedTourElement} from 'sentry/utils/demoMode/demoTours';
import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
+import {
+ IssueDetailsContextProvider,
+ useIssueDetails,
+} from 'sentry/views/issueDetails/context';
+import {EventDetailsHeader} from 'sentry/views/issueDetails/eventDetailsHeader';
+import {IssueEventNavigation} from 'sentry/views/issueDetails/eventNavigation';
+import {GroupHeader} from 'sentry/views/issueDetails/header/header';
import {
IssueDetailsTour,
IssueDetailsTourContext,
} from 'sentry/views/issueDetails/issueDetailsTour';
-import {
- IssueDetailsContextProvider,
- useIssueDetails,
-} from 'sentry/views/issueDetails/streamline/context';
-import {EventDetailsHeader} from 'sentry/views/issueDetails/streamline/eventDetailsHeader';
-import {IssueEventNavigation} from 'sentry/views/issueDetails/streamline/eventNavigation';
-import {StreamlinedGroupHeader} from 'sentry/views/issueDetails/streamline/header/header';
-import {StreamlinedSidebar} from 'sentry/views/issueDetails/streamline/sidebar/sidebar';
-import {ToggleSidebar} from 'sentry/views/issueDetails/streamline/sidebar/toggleSidebar';
+import {IssueDetailsSidebar} from 'sentry/views/issueDetails/sidebar/sidebar';
+import {ToggleSidebar} from 'sentry/views/issueDetails/sidebar/toggleSidebar';
import {
getGroupReprocessingStatus,
ReprocessingStatus,
@@ -66,7 +66,7 @@ export function GroupDetailsLayout({
: undefined
}
>
-
+