added legal information

main
alex 2023-08-15 18:18:34 +00:00
parent 5c8a07ffcb
commit 01c178593d
15 changed files with 1150 additions and 378 deletions

28
App.js
View File

@ -25,10 +25,6 @@ import ChooseSceneModalContent from "./src/Screens/Device/modals/ChooseScene";
import CreateSceneModalContent from "./src/Screens/Device/modals/ChooseScene/CreateScene"; import CreateSceneModalContent from "./src/Screens/Device/modals/ChooseScene/CreateScene";
import AddSceneActionModalContent from "./src/Screens/Device/modals/AddSceneAction"; import AddSceneActionModalContent from "./src/Screens/Device/modals/AddSceneAction";
import LayerSelectionModalContent from "./src/Screens/Device/modals/AddSceneAction/LayerSelection"; import LayerSelectionModalContent from "./src/Screens/Device/modals/AddSceneAction/LayerSelection";
import {
SettingsAppColorSchemeModalContent,
SettingsAppLanguageModalContent,
} from "./src/Screens/Settings";
import UpdateSceneNameModalContent from "./src/Screens/Device/modals/UpdateSceneName"; import UpdateSceneNameModalContent from "./src/Screens/Device/modals/UpdateSceneName";
import SettingsChangeDeviceDisplayNameModalContent from "./src/Screens/Device/modals/SettingsChangeDeviceDisplayName"; import SettingsChangeDeviceDisplayNameModalContent from "./src/Screens/Device/modals/SettingsChangeDeviceDisplayName";
import LightsEditActionModalContent, { import LightsEditActionModalContent, {
@ -45,6 +41,9 @@ import HelpCenterModalContent from "./src/Screens/Help/modals/HelpCenter";
import { FeedbackStepsModalContent } from "./src/Screens/Help/modals/Feedback/steps"; import { FeedbackStepsModalContent } from "./src/Screens/Help/modals/Feedback/steps";
import GiveFeedbackModalContent from "./src/Screens/Help/modals/Feedback"; import GiveFeedbackModalContent from "./src/Screens/Help/modals/Feedback";
import FeedbackFinishedModalContent from "./src/Screens/Help/modals/Feedback/finished"; import FeedbackFinishedModalContent from "./src/Screens/Help/modals/Feedback/finished";
import SettingsAppColorSchemeModalContent from "./src/Screens/Settings/modals/appColorScheme";
import SettingsAppLanguageModalContent from "./src/Screens/Settings/modals/appLanguage";
import OpenSourceLicensesModalContent from "./src/Screens/Settings/modals/openSourceLicences";
const Drawer = createDrawerNavigator(); const Drawer = createDrawerNavigator();
const Stack = createStackNavigator(); const Stack = createStackNavigator();
@ -332,7 +331,9 @@ export function MyApp() {
options={({ navigation }) => options={({ navigation }) =>
options({ options({
navigation: navigation, navigation: navigation,
pageTitle: t("screens.settings.appColorSchemeModalTitle"), pageTitle: t(
"screens.settings.cardGeneral.modalAppColorSchemePicker.pageTitle"
),
}) })
} }
/> />
@ -343,7 +344,22 @@ export function MyApp() {
options={({ navigation }) => options={({ navigation }) =>
options({ options({
navigation: navigation, navigation: navigation,
pageTitle: t("screens.settings.languageModalTitle"), pageTitle: t(
"screens.settings.cardGeneral.modalLanguagePageTitle"
),
})
}
/>
<Stack.Screen
name="modalOpenSourceLicences"
component={OpenSourceLicensesModalContent}
options={({ navigation }) =>
options({
navigation: navigation,
pageTitle: t(
"screens.settings.modalOpenSourceLicences.pageTitle"
),
}) })
} }
/> />

View File

@ -230,18 +230,29 @@
}, },
"settings": { "settings": {
"pageTitle": "Einstellungen", "pageTitle": "Einstellungen",
"settingsCardTitle": "Allgemein", "cardGeneral": {
"languageText": "Sprache", "cardTitle": "Allgemein",
"languageModalTitle": "Sprache ändern", "languageText": "Sprache",
"appColorSchemeText": "Anzeigemodus", "modalLanguagePageTitle": "Sprache ändern",
"appColorSchemeModalTitle": "Anzeigemodus ändern", "appColorSchemeText": "Anzeigemodus",
"appColorSchemePicker": { "modalAppColorSchemePicker": {
"auto": "System Standard", "pageTitle": "Anzeigemodus ändern",
"dark": "Dunkel", "auto": "System Standard",
"light": "Hell" "dark": "Dunkel",
"light": "Hell"
},
"expertModeTitle": "Experten Modus",
"expertModeDescription": "Durch das Einschalten werden zusätzliche Funktionen in der App freigeschaltet, wie beispielsweise die Möglichkeit, benutzerdefinierte Farbcodes anzugeben."
}, },
"expertModeTitle": "Experten Modus", "cardLegalInformation": {
"expertModeDescription": "Durch das Einschalten werden zusätzliche Funktionen in der App freigeschaltet, wie beispielsweise die Möglichkeit, benutzerdefinierte Farbcodes anzugeben." "cardTitle": "Rechtliche Informationen",
"openSourceLicences": "Open Source Lizenzen",
"termsOfService": "Nutzungsbedingungen",
"privacyPolicy": "Datenschutzerklärung"
},
"modalOpenSourceLicences": {
"pageTitle": "Open Source Lizenzen"
}
}, },
"modalSearchForNewDevices": { "modalSearchForNewDevices": {
"pageTitle": "Suche nach Geräten", "pageTitle": "Suche nach Geräten",

View File

@ -224,18 +224,29 @@
}, },
"settings": { "settings": {
"pageTitle": "Settings", "pageTitle": "Settings",
"settingsCardTitle": "General", "cardGeneral": {
"languageText": "Language", "cardTitle": "General",
"languageModalTitle": "Customize language", "languageText": "Language",
"appColorSchemeText": "Appearance", "modalLanguagePageTitle": "Customize language",
"appColorSchemeModalTitle": "Customize appearance", "appColorSchemeText": "Appearance",
"appColorSchemePicker": { "modalAppColorSchemePicker": {
"auto": "System default", "pageTitle": "Customize appearance",
"dark": "Dark", "auto": "System default",
"light": "Light" "dark": "Dark",
"light": "Light"
},
"expertModeTitle": "Expert mode",
"expertModeDescription": "Turning it on unlocks additional features in the app, such as the ability to specify custom color codes."
}, },
"expertModeTitle": "Expert mode", "cardLegalInformation": {
"expertModeDescription": "Turning it on unlocks additional features in the app, such as the ability to specify custom color codes." "cardTitle": "Legal information",
"openSourceLicences": "Open-source licenses",
"termsOfService": "Terms of service",
"privacyPolicy": "Privacy policy"
},
"modalOpenSourceLicences": {
"pageTitle": "Open-source licenses"
}
}, },
"modalSearchForNewDevices": { "modalSearchForNewDevices": {
"pageTitle": "Search for devices", "pageTitle": "Search for devices",

View File

@ -15,6 +15,7 @@ export function AccordionItem({
appContext, appContext,
title, title,
description, description,
customDescriptionComponent,
cardTopicText, cardTopicText,
disablePaddingBottom, disablePaddingBottom,
}) { }) {
@ -54,7 +55,10 @@ export function AccordionItem({
cardTopicText={cardTopicText} cardTopicText={cardTopicText}
disablePaddingBottom={disablePaddingBottom} disablePaddingBottom={disablePaddingBottom}
> >
<TouchableOpacity activeOpacity={0.7} onPress={toggleExpanded}> <TouchableOpacity
activeOpacity={appContext.appTheme.touchableOpacity.activeOpacity}
onPress={toggleExpanded}
>
<View <View
style={{ style={{
flexDirection: "row", flexDirection: "row",
@ -80,7 +84,7 @@ export function AccordionItem({
</View> </View>
</TouchableOpacity> </TouchableOpacity>
<Animated.View style={[{ overflow: "hidden", marginTop: 6 }, bodyHeight]}> <Animated.View style={[{ overflow: "hidden" }, bodyHeight]}>
<View <View
style={{ style={{
position: "absolute", position: "absolute",
@ -91,14 +95,20 @@ export function AccordionItem({
setBodySectionHeight(event.nativeEvent.layout.height) setBodySectionHeight(event.nativeEvent.layout.height)
} }
> >
<Text <View style={{ marginTop: 10 }}>
style={[ {customDescriptionComponent ? (
{ color: appContext.appTheme.textSecondary }, customDescriptionComponent
AppStyles.typography14, ) : (
]} <Text
> style={[
{description} { color: appContext.appTheme.textSecondary },
</Text> AppStyles.typography14,
]}
>
{description}
</Text>
)}
</View>
</View> </View>
</Animated.View> </Animated.View>
</Card> </Card>

View File

@ -10,6 +10,8 @@ export default function Card({
cardTopicText, cardTopicText,
cardBackgroundColor, cardBackgroundColor,
disablePaddingBottom, disablePaddingBottom,
contentPaddingTop,
contentPaddingBottom,
}) { }) {
const appContext = useContext(AppContext); const appContext = useContext(AppContext);
@ -44,7 +46,12 @@ export default function Card({
style={[ style={[
{ {
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
padding: 20, paddingLeft: 20,
paddingRight: 20,
paddingTop:
contentPaddingTop === undefined ? 20 : contentPaddingTop,
paddingBottom:
contentPaddingBottom === undefined ? 20 : contentPaddingBottom,
}, },
AppStyles.Shadow, AppStyles.Shadow,
AppStyles.card, AppStyles.card,

View File

@ -1,22 +1,10 @@
import { useContext, useRef, useState } from "react"; import { useContext } from "react";
import { import { StyleSheet, TouchableHighlight, View } from "react-native";
Pressable, import Animated, { useSharedValue } from "react-native-reanimated";
StyleSheet,
TouchableHighlight,
TouchableOpacity,
View,
} from "react-native";
import Animated, {
useAnimatedStyle,
useSharedValue,
} from "react-native-reanimated";
import ColorPicker, { import ColorPicker, {
BrightnessSlider,
InputWidget, InputWidget,
OpacitySlider, OpacitySlider,
Panel3, Panel3,
Swatches,
ColorPickerRef,
} from "reanimated-color-picker"; } from "reanimated-color-picker";
import MyIcon from "../Icon"; import MyIcon from "../Icon";
import { AppContext, AppStyles, VibrateShort } from "../../utils"; import { AppContext, AppStyles, VibrateShort } from "../../utils";

View File

@ -150,7 +150,7 @@ export default function LightsEditActionModalContent({ navigation, route }) {
<ScrollView> <ScrollView>
<Card disablePaddingBottom> <Card disablePaddingBottom>
<MyDropdown <MyDropdown
style={{ marginBottom: 2 }} style={{ marginBottom: 4 }}
label={t( label={t(
"screens.device.scenes.editActions.modalLightsEditAction.dropdownColorModeSelection.label" "screens.device.scenes.editActions.modalLightsEditAction.dropdownColorModeSelection.label"
)} )}
@ -173,31 +173,19 @@ export default function LightsEditActionModalContent({ navigation, route }) {
<> <>
{lightModeDefaultColors.length > 0 && ( {lightModeDefaultColors.length > 0 && (
<> <>
<View <Text
style={{ style={[
flexDirection: "row", AppStyles.typography14,
justifyContent: "space-between", {
alignItems: "center", marginBottom: 4,
marginTop: 2, color: appContext.appTheme.text,
}} },
]}
> >
<Text {t(
style={[ "screens.device.scenes.editActions.modalLightsEditAction.modeSpecificColors"
AppStyles.typography14, )}
{ </Text>
marginTop: 4,
marginBottom: 4,
color: appContext.appTheme.text,
},
]}
>
{t(
"screens.device.scenes.editActions.modalLightsEditAction.modeSpecificColors"
)}
</Text>
<MyIconButton iconName="restore" iconSize={24} />
</View>
<View <View
style={{ style={{

View File

@ -1,6 +1,6 @@
import { useContext } from "react"; import { useContext } from "react";
import { AppContext, AppStyles, Constants } from "../../utils"; import { AppContext, AppStyles, Constants, OpenUrl } from "../../utils";
import { Linking, Text, View } from "react-native"; import { Text, View } from "react-native";
import MyIcon from "../../Components/Icon"; import MyIcon from "../../Components/Icon";
import { MyPickerModalListItem } from "../../Components/Modal"; import { MyPickerModalListItem } from "../../Components/Modal";
import { MyTextButton } from "../../Components/Button"; import { MyTextButton } from "../../Components/Button";
@ -48,7 +48,7 @@ export default function HelpScreen({ navigation }) {
actionColor actionColor
textSelectable textSelectable
onPress={() => onPress={() =>
Linking.openURL(`mailto:${Constants.globals.contact_us_email}`) OpenUrl(`mailto:${Constants.globals.contact_us_email}`)
} }
/> />
</View> </View>

View File

@ -138,7 +138,7 @@ export function FeedbackStepsModalContent({ navigation }) {
? appContext.appTheme.colors.primary ? appContext.appTheme.colors.primary
: appContext.appTheme.colors.gray : appContext.appTheme.colors.gray
} }
activeOpacity={0.7} activeOpacity={appContext.appTheme.touchableOpacity.activeOpacity}
/> />
); );
} }

View File

@ -4,153 +4,22 @@ import {
AppContext, AppContext,
AppStyles, AppStyles,
Constants, Constants,
HelpCenterDeQuestionsAnswers,
HelpCenterEnQuestionsAnswers,
ModalContainer, ModalContainer,
} from "../../../../utils"; } from "../../../../utils";
import { useContext } from "react"; import { useContext } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { InfoHeader } from "../.."; import { InfoHeader } from "../..";
const helpDataDe = [
{
topicText: "Allgemeine Fragen",
question:
"Was ist die grundlegende Funktionalität der Handy-App zur Gerätesteuerung?",
answer:
"Die Handy-App ermöglicht es Ihnen, kompatible Geräte über Ihr Smartphone oder Tablet zu steuern. Sie können verschiedene Funktionen aktivieren, Einstellungen ändern und Aktionen aus der Ferne ausführen.",
},
{
question: "Welche Arten von Geräten können über die App gesteuert werden?",
answer:
"Unsere App unterstützt eine Vielzahl von Geräten, darunter Smart-Home-Geräte, Unterhaltungselektronik, Haushaltsgeräte und mehr.",
},
{
question: "Ist die App für Android- und iOS-Geräte verfügbar?",
answer:
"Ja, die App ist sowohl für Android- als auch für iOS-Geräte verfügbar. Sie können sie im Google Play Store bzw. im Apple App Store herunterladen.",
},
{
question: "Wo kann ich die App herunterladen?",
answer:
"Sie können die App direkt aus dem Google Play Store (für Android) oder dem Apple App Store (für iOS) herunterladen und installieren.",
},
{
question:
"Benötige ich eine Internetverbindung, um das Gerät über die App zu steuern?",
answer:
"Ja, eine aktive Internetverbindung (Wi-Fi oder mobile Daten) ist erforderlich, um die App mit dem Gerät zu verbinden und die Steuerungsfunktionen zu nutzen.",
},
{
question: "Unterstützt die App mehrere Geräte gleichzeitig?",
answer:
"Ja, die App ermöglicht es Ihnen, mehrere kompatible Geräte gleichzeitig zu steuern und zwischen ihnen zu wechseln.",
},
{
topicText: "Einrichtung und Verbindung",
question:
"Wie richte ich die Verbindung zwischen der App und meinem Gerät ein?",
answer:
"Die genaue Einrichtung kann je nach Gerät variieren, aber normalerweise müssen Sie die App öffnen, das Gerät auswählen und den Anweisungen auf dem Bildschirm folgen, um die Verbindung herzustellen.",
},
{
question:
"Welche Schritte sind erforderlich, um das Gerät zum ersten Mal mit der App zu verbinden?",
answer:
"Starten Sie die App, erstellen Sie ein Konto (falls erforderlich), fügen Sie das Gerät hinzu, indem Sie es aus der Liste der verfügbaren Geräte auswählen, und folgen Sie den Anweisungen zur Verbindungsherstellung.",
},
{
question:
"Benötige ich spezielle Einstellungen am Gerät, um die Verbindung herzustellen?",
answer:
"Ja, in den meisten Fällen müssen Sie sicherstellen, dass das Gerät eingeschaltet und im Verbindungsmodus ist, bevor Sie versuchen, es über die App zu verbinden.",
},
{
question:
"Welche Arten von Verbindungsmethoden werden von der App unterstützt (z. B. Bluetooth, WLAN, etc.)?",
answer:
"Unsere App unterstützt in der Regel WLAN-Verbindungen, um eine stabile und zuverlässige Steuerung über größere Entfernungen zu ermöglichen.",
},
{
question:
"Was sollte ich tun, wenn die Verbindung zwischen der App und dem Gerät verloren geht?",
answer:
"Überprüfen Sie zuerst Ihre Internetverbindung. Wenn das Problem weiterhin besteht, können Sie versuchen, das Gerät aus der App zu entfernen und erneut hinzuzufügen. Gegebenenfalls kann ein Neustart des Geräts helfen.",
},
];
const helpDataEn = [
{
topicText: "General Questions",
question:
"What is the basic functionality of the mobile app for device control?",
answer:
"The mobile app allows you to control compatible devices using your smartphone or tablet. You can activate various functions, change settings, and perform actions remotely.",
},
{
question: "What types of devices can be controlled through the app?",
answer:
"Our app supports a variety of devices, including smart home devices, entertainment electronics, household appliances, and more.",
},
{
question: "Is the app available for both Android and iOS devices?",
answer:
"Yes, the app is available for both Android and iOS devices. You can download it from the Google Play Store or the Apple App Store.",
},
{
question: "Where can I download the app?",
answer:
"You can download and install the app directly from the Google Play Store (for Android) or the Apple App Store (for iOS).",
},
{
question:
"Do I need an internet connection to control the device through the app?",
answer:
"Yes, an active internet connection (Wi-Fi or mobile data) is required to connect the app to the device and use the control functions.",
},
{
question: "Does the app support multiple devices simultaneously?",
answer:
"Yes, the app allows you to control multiple compatible devices simultaneously and switch between them.",
},
{
topicText: "Setup and Connection",
question: "How do I set up the connection between the app and my device?",
answer:
"The exact setup process may vary depending on the device, but typically, you need to open the app, select the device, and follow the on-screen instructions to establish the connection.",
},
{
question:
"What steps are required to initially connect the device to the app?",
answer:
"Launch the app, create an account (if required), add the device by selecting it from the list of available devices, and follow the instructions for establishing the connection.",
},
{
question:
"Do I need specific settings on the device to establish the connection?",
answer:
"Yes, in most cases, you need to ensure that the device is powered on and in pairing mode before attempting to connect it through the app.",
},
{
question:
"What types of connection methods are supported by the app (e.g., Bluetooth, Wi-Fi, etc.)?",
answer:
"Our app typically supports Wi-Fi connections to enable stable and reliable control over longer distances.",
},
{
question:
"What should I do if the connection between the app and the device is lost?",
answer:
"First, check your internet connection. If the issue persists, you can try removing and re-adding the device from the app. If necessary, restarting the device might help.",
},
];
export default function HelpCenterModalContent() { export default function HelpCenterModalContent() {
const appContext = useContext(AppContext); const appContext = useContext(AppContext);
const { t } = useTranslation(); const { t } = useTranslation();
const helpData = const helpData =
appContext.appLanguage === Constants.defaultLanguage appContext.appLanguage === Constants.defaultLanguage
? helpDataDe ? HelpCenterDeQuestionsAnswers
: helpDataEn; : HelpCenterEnQuestionsAnswers;
return ( return (
<ModalContainer withoutPadding> <ModalContainer withoutPadding>

View File

@ -1,11 +1,11 @@
import { useContext } from "react"; import { useContext } from "react";
import { FlatList, Text, TouchableOpacity, View } from "react-native"; import { Alert, Text, TouchableOpacity, View } from "react-native";
import Card from "../../Components/Card"; import Card from "../../Components/Card";
import { AppContext, AppStyles, Constants, ModalContainer } from "../../utils"; import { AppContext, AppStyles, Constants } from "../../utils";
import { Divider } from "../../Components/Divider"; import { Divider } from "../../Components/Divider";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import MySwitch from "../../Components/Switch"; import MySwitch from "../../Components/Switch";
import { MyPickerModalListItem } from "../../Components/Modal"; import MyIcon from "../../Components/Icon";
export default function SettingsScreen({ navigation }) { export default function SettingsScreen({ navigation }) {
const appContext = useContext(AppContext); const appContext = useContext(AppContext);
@ -18,27 +18,16 @@ export default function SettingsScreen({ navigation }) {
backgroundColor: appContext.appTheme.backgroundColor, backgroundColor: appContext.appTheme.backgroundColor,
}} }}
> >
<Card cardTopicText={t("screens.settings.settingsCardTitle")}> <Card
<TouchableOpacity cardTopicText={t("screens.settings.cardGeneral.cardTitle")}
contentPaddingTop={10}
contentPaddingBottom={10}
>
<SettingComponent
appContext={appContext}
text={t("screens.settings.cardGeneral.languageText")}
onPress={() => navigation.navigate("modalSettingsAppLanguage")} onPress={() => navigation.navigate("modalSettingsAppLanguage")}
style={{ marginBottom: 6 }} rightComponent={
>
<View
style={{
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
paddingBottom: 4,
}}
>
<Text
style={[
AppStyles.typography14,
{ color: appContext.appTheme.text },
]}
>
{t("screens.settings.languageText")}
</Text>
<Text style={{ color: appContext.appTheme.colors.primary }}> <Text style={{ color: appContext.appTheme.colors.primary }}>
{ {
Constants.languages.find( Constants.languages.find(
@ -46,154 +35,200 @@ export default function SettingsScreen({ navigation }) {
).label ).label
} }
</Text> </Text>
</View> }
</TouchableOpacity> />
<TouchableOpacity <Divider withoutMarginVertical style={{ marginVertical: 2 }} />
<SettingComponent
appContext={appContext}
text={t("screens.settings.cardGeneral.appColorSchemeText")}
onPress={() => navigation.navigate("modalSettingsAppColorScheme")} onPress={() => navigation.navigate("modalSettingsAppColorScheme")}
> rightComponent={
<View
style={{
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
paddingTop: 4,
paddingBottom: 4,
}}
>
<Text
style={[
AppStyles.typography14,
{ color: appContext.appTheme.text },
]}
>
{t("screens.settings.appColorSchemeText")}
</Text>
<Text style={{ color: appContext.appTheme.colors.primary }}> <Text style={{ color: appContext.appTheme.colors.primary }}>
{appContext.appColorScheme === "auto" {appContext.appColorScheme === "auto"
? t("screens.settings.appColorSchemePicker.auto") ? t(
"screens.settings.cardGeneral.modalAppColorSchemePicker.auto"
)
: appContext.appColorScheme === "dark" : appContext.appColorScheme === "dark"
? t("screens.settings.appColorSchemePicker.dark") ? t(
: t("screens.settings.appColorSchemePicker.light")} "screens.settings.cardGeneral.modalAppColorSchemePicker.dark"
)
: t(
"screens.settings.cardGeneral.modalAppColorSchemePicker.light"
)}
</Text> </Text>
</View> }
</TouchableOpacity> />
<Divider /> <Divider withoutMarginVertical style={{ marginVertical: 2 }} />
<View
style={{ <SettingComponent
flexDirection: "row", appContext={appContext}
alignItems: "center", title={t("screens.settings.cardGeneral.expertModeTitle")}
justifyContent: "space-between", description={t("screens.settings.cardGeneral.expertModeDescription")}
}} textContainerStyle={{ width: "80%" }}
> rightComponent={
<View style={{ width: "80%" }}> <MySwitch
<Text value={appContext.isUserExpertModeEnabled}
style={[ onValueChange={(e) => appContext.setIsUserExpertModeEnabled(e)}
AppStyles.typography16, />
{ color: appContext.appTheme.text }, }
]} />
>
{t("screens.settings.expertModeTitle")}
</Text>
<Text
style={[
AppStyles.typography14,
{ color: appContext.appTheme.textSecondary },
]}
>
{t("screens.settings.expertModeDescription")}
</Text>
</View>
<MySwitch
value={appContext.isUserExpertModeEnabled}
onValueChange={(e) => appContext.setIsUserExpertModeEnabled(e)}
/>
</View>
</Card> </Card>
<Card> <Card contentPaddingTop={10} contentPaddingBottom={10}>
<View <SettingComponent
style={{ appContext={appContext}
flexDirection: "row", text="Developer Mode"
alignItems: "center", rightComponent={
justifyContent: "space-between", <MySwitch
value={appContext.isUserDeveloperModeEnabled}
onValueChange={(e) => appContext.setUserIsDeveloperModeEnabled(e)}
/>
}
/>
</Card>
<Card
cardTopicText={t("screens.settings.cardLegalInformation.cardTitle")}
contentPaddingTop={10}
contentPaddingBottom={10}
>
<SettingComponent
appContext={appContext}
text={t("screens.settings.cardLegalInformation.openSourceLicences")}
onPress={() => navigation.navigate("modalOpenSourceLicences")}
rightComponent={
<MyIcon
name="chevron-right"
size={24}
color={appContext.appTheme.icon}
/>
}
/>
<Divider withoutMarginVertical style={{ marginVertical: 2 }} />
<SettingComponent
appContext={appContext}
text={t("screens.settings.cardLegalInformation.termsOfService")}
onPress={() =>
// TODO: open privacy policy page
Alert.alert(
"Terms of service",
"Soon the device will open the terms of service page in your browser."
)
}
rightComponent={
<MyIcon
name="chevron-right"
size={24}
color={appContext.appTheme.icon}
/>
}
/>
<Divider withoutMarginVertical style={{ marginVertical: 2 }} />
<SettingComponent
appContext={appContext}
text={t("screens.settings.cardLegalInformation.privacyPolicy")}
onPress={() => {
// TODO: open privacy policy page
Alert.alert(
"Privacy policy",
"Soon the device will open the privacy policy page in your browser."
);
}} }}
> rightComponent={
<Text style={{ color: appContext.appTheme.text }}> <MyIcon
Developer Mode name="chevron-right"
</Text> size={24}
<MySwitch color={appContext.appTheme.icon}
value={appContext.isUserDeveloperModeEnabled} />
onValueChange={(e) => appContext.setUserIsDeveloperModeEnabled(e)} }
/> />
</View>
</Card> </Card>
</View> </View>
); );
} }
export function SettingsAppLanguageModalContent({ navigation }) { function SettingComponent({
const appContext = useContext(AppContext); appContext,
onPress,
text,
title,
description,
rightComponent,
textContainerStyle,
}) {
const Component = ({ children }) => {
if (onPress) {
return (
<TouchableOpacity
onPress={onPress}
activeOpacity={appContext.appTheme.touchableOpacity.activeOpacity}
>
{children}
</TouchableOpacity>
);
}
return <>{children}</>;
};
const TextComponent = () => {
if (text) {
return (
<Text
style={[
{ color: appContext.appTheme.text },
AppStyles.typography14,
textContainerStyle,
]}
>
{text}
</Text>
);
}
return (
<View style={textContainerStyle}>
<Text
style={[AppStyles.typography16, { color: appContext.appTheme.text }]}
>
{title}
</Text>
<Text
style={[
AppStyles.typography14,
{ color: appContext.appTheme.textSecondary },
]}
>
{description}
</Text>
</View>
);
};
return ( return (
<ModalContainer withoutPadding> <Component>
<FlatList <View
data={Constants.languages} style={{
renderItem={({ item, index }) => ( flexDirection: "row",
<MyPickerModalListItem alignItems: "center",
key={index} justifyContent: "space-between",
itemName={item.label} paddingTop: 8,
onPress={() => { paddingBottom: 8,
appContext.setAppLanguage(item.name); }}
navigation.goBack(); >
}} <TextComponent />
itemSelected={appContext.appLanguage === item.name}
/> {rightComponent}
)} </View>
/> </Component>
</ModalContainer>
);
}
export function SettingsAppColorSchemeModalContent({ navigation }) {
const appContext = useContext(AppContext);
const { t } = useTranslation();
const items = [
{
label: t("screens.settings.appColorSchemePicker.auto"),
onPress: () => appContext.setAppColorScheme("auto"),
selected: appContext.appColorScheme === "auto",
},
{
label: t("screens.settings.appColorSchemePicker.dark"),
onPress: () => appContext.setAppColorScheme("dark"),
selected: appContext.appColorScheme === "dark",
},
{
label: t("screens.settings.appColorSchemePicker.light"),
onPress: () => appContext.setAppColorScheme("light"),
selected: appContext.appColorScheme === "light",
},
];
return (
<ModalContainer withoutPadding>
<FlatList
data={items}
renderItem={({ item, index }) => (
<MyPickerModalListItem
key={index}
itemName={item.label}
itemSelected={item.selected}
onPress={() => {
item.onPress();
navigation.goBack();
}}
/>
)}
/>
</ModalContainer>
); );
} }

View File

@ -0,0 +1,47 @@
import { useContext } from "react";
import { AppContext, ModalContainer } from "../../../../utils";
import { useTranslation } from "react-i18next";
import { FlatList } from "react-native";
import { MyPickerModalListItem } from "../../../../Components/Modal";
export default function SettingsAppColorSchemeModalContent({ navigation }) {
const appContext = useContext(AppContext);
const { t } = useTranslation();
const items = [
{
label: t("screens.settings.cardGeneral.modalAppColorSchemePicker.auto"),
onPress: () => appContext.setAppColorScheme("auto"),
selected: appContext.appColorScheme === "auto",
},
{
label: t("screens.settings.cardGeneral.modalAppColorSchemePicker.dark"),
onPress: () => appContext.setAppColorScheme("dark"),
selected: appContext.appColorScheme === "dark",
},
{
label: t("screens.settings.cardGeneral.modalAppColorSchemePicker.light"),
onPress: () => appContext.setAppColorScheme("light"),
selected: appContext.appColorScheme === "light",
},
];
return (
<ModalContainer withoutPadding>
<FlatList
data={items}
renderItem={({ item, index }) => (
<MyPickerModalListItem
key={index}
itemName={item.label}
itemSelected={item.selected}
onPress={() => {
item.onPress();
navigation.goBack();
}}
/>
)}
/>
</ModalContainer>
);
}

View File

@ -0,0 +1,27 @@
import { useContext } from "react";
import { AppContext, Constants, ModalContainer } from "../../../../utils";
import { FlatList } from "react-native";
import { MyPickerModalListItem } from "../../../../Components/Modal";
export default function SettingsAppLanguageModalContent({ navigation }) {
const appContext = useContext(AppContext);
return (
<ModalContainer withoutPadding>
<FlatList
data={Constants.languages}
renderItem={({ item, index }) => (
<MyPickerModalListItem
key={index}
itemName={item.label}
onPress={() => {
appContext.setAppLanguage(item.name);
navigation.goBack();
}}
itemSelected={appContext.appLanguage === item.name}
/>
)}
/>
</ModalContainer>
);
}

View File

@ -0,0 +1,61 @@
import { useContext } from "react";
import {
AppContext,
AppStyles,
AppUsedOpenSourceLicences,
ModalContainer,
OpenUrl,
} from "../../../../utils";
import { useTranslation } from "react-i18next";
import { AccordionItem } from "../../../../Components/Accordion";
import { FlatList, Text, TouchableOpacity, View } from "react-native";
export default function OpenSourceLicensesModalContent({ navigation }) {
const appContext = useContext(AppContext);
const { t } = useTranslation();
return (
<ModalContainer withoutPadding>
<FlatList
data={AppUsedOpenSourceLicences}
ListFooterComponent={<View style={AppStyles.appBottom} />}
renderItem={({ item, index }) => (
<AccordionItem
key={index}
disablePaddingBottom
appContext={appContext}
title={item.name}
customDescriptionComponent={
<>
<TouchableOpacity
activeOpacity={
appContext.appTheme.touchableOpacity.activeOpacity
}
onPress={() => OpenUrl(item.url)}
>
<Text
style={[
{ color: appContext.appTheme.colors.primary },
AppStyles.typography12,
]}
>
{item.url}
</Text>
</TouchableOpacity>
<Text
style={[
{ color: appContext.appTheme.textSecondary, marginTop: 6 },
AppStyles.typography12,
]}
>
{item.licenseInfo}
</Text>
</>
}
/>
)}
/>
</ModalContainer>
);
}

View File

@ -1,10 +1,16 @@
import AsyncStorage from "@react-native-async-storage/async-storage"; import AsyncStorage from "@react-native-async-storage/async-storage";
import { createContext, createRef, useState } from "react"; import { createContext, createRef, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Appearance, Platform, StyleSheet, View } from "react-native"; import { Appearance, Linking, Platform, StyleSheet, View } from "react-native";
import uuid from "react-native-uuid"; import uuid from "react-native-uuid";
import * as Haptics from "expo-haptics"; import * as Haptics from "expo-haptics";
/*
*
* Here you can find all the global variables and functions for the app
*
*/
export const Constants = { export const Constants = {
defaultLanguage: "de", defaultLanguage: "de",
defaultColorSwatchesFavorites: [ defaultColorSwatchesFavorites: [
@ -65,6 +71,10 @@ export const AppStyles = StyleSheet.create({
fontSize: 14, fontSize: 14,
lineHeight: 20, lineHeight: 20,
}, },
typography12: {
fontSize: 12,
lineHeight: 16,
},
Shadow: { Shadow: {
elevation: 2, // only android elevation: 2, // only android
shadowColor: "#000", // only ios shadowColor: "#000", // only ios
@ -144,6 +154,9 @@ const DarkAppTheme = {
transparentBackgroundColor: "rgba(0, 0, 0, 0.4)", transparentBackgroundColor: "rgba(0, 0, 0, 0.4)",
pressedPickerItemColor: "rgba(0, 0, 0, 0.3)", pressedPickerItemColor: "rgba(0, 0, 0, 0.3)",
}, },
touchableOpacity: {
activeOpacity: 0.7,
},
}; };
const LightAppTheme = { const LightAppTheme = {
@ -200,8 +213,691 @@ const LightAppTheme = {
transparentBackgroundColor: "rgba(0, 0, 0, 0.3)", transparentBackgroundColor: "rgba(0, 0, 0, 0.3)",
pressedPickerItemColor: "rgba(0, 0, 0, 0.1)", pressedPickerItemColor: "rgba(0, 0, 0, 0.1)",
}, },
touchableOpacity: {
activeOpacity: 0.5,
},
}; };
export const AppUsedOpenSourceLicences = [
{
name: "@miblanchard/react-native-slider",
url: "https://github.com/miblanchard/react-native-slider/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2019-present Michael Blanchard
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "@react-native-async-storage/async-storage",
url: "https://github.com/react-native-async-storage/async-storage/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2015-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "@react-native-community/slider",
url: "https://github.com/callstack/react-native-slider/blob/main/LICENSE.md",
licenseInfo: `MIT License
Copyright (c) 2019 react-native-community
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`,
},
{
name: "@react-navigation/drawer",
url: "https://github.com/react-navigation/react-navigation/blob/main/packages/drawer/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2017 React Navigation Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "@react-navigation/native",
url: "https://github.com/react-navigation/react-navigation/blob/main/packages/native/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2017 React Navigation Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "@react-navigation/stack",
url: "https://github.com/react-navigation/react-navigation/blob/main/packages/stack/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2017 React Navigation Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "expo, expo-haptics, expo-linear-gradient, expo-status-bar",
url: "https://github.com/expo/expo/blob/main/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "i18next",
url: "https://github.com/i18next/i18next/blob/master/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2023 i18next
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "i18next-browser-languagedetector",
url: "https://github.com/i18next/i18next-browser-languageDetector/blob/master/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2023 i18next
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react",
url: "https://github.com/facebook/react/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) Meta Platforms, Inc. and affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-i18next",
url: "https://github.com/i18next/react-i18next/blob/master/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2023 i18next
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native",
url: "https://github.com/facebook/react-native/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) Meta Platforms, Inc. and affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
`,
},
{
name: "react-native-draggable-flatlist",
url: "https://github.com/computerjazz/react-native-draggable-flatlist/blob/main/LICENSE.txt",
licenseInfo: `MIT License
Copyright (c) 2019 computerjazz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-gesture-handler",
url: "https://github.com/software-mansion/react-native-gesture-handler/blob/main/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2016 Software Mansion <swmansion.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-pager-view",
url: "https://github.com/callstack/react-native-pager-view/blob/master/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2021 Callstack
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-reanimated",
url: "https://github.com/software-mansion/react-native-reanimated/blob/main/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2016 Software Mansion <swmansion.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-safe-area-context",
url: "https://github.com/th3rdwave/react-native-safe-area-context/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2019 Th3rd Wave
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-screens",
url: "https://github.com/software-mansion/react-native-screens/blob/main/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2018 Software Mansion <swmansion.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-tab-view",
url: "https://github.com/react-navigation/react-navigation/blob/main/packages/react-native-tab-view/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2017 React Native Community
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-uuid",
url: "https://github.com/eugenehp/react-native-uuid/blob/master/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2016-2021 Eugene Hauptmann
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
{
name: "react-native-zeroconf",
url: "https://github.com/balthazar/react-native-zeroconf/blob/master/LICENSE",
licenseInfo: `The MIT License (MIT)
Copyright (c) 2016 Balthazar Gronon
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`,
},
{
name: "reanimated-color-picker",
url: "https://github.com/alabsi91/reanimated-color-picker/blob/main/LICENSE",
licenseInfo: `MIT License
Copyright (c) 2022 Ahmed Alabsi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.`,
},
];
export const HelpCenterDeQuestionsAnswers = [
{
topicText: "Allgemeine Fragen",
question:
"Was ist die grundlegende Funktionalität der Handy-App zur Gerätesteuerung?",
answer:
"Die Handy-App ermöglicht es Ihnen, kompatible Geräte über Ihr Smartphone oder Tablet zu steuern. Sie können verschiedene Funktionen aktivieren, Einstellungen ändern und Aktionen aus der Ferne ausführen.",
},
{
question: "Welche Arten von Geräten können über die App gesteuert werden?",
answer:
"Unsere App unterstützt eine Vielzahl von Geräten, darunter Smart-Home-Geräte, Unterhaltungselektronik, Haushaltsgeräte und mehr.",
},
{
question: "Ist die App für Android- und iOS-Geräte verfügbar?",
answer:
"Ja, die App ist sowohl für Android- als auch für iOS-Geräte verfügbar. Sie können sie im Google Play Store bzw. im Apple App Store herunterladen.",
},
{
question: "Wo kann ich die App herunterladen?",
answer:
"Sie können die App direkt aus dem Google Play Store (für Android) oder dem Apple App Store (für iOS) herunterladen und installieren.",
},
{
question:
"Benötige ich eine Internetverbindung, um das Gerät über die App zu steuern?",
answer:
"Ja, eine aktive Internetverbindung (Wi-Fi oder mobile Daten) ist erforderlich, um die App mit dem Gerät zu verbinden und die Steuerungsfunktionen zu nutzen.",
},
{
question: "Unterstützt die App mehrere Geräte gleichzeitig?",
answer:
"Ja, die App ermöglicht es Ihnen, mehrere kompatible Geräte gleichzeitig zu steuern und zwischen ihnen zu wechseln.",
},
{
topicText: "Einrichtung und Verbindung",
question:
"Wie richte ich die Verbindung zwischen der App und meinem Gerät ein?",
answer:
"Die genaue Einrichtung kann je nach Gerät variieren, aber normalerweise müssen Sie die App öffnen, das Gerät auswählen und den Anweisungen auf dem Bildschirm folgen, um die Verbindung herzustellen.",
},
{
question:
"Welche Schritte sind erforderlich, um das Gerät zum ersten Mal mit der App zu verbinden?",
answer:
"Starten Sie die App, erstellen Sie ein Konto (falls erforderlich), fügen Sie das Gerät hinzu, indem Sie es aus der Liste der verfügbaren Geräte auswählen, und folgen Sie den Anweisungen zur Verbindungsherstellung.",
},
{
question:
"Benötige ich spezielle Einstellungen am Gerät, um die Verbindung herzustellen?",
answer:
"Ja, in den meisten Fällen müssen Sie sicherstellen, dass das Gerät eingeschaltet und im Verbindungsmodus ist, bevor Sie versuchen, es über die App zu verbinden.",
},
{
question:
"Welche Arten von Verbindungsmethoden werden von der App unterstützt (z. B. Bluetooth, WLAN, etc.)?",
answer:
"Unsere App unterstützt in der Regel WLAN-Verbindungen, um eine stabile und zuverlässige Steuerung über größere Entfernungen zu ermöglichen.",
},
{
question:
"Was sollte ich tun, wenn die Verbindung zwischen der App und dem Gerät verloren geht?",
answer:
"Überprüfen Sie zuerst Ihre Internetverbindung. Wenn das Problem weiterhin besteht, können Sie versuchen, das Gerät aus der App zu entfernen und erneut hinzuzufügen. Gegebenenfalls kann ein Neustart des Geräts helfen.",
},
];
export const HelpCenterEnQuestionsAnswers = [
{
topicText: "General Questions",
question:
"What is the basic functionality of the mobile app for device control?",
answer:
"The mobile app allows you to control compatible devices using your smartphone or tablet. You can activate various functions, change settings, and perform actions remotely.",
},
{
question: "What types of devices can be controlled through the app?",
answer:
"Our app supports a variety of devices, including smart home devices, entertainment electronics, household appliances, and more.",
},
{
question: "Is the app available for both Android and iOS devices?",
answer:
"Yes, the app is available for both Android and iOS devices. You can download it from the Google Play Store or the Apple App Store.",
},
{
question: "Where can I download the app?",
answer:
"You can download and install the app directly from the Google Play Store (for Android) or the Apple App Store (for iOS).",
},
{
question:
"Do I need an internet connection to control the device through the app?",
answer:
"Yes, an active internet connection (Wi-Fi or mobile data) is required to connect the app to the device and use the control functions.",
},
{
question: "Does the app support multiple devices simultaneously?",
answer:
"Yes, the app allows you to control multiple compatible devices simultaneously and switch between them.",
},
{
topicText: "Setup and Connection",
question: "How do I set up the connection between the app and my device?",
answer:
"The exact setup process may vary depending on the device, but typically, you need to open the app, select the device, and follow the on-screen instructions to establish the connection.",
},
{
question:
"What steps are required to initially connect the device to the app?",
answer:
"Launch the app, create an account (if required), add the device by selecting it from the list of available devices, and follow the instructions for establishing the connection.",
},
{
question:
"Do I need specific settings on the device to establish the connection?",
answer:
"Yes, in most cases, you need to ensure that the device is powered on and in pairing mode before attempting to connect it through the app.",
},
{
question:
"What types of connection methods are supported by the app (e.g., Bluetooth, Wi-Fi, etc.)?",
answer:
"Our app typically supports Wi-Fi connections to enable stable and reliable control over longer distances.",
},
{
question:
"What should I do if the connection between the app and the device is lost?",
answer:
"First, check your internet connection. If the issue persists, you can try removing and re-adding the device from the app. If necessary, restarting the device might help.",
},
];
/*
*
* Do not change code below this line if you don't know what you are doing
*
*/
export async function StoreData(key, value) { export async function StoreData(key, value) {
try { try {
const jsonValue = JSON.stringify(value); const jsonValue = JSON.stringify(value);
@ -324,7 +1020,7 @@ const devDevicesFirmwareModes = {
], ],
lightAnimationsIn: [ lightAnimationsIn: [
{ {
id: "00000000-0000-0000-0000-000000000000", id: Constants.defaultAnimationId,
supportedFirmwareVersions: ["*"], supportedFirmwareVersions: ["*"],
name: { name: {
de: "Keine", de: "Keine",
@ -359,7 +1055,7 @@ const devDevicesFirmwareModes = {
], ],
lightAnimationsOut: [ lightAnimationsOut: [
{ {
id: "00000000-0000-0000-0000-000000000000", id: Constants.defaultAnimationId,
supportedFirmwareVersions: ["*"], supportedFirmwareVersions: ["*"],
name: { name: {
de: "Keine", de: "Keine",
@ -616,9 +1312,9 @@ export function NewAction(sceneId, actionType, modeAdjustments) {
type: actionType, // layers, ambilight, motor type: actionType, // layers, ambilight, motor
modeId: "", modeId: "",
modeAdjustments: modeAdjustments, modeAdjustments: modeAdjustments,
animationInId: "00000000-0000-0000-0000-000000000000", // default animation id for -> No animation selected animationInId: Constants.defaultAnimationId, // default animation id for -> No animation selected
animationInAdjustment: {}, animationInAdjustment: {},
animationOutId: "00000000-0000-0000-0000-000000000000", // default animation id for -> No animation selected animationOutId: Constants.defaultAnimationId, // default animation id for -> No animation selected
animationOutAdjustment: {}, animationOutAdjustment: {},
}; };
} }
@ -746,3 +1442,9 @@ export function ModalContainer({ children, withoutPadding }) {
</View> </View>
); );
} }
export function OpenUrl(url) {
Linking.openURL(url).catch((err) =>
console.error("An error occurred while opening the url", err)
);
}