diff --git a/frontend/__tests__/external_urls_test.ts b/frontend/__tests__/external_urls_test.ts new file mode 100644 index 000000000..156e1932b --- /dev/null +++ b/frontend/__tests__/external_urls_test.ts @@ -0,0 +1,33 @@ +jest.unmock("../external_urls"); +import { ExternalUrl } from "../external_urls"; + +/* tslint:disable:max-line-length */ + +describe("ExternalUrl", () => { + it("returns urls", () => { + expect(ExternalUrl.featureMinVersions) + .toEqual("https://raw.githubusercontent.com/FarmBot/farmbot_os/FEATURE_MIN_VERSIONS.json"); + expect(ExternalUrl.osReleaseNotes) + .toEqual("https://raw.githubusercontent.com/FarmBot/farmbot_os/RELEASE_NOTES.md"); + expect(ExternalUrl.latestRelease) + .toEqual("https://api.github.com/repos/FarmBot/farmbot_os/releases/latest"); + expect(ExternalUrl.webAppRepo) + .toEqual("https://github.com/FarmBot/Farmbot-Web-App"); + expect(ExternalUrl.gitHubFarmBot) + .toEqual("https://github.com/FarmBot"); + expect(ExternalUrl.softwareDocs) + .toEqual("https://software.farm.bot/docs"); + expect(ExternalUrl.softwareForum) + .toEqual("http://forum.farmbot.org/c/software"); + expect(ExternalUrl.OpenFarm.cropApi) + .toEqual("https://openfarm.cc/api/v1/crops/"); + expect(ExternalUrl.OpenFarm.cropBrowse) + .toEqual("https://openfarm.cc/crops/"); + expect(ExternalUrl.OpenFarm.newCrop) + .toEqual("https://openfarm.cc/en/crops/new"); + expect(ExternalUrl.Videos.desktop) + .toEqual("https://cdn.shopify.com/s/files/1/2040/0289/files/Farm_Designer_Loop.mp4?9552037556691879018"); + expect(ExternalUrl.Videos.mobile) + .toEqual("https://cdn.shopify.com/s/files/1/2040/0289/files/Controls.png?9668345515035078097"); + }); +}); diff --git a/frontend/api/api.ts b/frontend/api/api.ts index 03d5a55d0..264242e62 100644 --- a/frontend/api/api.ts +++ b/frontend/api/api.ts @@ -158,6 +158,10 @@ export class API { get farmwareInstallationPath() { return `${this.baseUrl}/api/farmware_installations/`; } + /** /api/first_party_farmwares */ + get firstPartyFarmwarePath() { + return `${this.baseUrl}/api/first_party_farmwares`; + } /** /api/alerts/:id */ get alertPath() { return `${this.baseUrl}/api/alerts/`; } /** /api/global_bulletins/:id */ diff --git a/frontend/apology.tsx b/frontend/apology.tsx index a00871358..bd2ac6328 100644 --- a/frontend/apology.tsx +++ b/frontend/apology.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import { Session } from "./session"; +import { ExternalUrl } from "./external_urls"; const OUTER_STYLE: React.CSSProperties = { borderRadius: "10px", @@ -47,7 +48,7 @@ export function Apology(_: {}) {
{t("Environment")}: {env}
-{t("Target")}: {target}
{t("Node name")}: {last((node_name || "").split("@"))}
{t("Device ID")}: {props.deviceAccount.body.id}
{isString(private_ip) &&{t("Local IP address")}: {private_ip}
}{t("Firmware")}: {reformatFwVersion(firmware_version)}
{t("Firmware code")}: {firmware_version}
{isNumber(uptime) &&{`${t(Content.CROP_NOT_FOUND_INTRO)} `} - + {t(Content.CROP_NOT_FOUND_LINK)}
; diff --git a/frontend/farm_designer/util.ts b/frontend/farm_designer/util.ts index 40500c821..425fece84 100644 --- a/frontend/farm_designer/util.ts +++ b/frontend/farm_designer/util.ts @@ -4,8 +4,10 @@ import { DEFAULT_ICON } from "../open_farm/icons"; import { Actions } from "../constants"; import { ExecutableType } from "farmbot/dist/resources/api_resources"; import { get } from "lodash"; +import { ExternalUrl } from "../external_urls"; -const url = (q: string) => `${OpenFarm.cropUrl}?include=pictures&filter=${q}`; +const url = (q: string) => + `${ExternalUrl.OpenFarm.cropApi}?include=pictures&filter=${q}`; const openFarmSearchQuery = (q: string): AxiosPromise{t("Please send us an email at contact@farm.bot or see the ")} - + {t("FarmBot forum.")}
diff --git a/frontend/ui/__tests__/doc_link_test.ts b/frontend/ui/__tests__/doc_link_test.ts index 5a1c61d06..bcb65f595 100644 --- a/frontend/ui/__tests__/doc_link_test.ts +++ b/frontend/ui/__tests__/doc_link_test.ts @@ -1,8 +1,9 @@ -import { docLink, BASE_URL } from "../doc_link"; +import { docLink } from "../doc_link"; +import { ExternalUrl } from "../../external_urls"; describe("docLink", () => { it("creates doc links", () => { - expect(docLink()).toEqual(BASE_URL); - expect(docLink("farmware")).toEqual(BASE_URL + "farmware"); + expect(docLink()).toEqual(ExternalUrl.softwareDocs + "/"); + expect(docLink("farmware")).toEqual(ExternalUrl.softwareDocs + "/farmware"); }); }); diff --git a/frontend/ui/doc_link.ts b/frontend/ui/doc_link.ts index a65b5958c..8cbcc2edd 100644 --- a/frontend/ui/doc_link.ts +++ b/frontend/ui/doc_link.ts @@ -1,4 +1,4 @@ -export const BASE_URL = "https://software.farm.bot/docs/"; +import { ExternalUrl } from "../external_urls"; /** A centralized list of all documentation slugs in the app makes it easier to * rename / move links in the future. */ @@ -7,11 +7,13 @@ export const DOC_SLUGS = { "camera-calibration": "Camera Calibration", "the-farmbot-web-app": "Web App", "farmware": "Farmware", - "connecting-farmbot-to-the-internet": "Connecting FarmBot to the Internet" + "connecting-farmbot-to-the-internet": "Connecting FarmBot to the Internet", + "for-it-security-professionals": "For IT Security Professionals", }; export type DocSlug = keyof typeof DOC_SLUGS; /** WHY?: The function keeps things DRY. It also makes life easier when the * documentation URL / slug name changes. */ -export const docLink = (slug?: DocSlug) => BASE_URL + (slug || ""); +export const docLink = (slug?: DocSlug) => + `${ExternalUrl.softwareDocs}/${slug || ""}`;