## Description This PR aims to achieve 2 things 1. Make route building independent of explicitly passing `pageId` as param when the route is generated against the current page navigation. 2. Add extensible points to extend basePath generation in EE. THIS PR DOES NOT CHANGE ROUTE GENERATION. Changes: In `app/client/src/ce/entities/URLRedirect/URLAssembly.ts` 1. Moves the logic of `generateBasePath` way to specific method called `generateBasePathForApps` and the generateBasePath is available to extend and switch between a different base path generation logic in EE. 2. Adds a new member variable called `currentPageId`. This `currentPageId` would help generating basePath without explicitly passing `pageId` to the build method. If a `pageId` is passed it would be overridden in the `resolveEntityId` logic. 3. Added `resolveEntityId` method to resolve the entity (pageId) based on the params passed and the `currentPageId`. This method also acts as an extension point for extending the logic to any other resolution logic similar to `generateBasePath` In `app/client/src/pages/AppViewer/index.tsx` and `app/client/src/pages/Editor/index.tsx` The `currentPageId` is set using the `urlBuilder.setCurrentPageId` when the component mounts or page changes and unset when the component unmounts. #### PR fixes following issue(s) Fixes #27840 #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change - Chore (housekeeping or task changes that don't impact user perception) ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [x] Manual - [ ] JUnit - [x] Jest - [ ] Cypress > > #### Test Plan > Add Testsmith test cases links that relate to this PR > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
139 lines
4.5 KiB
TypeScript
139 lines
4.5 KiB
TypeScript
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import { getDefaultPageId } from "sagas/selectors";
|
|
import { getSettings } from "selectors/settingsSelectors";
|
|
import { getCurrentUser } from "selectors/usersSelectors";
|
|
import { getCurrentApplication } from "@appsmith/selectors/applicationSelectors";
|
|
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
|
|
import debounce from "lodash/debounce";
|
|
import { updateApplication } from "@appsmith/actions/applicationActions";
|
|
import { viewerURL } from "@appsmith/RouteBuilder";
|
|
import {
|
|
createMessage,
|
|
IN_APP_EMBED_SETTING,
|
|
} from "@appsmith/constants/messages";
|
|
import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors";
|
|
import { AppsmithFrameAncestorsSetting } from "./Constants/constants";
|
|
import { formatEmbedSettings } from "./Utils/utils";
|
|
|
|
const regex = /^[1-9][0-9]{0,3}((px)|(em)|(%)|(vw)|(vh))?$/;
|
|
|
|
const embedSettingContentConfig = {
|
|
[AppsmithFrameAncestorsSetting.ALLOW_EMBEDDING_EVERYWHERE]: {
|
|
icon: "global-line",
|
|
label: createMessage(IN_APP_EMBED_SETTING.allowEmbeddingLabel),
|
|
tooltip: createMessage(IN_APP_EMBED_SETTING.allowEmbeddingTooltip),
|
|
},
|
|
[AppsmithFrameAncestorsSetting.LIMIT_EMBEDDING]: {
|
|
icon: "lock-2-line",
|
|
label: createMessage(IN_APP_EMBED_SETTING.limitEmbeddingLabel),
|
|
tooltip: createMessage(IN_APP_EMBED_SETTING.limitEmbeddingTooltip),
|
|
},
|
|
[AppsmithFrameAncestorsSetting.DISABLE_EMBEDDING_EVERYWHERE]: {
|
|
icon: "forbid-line",
|
|
label: createMessage(IN_APP_EMBED_SETTING.disableEmbeddingLabel),
|
|
tooltip: createMessage(IN_APP_EMBED_SETTING.disableEmbeddingTooltip),
|
|
},
|
|
};
|
|
|
|
type EmbedSetting = keyof typeof embedSettingContentConfig;
|
|
|
|
function useUpdateEmbedSnippet() {
|
|
const dispatch = useDispatch();
|
|
const application = useSelector(getCurrentApplication);
|
|
const settings = useSelector(getSettings);
|
|
const user = useSelector(getCurrentUser);
|
|
const defaultPageId = useSelector(getDefaultPageId);
|
|
const featureFlags = useSelector(selectFeatureFlags);
|
|
const currentSetting: EmbedSetting = formatEmbedSettings(
|
|
settings["APPSMITH_ALLOWED_FRAME_ANCESTORS"] as string,
|
|
).value;
|
|
const embedSettingContent = embedSettingContentConfig[currentSetting];
|
|
const [embedSetting, setEmbedSetting] = useState({
|
|
height: "720px",
|
|
width: "1024px",
|
|
...application?.embedSetting,
|
|
});
|
|
|
|
const areDimensionValuesValid = useCallback((embedSetting: any) => {
|
|
const isHeightValid = regex.test(embedSetting.height);
|
|
const isWidthValid = regex.test(embedSetting.width);
|
|
|
|
return isHeightValid && isWidthValid;
|
|
}, []);
|
|
|
|
const onChange = (setting: any) => {
|
|
if (application) {
|
|
const updatedSetting = { ...embedSetting, ...setting };
|
|
setEmbedSetting((state) => {
|
|
return {
|
|
...state,
|
|
...setting,
|
|
};
|
|
});
|
|
areDimensionValuesValid(updatedSetting) &&
|
|
debouncedUpdate(application?.id, updatedSetting);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (user?.isSuperUser) {
|
|
dispatch({
|
|
type: ReduxActionTypes.FETCH_ADMIN_SETTINGS,
|
|
});
|
|
}
|
|
}, []);
|
|
|
|
const debouncedUpdate = useCallback(
|
|
debounce(
|
|
(applicationId, embedSetting) => {
|
|
dispatch(
|
|
updateApplication(applicationId, {
|
|
embedSetting,
|
|
currentApp: true,
|
|
}),
|
|
);
|
|
},
|
|
1000,
|
|
{
|
|
leading: true,
|
|
},
|
|
),
|
|
[],
|
|
);
|
|
|
|
const appViewEndPoint = useMemo(() => {
|
|
const url = viewerURL({
|
|
pageId: defaultPageId,
|
|
});
|
|
const allowHidingShareSettingsInEmbedView =
|
|
featureFlags.release_embed_hide_share_settings_enabled;
|
|
const fullUrl = new URL(window.location.origin.toString() + url);
|
|
if (embedSetting?.showNavigationBar) {
|
|
if (allowHidingShareSettingsInEmbedView) {
|
|
fullUrl.searchParams.append("embed", "true");
|
|
fullUrl.searchParams.append("navbar", "true");
|
|
}
|
|
return fullUrl.toString();
|
|
}
|
|
|
|
fullUrl.searchParams.append("embed", "true");
|
|
return fullUrl.toString();
|
|
}, [defaultPageId, embedSetting?.showNavigationBar]);
|
|
|
|
const snippet = useMemo(() => {
|
|
return `<iframe src="${appViewEndPoint}" width="${embedSetting?.width}" height="${embedSetting?.height}"></iframe>`;
|
|
}, [appViewEndPoint, embedSetting?.width, embedSetting?.height]);
|
|
|
|
return {
|
|
appViewEndPoint,
|
|
snippet,
|
|
onChange,
|
|
embedSettingContent,
|
|
currentEmbedSetting: embedSetting,
|
|
isSuperUser: user?.isSuperUser,
|
|
};
|
|
}
|
|
|
|
export default useUpdateEmbedSnippet;
|