From 43c0cf6533dfd7b474c6cbe91b269e5b08606cfb Mon Sep 17 00:00:00 2001
From: Christopher Kaster
Date: Tue, 10 Oct 2023 20:39:34 +0900
Subject: [PATCH 01/21] add react-ga4, add test ad spaces
---
index.html | 1 +
package.json | 1 +
scripts/json-linter | 2 +-
src/@types/globals.d.ts | 1 +
src/app.tsx | 2 ++
src/components/AdSpace.tsx | 29 +++++++++++++++++++++++++++++
src/components/AdSpaceFloating.tsx | 30 ++++++++++++++++++++++++++++++
src/components/Layout.tsx | 15 ++++++++++++---
src/components/Tracking.tsx | 29 +++++++++++++++++++++++++++++
src/json/i18n/en/en.json | 6 ++++--
src/pages/about/About.tsx | 9 ---------
src/pages/about/Privacy.tsx | 18 ++++++++++++++++++
vite.config.ts | 1 +
13 files changed, 129 insertions(+), 15 deletions(-)
create mode 100644 src/components/AdSpace.tsx
create mode 100644 src/components/AdSpaceFloating.tsx
create mode 100644 src/components/Tracking.tsx
create mode 100644 src/pages/about/Privacy.tsx
diff --git a/index.html b/index.html
index f05ea74bd..ba84d08c3 100644
--- a/index.html
+++ b/index.html
@@ -51,6 +51,7 @@
property="og:locale:alternate"
content="ru_RU"
/>
+
/dev/null
fi
if [[ -z $(command -v json-linter) ]]; then
diff --git a/src/@types/globals.d.ts b/src/@types/globals.d.ts
index 0db5d592c..251e164ba 100644
--- a/src/@types/globals.d.ts
+++ b/src/@types/globals.d.ts
@@ -1,2 +1,3 @@
declare const DB_BUILD_TIME: number;
declare const DB_DEVMODE: boolean;
+declare const DB_GA4_MEASUREMENT_ID: string;
diff --git a/src/app.tsx b/src/app.tsx
index f44b50e18..3a6e5c16a 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -22,6 +22,8 @@ import BackgroundTasks from "@src/components/BackgroundTasks";
import Favorites from "@src/pages/favorites/Favorites";
import useIsMobile from "@src/hooks/is-mobile";
import log from "@src/utils/logger";
+import { useAppSelector } from "@src/hooks/redux";
+import { selectConfiguration } from "@src/reducers/configuration/configuration-slice";
import SomethingWentWrong from "@src/components/SomethingWentWrong";
import { ErrorBoundary } from "react-error-boundary";
import useIsLightMode from "@src/hooks/light-mode";
diff --git a/src/components/AdSpace.tsx b/src/components/AdSpace.tsx
new file mode 100644
index 000000000..843edd80e
--- /dev/null
+++ b/src/components/AdSpace.tsx
@@ -0,0 +1,29 @@
+import { FeaturedVideo } from "@mui/icons-material";
+import { Box, useTheme } from "@mui/material";
+
+const AdSpace = () => {
+ const theme = useTheme();
+
+ if (DB_DEVMODE) {
+ return (
+
+
+
+ );
+ }
+
+ return null;
+};
+
+export default AdSpace;
diff --git a/src/components/AdSpaceFloating.tsx b/src/components/AdSpaceFloating.tsx
new file mode 100644
index 000000000..795f293e2
--- /dev/null
+++ b/src/components/AdSpaceFloating.tsx
@@ -0,0 +1,30 @@
+import { Box, useTheme } from "@mui/material";
+import AdSpace from "@src/components/AdSpace";
+import useIsMobile from "@src/hooks/is-mobile";
+
+const AdSpaceFloating = () => {
+ const isMobile = useIsMobile();
+ const theme = useTheme();
+
+ if (!isMobile) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+};
+
+export default AdSpaceFloating;
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
index aeb89b5ea..597bfb8fc 100644
--- a/src/components/Layout.tsx
+++ b/src/components/Layout.tsx
@@ -9,6 +9,7 @@ import {
ManageSearch,
Menu,
Settings,
+ Shield,
Stars,
} from "@mui/icons-material";
import {
@@ -30,10 +31,13 @@ import {
Typography,
useTheme,
} from "@mui/material";
+import AdSpace from "@src/components/AdSpace";
+import AdSpaceFloating from "@src/components/AdSpaceFloating";
import BuildMenu from "@src/components/BuildMenu";
import LinkBox from "@src/components/LinkBox";
import { drawerWidth } from "@src/components/theme";
import { crowdinLink, discordServerUrl, githubUrl, xTwitterUrl } from "@src/constants";
+import Tracking from "@src/components/Tracking";
import dauntlessBuilderData from "@src/data/Data";
import useDevMode from "@src/hooks/dev-mode";
import useIsMobile from "@src/hooks/is-mobile";
@@ -76,6 +80,7 @@ const Layout: React.FC = ({ children }) => {
{ icon: , link: "/b/finder", text: t("drawer.build-finder") },
{ icon: , link: "/b/meta", text: t("drawer.meta-builds") },
{ icon: , link: "/about", text: t("drawer.about") },
+ { icon: , link: "/privacy", text: t("drawer.privacy") },
{ icon: , link: "/settings", text: t("drawer.settings") },
];
@@ -178,12 +183,13 @@ const Layout: React.FC = ({ children }) => {
))}
+
+ {isMobile ? : }
+
= ({ children }) => {
{children}
+
+
+
);
};
diff --git a/src/components/Tracking.tsx b/src/components/Tracking.tsx
new file mode 100644
index 000000000..c3aa08613
--- /dev/null
+++ b/src/components/Tracking.tsx
@@ -0,0 +1,29 @@
+import { useAppSelector } from "@src/hooks/redux";
+import { selectConfiguration } from "@src/reducers/configuration/configuration-slice";
+import log from "@src/utils/logger";
+import ReactGA from "react-ga4";
+
+const Tracking = () => {
+ const configuration = useAppSelector(selectConfiguration);
+
+ // if user has do not track set, don't do anything
+ if (navigator.doNotTrack !== "1") {
+ return null;
+ }
+
+ // tracking has not been enabled, skip...
+ if (!configuration.tracking.enabled) {
+ return;
+ }
+
+ if (DB_GA4_MEASUREMENT_ID) {
+ ReactGA.initialize(DB_GA4_MEASUREMENT_ID, {
+ testMode: DB_DEVMODE,
+ });
+ log.debug("enabled GA4");
+ }
+
+ return null;
+};
+
+export default Tracking;
diff --git a/src/json/i18n/en/en.json b/src/json/i18n/en/en.json
index 9680622cc..819b14f1e 100644
--- a/src/json/i18n/en/en.json
+++ b/src/json/i18n/en/en.json
@@ -36,6 +36,7 @@
"meta-builds": "$t(pages.metabuilds.title)",
"my-builds": "$t(pages.favorites.title)",
"new-build": "New Build",
+ "privacy": "$t(pages.privacy.title)",
"settings": "$t(pages.settings.title)",
"trials": "$t(pages.trials.title)"
},
@@ -59,8 +60,6 @@
"contributors": "Contributors",
"dependencies": "Dependencies ({{number}})",
"main-text": "Dauntless Builder is free and open source software licensed under the terms of the AGPLv3 license.",
- "privacy": "Privacy",
- "privacy-text": "We are not collecting any data.",
"source-code": "Source Code",
"title": "About",
"translators": "Translators"
@@ -233,6 +232,9 @@
"newbuild": {
"title": "Create a new build"
},
+ "privacy": {
+ "title": "Privacy"
+ },
"settings": {
"community-language": "This language is not officially supported by Dauntless, but members of our community decided to add a translation for Dauntless Builder regardless.",
"data": "Application Data",
diff --git a/src/pages/about/About.tsx b/src/pages/about/About.tsx
index 2106b0ceb..225bc9777 100644
--- a/src/pages/about/About.tsx
+++ b/src/pages/about/About.tsx
@@ -168,15 +168,6 @@ const About: React.FC = () => {
-
- {t("pages.about.privacy")}
-
-
- {t("pages.about.privacy-text")}
-
{
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ Lorem ipsum dolor sit amet
+
+ );
+};
+
+export default Privacy;
diff --git a/vite.config.ts b/vite.config.ts
index f080209e1..48a529b2c 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -22,6 +22,7 @@ export default defineConfig(({ command, mode }) => {
define: {
DB_BUILD_TIME: Date.now(),
DB_DEVMODE: isDevMode,
+ DB_GA4_MEASUREMENT_ID: JSON.stringify(process.env["DB_GA4_MEASUREMENT_ID"]),
},
plugins: [
react({ babel: { plugins: [jotaiDebugLabel, jotaiReactRefresh] } }),
From de486a9a5e91cd7201103c50a5b69ad1de91d205 Mon Sep 17 00:00:00 2001
From: Christopher Kaster
Date: Fri, 13 Oct 2023 23:06:50 +0900
Subject: [PATCH 02/21] add some headlines
---
src/pages/about/Privacy.tsx | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/pages/about/Privacy.tsx b/src/pages/about/Privacy.tsx
index 800e2ebf5..f003f0579 100644
--- a/src/pages/about/Privacy.tsx
+++ b/src/pages/about/Privacy.tsx
@@ -11,6 +11,11 @@ const Privacy: React.FC = () => {
Lorem ipsum dolor sit amet
+
+
+
+
+
);
};
From 3d128db22f3811e975cf3a8fb22dabfb3ba400c9 Mon Sep 17 00:00:00 2001
From: Christopher Kaster
Date: Thu, 19 Oct 2023 21:32:13 +0900
Subject: [PATCH 03/21] move ad space to right side if enough space is
available
---
src/components/AdSpaceFloating.tsx | 44 ++++++++++++++++++++++--------
src/components/BuildMenu.tsx | 5 +++-
src/components/Layout.tsx | 9 ++++--
src/components/Spacer.tsx | 6 ++++
src/hooks/window-size.ts | 15 ++++++++++
5 files changed, 65 insertions(+), 14 deletions(-)
create mode 100644 src/components/Spacer.tsx
create mode 100644 src/hooks/window-size.ts
diff --git a/src/components/AdSpaceFloating.tsx b/src/components/AdSpaceFloating.tsx
index 795f293e2..819cdc48d 100644
--- a/src/components/AdSpaceFloating.tsx
+++ b/src/components/AdSpaceFloating.tsx
@@ -1,27 +1,49 @@
import { Box, useTheme } from "@mui/material";
import AdSpace from "@src/components/AdSpace";
import useIsMobile from "@src/hooks/is-mobile";
+import useWindowSize from "@src/hooks/window-size";
+import React from "react";
+
+export const adSpaceRightSideMinSize = 300;
+export const adSpaceMobileBannerHeight = 96;
const AdSpaceFloating = () => {
- const isMobile = useIsMobile();
const theme = useTheme();
+ const isMobile = useIsMobile();
+ const { width } = useWindowSize();
+
+ const rightSideSpace = (width - theme.breakpoints.values.xl) * 0.5;
+ const rightSideHasEnoughSpace = rightSideSpace > adSpaceRightSideMinSize;
+
+ const baseStyle = {
+ background: theme.palette.background.default,
+ display: "flex",
+ position: "fixed",
+ };
- if (!isMobile) {
+ if (!isMobile && !rightSideHasEnoughSpace) {
return null;
}
- return (
-
+ }
+ : {
+ bottom: 0,
+ right: 0,
+ top: 64,
+ width: `${rightSideSpace - adSpaceRightSideMinSize * 0.5}px`,
+ }),
+ };
+
+ return (
+
);
diff --git a/src/components/BuildMenu.tsx b/src/components/BuildMenu.tsx
index 009887bab..2e47471df 100644
--- a/src/components/BuildMenu.tsx
+++ b/src/components/BuildMenu.tsx
@@ -1,5 +1,6 @@
import { Bookmark, BookmarkBorder, ContentCopy, Undo } from "@mui/icons-material";
import { Fab, IconButton, useTheme } from "@mui/material";
+import { adSpaceMobileBannerHeight } from "@src/components/AdSpaceFloating";
import InputDialog from "@src/components/InputDialog";
import useIsMobile from "@src/hooks/is-mobile";
import { buildModelView, lastSelectedBuildModelView } from "@src/state/build";
@@ -54,6 +55,8 @@ const BuildMenu: React.FC = () => {
setInputDialogOpen(false);
};
+ const adsEnabled = true;
+
return (
<>
{isUserEditedBuild ? null : (
@@ -93,7 +96,7 @@ const BuildMenu: React.FC = () => {
color="primary"
onClick={handleCopyToClipboardClicked}
sx={{
- bottom: theme.spacing(2),
+ bottom: adsEnabled ? `${adSpaceMobileBannerHeight}px` : theme.spacing(2),
position: "fixed",
right: theme.spacing(3),
}}
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
index 597bfb8fc..b1b70a598 100644
--- a/src/components/Layout.tsx
+++ b/src/components/Layout.tsx
@@ -32,9 +32,10 @@ import {
useTheme,
} from "@mui/material";
import AdSpace from "@src/components/AdSpace";
-import AdSpaceFloating from "@src/components/AdSpaceFloating";
+import AdSpaceFloating, { adSpaceRightSideMinSize } from "@src/components/AdSpaceFloating";
import BuildMenu from "@src/components/BuildMenu";
import LinkBox from "@src/components/LinkBox";
+import Spacer from "@src/components/Spacer";
import { drawerWidth } from "@src/components/theme";
import { crowdinLink, discordServerUrl, githubUrl, xTwitterUrl } from "@src/constants";
import Tracking from "@src/components/Tracking";
@@ -43,6 +44,7 @@ import useDevMode from "@src/hooks/dev-mode";
import useIsMobile from "@src/hooks/is-mobile";
import { currentLanguage, getNativeLanguageName, isBetaLanguage, Language } from "@src/i18n";
import { favoritesView } from "@src/state/favorites";
+import useWindowSize from "@src/hooks/window-size";
import log from "@src/utils/logger";
import { useAtomValue } from "jotai";
import React, { ReactNode, useState } from "react";
@@ -64,6 +66,7 @@ const Layout: React.FC = ({ children }) => {
const theme = useTheme();
const isMobile = useIsMobile();
+ const { width } = useWindowSize();
const [open, setOpen] = useState(false);
const { t } = useTranslation();
const devMode = useDevMode();
@@ -84,6 +87,8 @@ const Layout: React.FC = ({ children }) => {
{ icon: , link: "/settings", text: t("drawer.settings") },
];
+ const showLeftSideAdSpace = (width - theme.breakpoints.values.xl) * 0.5 <= adSpaceRightSideMinSize;
+
return (
@@ -184,7 +189,7 @@ const Layout: React.FC = ({ children }) => {
))}
- {isMobile ? : }
+ {isMobile ? : showLeftSideAdSpace ? : }
;
+
+export default React.memo(Spacer);
diff --git a/src/hooks/window-size.ts b/src/hooks/window-size.ts
new file mode 100644
index 000000000..e4a51c7c5
--- /dev/null
+++ b/src/hooks/window-size.ts
@@ -0,0 +1,15 @@
+import { useState } from "react";
+
+const useWindowSize = () => {
+ const [width, setWidth] = useState(window.innerWidth);
+ const [height, setHeight] = useState(window.innerHeight);
+
+ window.addEventListener("resize", () => {
+ setWidth(window.innerWidth);
+ setHeight(window.innerHeight);
+ });
+
+ return { height, width };
+};
+
+export default useWindowSize;
From d29aec84a2bb6e2b5732dacff7401a136e3e2e55 Mon Sep 17 00:00:00 2001
From: Christopher Kaster
Date: Thu, 19 Oct 2023 21:44:38 +0900
Subject: [PATCH 04/21] add new icon, add global var to disable ads
---
src/@types/globals.d.ts | 1 +
src/components/AdSpace.tsx | 4 ++++
src/components/AdSpaceFloating.tsx | 4 ++++
src/components/BuildMenu.tsx | 4 +---
src/components/Layout.tsx | 2 +-
vite.config.ts | 1 +
6 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/@types/globals.d.ts b/src/@types/globals.d.ts
index 251e164ba..081b31259 100644
--- a/src/@types/globals.d.ts
+++ b/src/@types/globals.d.ts
@@ -1,3 +1,4 @@
declare const DB_BUILD_TIME: number;
declare const DB_DEVMODE: boolean;
declare const DB_GA4_MEASUREMENT_ID: string;
+declare const DB_ENABLE_ADS: string;
diff --git a/src/components/AdSpace.tsx b/src/components/AdSpace.tsx
index 843edd80e..51c7dd04a 100644
--- a/src/components/AdSpace.tsx
+++ b/src/components/AdSpace.tsx
@@ -4,6 +4,10 @@ import { Box, useTheme } from "@mui/material";
const AdSpace = () => {
const theme = useTheme();
+ if (!DB_ENABLE_ADS) {
+ return null;
+ }
+
if (DB_DEVMODE) {
return (
{
const isMobile = useIsMobile();
const { width } = useWindowSize();
+ if (!DB_ENABLE_ADS) {
+ return null;
+ }
+
const rightSideSpace = (width - theme.breakpoints.values.xl) * 0.5;
const rightSideHasEnoughSpace = rightSideSpace > adSpaceRightSideMinSize;
diff --git a/src/components/BuildMenu.tsx b/src/components/BuildMenu.tsx
index 2e47471df..692d2a3f9 100644
--- a/src/components/BuildMenu.tsx
+++ b/src/components/BuildMenu.tsx
@@ -55,8 +55,6 @@ const BuildMenu: React.FC = () => {
setInputDialogOpen(false);
};
- const adsEnabled = true;
-
return (
<>
{isUserEditedBuild ? null : (
@@ -96,7 +94,7 @@ const BuildMenu: React.FC = () => {
color="primary"
onClick={handleCopyToClipboardClicked}
sx={{
- bottom: adsEnabled ? `${adSpaceMobileBannerHeight}px` : theme.spacing(2),
+ bottom: DB_ENABLE_ADS ? `${adSpaceMobileBannerHeight}px` : theme.spacing(2),
position: "fixed",
right: theme.spacing(3),
}}
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
index b1b70a598..a3618d5cc 100644
--- a/src/components/Layout.tsx
+++ b/src/components/Layout.tsx
@@ -87,7 +87,7 @@ const Layout: React.FC = ({ children }) => {
{ icon: , link: "/settings", text: t("drawer.settings") },
];
- const showLeftSideAdSpace = (width - theme.breakpoints.values.xl) * 0.5 <= adSpaceRightSideMinSize;
+ const showLeftSideAdSpace = DB_ENABLE_ADS && (width - theme.breakpoints.values.xl) * 0.5 <= adSpaceRightSideMinSize;
return (
diff --git a/vite.config.ts b/vite.config.ts
index 48a529b2c..168ae92ca 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -22,6 +22,7 @@ export default defineConfig(({ command, mode }) => {
define: {
DB_BUILD_TIME: Date.now(),
DB_DEVMODE: isDevMode,
+ DB_ENABLE_ADS: process.env["DB_ENABLE_ADS"] === "true",
DB_GA4_MEASUREMENT_ID: JSON.stringify(process.env["DB_GA4_MEASUREMENT_ID"]),
},
plugins: [
From 1f1838f470e2b21b27d2c24cdc9072932166bc38 Mon Sep 17 00:00:00 2001
From: Christopher Kaster
Date: Thu, 19 Oct 2023 23:47:48 +0900
Subject: [PATCH 05/21] add privacy policy
---
src/json/i18n/en/en.json | 4 +-
src/pages/about/Privacy.tsx | 30 ++++--
src/pages/about/privacy.html | 193 +++++++++++++++++++++++++++++++++++
3 files changed, 219 insertions(+), 8 deletions(-)
create mode 100644 src/pages/about/privacy.html
diff --git a/src/json/i18n/en/en.json b/src/json/i18n/en/en.json
index 819b14f1e..6e229389b 100644
--- a/src/json/i18n/en/en.json
+++ b/src/json/i18n/en/en.json
@@ -45,6 +45,7 @@
"dauntless-version": "Dauntless v{{version}}",
"discord-server": "Dauntless Builder Discord Server",
"github-repository": "Github Repository",
+ "only-english": "This part is only available in English.",
"patch-url": "https://playdauntless.com/patch-notes/{{version}}",
"something-went-wrong": "Something went wrong! Please send the error log below to me in our Discord and try to reload the website. Thank you very much!",
"x-twitter": "Dauntless Builder on X.com"
@@ -233,7 +234,8 @@
"title": "Create a new build"
},
"privacy": {
- "title": "Privacy"
+ "title": "Privacy",
+ "title-alt": "Privacy Policy for Dauntless Builder"
},
"settings": {
"community-language": "This language is not officially supported by Dauntless, but members of our community decided to add a translation for Dauntless Builder regardless.",
diff --git a/src/pages/about/Privacy.tsx b/src/pages/about/Privacy.tsx
index f003f0579..e75aaca69 100644
--- a/src/pages/about/Privacy.tsx
+++ b/src/pages/about/Privacy.tsx
@@ -1,21 +1,37 @@
-import { Box, Typography } from "@mui/material";
+import { Warning } from "@mui/icons-material";
+import { Alert, Box, useTheme } from "@mui/material";
+import { styled } from "@mui/material/styles";
import PageTitle from "@src/components/PageTitle";
import React from "react";
import { useTranslation } from "react-i18next";
+import privacyContent from "./privacy.html?raw";
+
const Privacy: React.FC = () => {
const { t } = useTranslation();
+ const theme = useTheme();
+
+ const PrivacyPoliczWrapper = styled("div")`
+ a {
+ color: ${theme.palette.primary.main};
+ text-decoration: none;
+ }
+ `;
return (
-
+
- Lorem ipsum dolor sit amet
+ }
+ >
+ {t("misc.only-english")}
+
-
-
-
-
+
+
+
);
};
diff --git a/src/pages/about/privacy.html b/src/pages/about/privacy.html
new file mode 100644
index 000000000..805e90ec2
--- /dev/null
+++ b/src/pages/about/privacy.html
@@ -0,0 +1,193 @@
+
+ At Dauntless Builder, accessible from https://www.dauntless-builder.com, one of our main priorities is the privacy
+ of our visitors. This Privacy Policy document contains types of information that is collected and recorded by
+ Dauntless Builder and how we use it.
+
+
+
+ If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact
+ us.
+
+
+
+ This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to
+ the information that they shared and/or collect in Dauntless Builder. This policy is not applicable to any
+ information collected offline or via channels other than this website.
+
+
+
Consent
+
+
By using our website, you hereby consent to our Privacy Policy and agree to its terms.
+
+
Information we collect
+
+
+ The personal information that you are asked to provide, and the reasons why you are asked to provide it, will be
+ made clear to you at the point we ask you to provide your personal information.
+
+
+ If you contact us directly, we may receive additional information about you such as your name, email address, phone
+ number, the contents of the message and/or attachments you may send us, and any other information you may choose to
+ provide.
+
+
+ When you register for an Account, we may ask for your contact information, including items such as name, company
+ name, address, email address, and telephone number.
+
+
+
How we use your information
+
+
We use the information we collect in various ways, including to:
+
+
+
Provide, operate, and maintain our website
+
Improve, personalize, and expand our website
+
Understand and analyze how you use our website
+
Develop new products, services, features, and functionality
+
+ Communicate with you, either directly or through one of our partners, including for customer service, to provide
+ you with updates and other information relating to the website, and for marketing and promotional purposes
+
+
Send you emails
+
Find and prevent fraud
+
+
+
Log Files
+
+
+ Dauntless Builder follows a standard procedure of using log files. These files log visitors when they visit
+ websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log
+ files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp,
+ referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally
+ identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users'
+ movement on the website, and gathering demographic information.
+
+
+
Cookies and Web Beacons
+
+
+ Like any other website, Dauntless Builder uses "cookies". These cookies are used to store information including
+ visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to
+ optimize the users' experience by customizing our web page content based on visitors' browser type and/or other
+ information.
+
+
+
Our Advertising Partners
+
+
+ Some of advertisers on our site may use cookies and web beacons. Our advertising partners are listed below. Each of
+ our advertising partners has their own Privacy Policy for their policies on user data. For easier access, we
+ hyperlinked to their Privacy Policies below.
+
You may consult this list to find the Privacy Policy for each of the advertising partners of Dauntless Builder.
+
+
+ Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in
+ their respective advertisements and links that appear on Dauntless Builder, which are sent directly to users'
+ browser. They automatically receive your IP address when this occurs. These technologies are used to measure the
+ effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites
+ that you visit.
+
+
+
+ Note that Dauntless Builder has no access to or control over these cookies that are used by third-party advertisers.
+
+
+
Third Party Privacy Policies
+
+
+ Dauntless Builder's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to
+ consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may
+ include their practices and instructions about how to opt-out of certain options.
+
+
+
+ You can choose to disable cookies through your individual browser options. To know more detailed information about
+ cookie management with specific web browsers, it can be found at the browsers' respective websites.
+
+
+
CCPA Privacy Rights (Do Not Sell My Personal Information)
+
+
Under the CCPA, among other rights, California consumers have the right to:
+
+ Request that a business that collects a consumer's personal data disclose the categories and specific pieces of
+ personal data that a business has collected about consumers.
+
+
Request that a business delete any personal data about the consumer that a business has collected.
+
Request that a business that sells a consumer's personal data, not sell the consumer's personal data.
+
+ If you make a request, we have one month to respond to you. If you would like to exercise any of these rights,
+ please contact us.
+
+
+
GDPR Data Protection Rights
+
+
+ We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the
+ following:
+
+
+ The right to access – You have the right to request copies of your personal data. We may charge you a small fee for
+ this service.
+
+
+ The right to rectification – You have the right to request that we correct any information you believe is
+ inaccurate. You also have the right to request that we complete the information you believe is incomplete.
+
+
The right to erasure – You have the right to request that we erase your personal data, under certain conditions.
+
+ The right to restrict processing – You have the right to request that we restrict the processing of your personal
+ data, under certain conditions.
+
+
+ The right to object to processing – You have the right to object to our processing of your personal data, under
+ certain conditions.
+
+
+ The right to data portability – You have the right to request that we transfer the data that we have collected to
+ another organization, or directly to you, under certain conditions.
+
+
+ If you make a request, we have one month to respond to you. If you would like to exercise any of these rights,
+ please contact us.
+
+
+
Children's Information
+
+
+ Another part of our priority is adding protection for children while using the internet. We encourage parents and
+ guardians to observe, participate in, and/or monitor and guide their online activity.
+
+
+
+ Dauntless Builder does not knowingly collect any Personal Identifiable Information from children under the age of
+ 13. If you think that your child provided this kind of information on our website, we strongly encourage you to
+ contact us immediately and we will do our best efforts to promptly remove such information from our records.
+
+
+
Changes to This Privacy Policy
+
+
+ We may update our Privacy Policy from time to time. Thus, we advise you to review this page periodically for any
+ changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are
+ effective immediately, after they are posted on this page.
+
All or partial advertising on this Website or App is managed by Playwire LLC. If Playwire publisher advertising
+ services are used, Playwire LLC may collect and use certain aggregated and anonymized data for advertising purposes.
+ To learn more about the types of data collected, how data is used and your choices as a user, please visit https://www.playwire.com/privacy-policy.
+
For EU Users only: If you are located in countries that are part of the European Economic Area, in
+ the United Kingdom or Switzerland, and publisher advertising services are being provided by Playwire LLC, you were
+ presented with messaging from our Consent Management Platform (CMP) around your privacy choices as a user in regards
+ to digital advertising, applicable vendors, cookie usage and more. If you’d like to revisit the choices you have
+ made previously on this Website or App, please click here.
+
+
Advertising Partners Privacy Policies
You may consult this list to find the Privacy Policy for each of the advertising partners of Dauntless Builder.
All or partial advertising on this Website or App is managed by Playwire LLC. If Playwire publisher advertising
+
+ All or partial advertising on this Website or App is managed by Playwire LLC. If Playwire publisher advertising
services are used, Playwire LLC may collect and use certain aggregated and anonymized data for advertising purposes.
- To learn more about the types of data collected, how data is used and your choices as a user, please visit https://www.playwire.com/privacy-policy.
-
For EU Users only: If you are located in countries that are part of the European Economic Area, in
+ To learn more about the types of data collected, how data is used and your choices as a user, please visit
+ https://www.playwire.com/privacy-policy.
+
+
+ For EU Users only: If you are located in countries that are part of the European Economic Area, in
the United Kingdom or Switzerland, and publisher advertising services are being provided by Playwire LLC, you were
presented with messaging from our Consent Management Platform (CMP) around your privacy choices as a user in regards
to digital advertising, applicable vendors, cookie usage and more. If you’d like to revisit the choices you have
- made previously on this Website or App, please click here.
-
+ made previously on this Website or App, please
+ click here.
+