You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SettingsScreen.jsx 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import React, { useEffect, useState } from "react";
  2. import { View, Text, TouchableOpacity } from "react-native";
  3. import { useTheme } from "@styles";
  4. import { THEME, LANGUAGE } from "@constants/localStorage";
  5. import { storeObject, getObjectData } from "@service/asyncStorage";
  6. import Layout from "@components/Layout/Layout";
  7. import { useTranslation } from "react-i18next";
  8. const SettingsScreen = ({ navigation }) => {
  9. const { t, i18n } = useTranslation();
  10. const { colors, setScheme, isDark } = useTheme();
  11. const [selectedTheme, setSelectedTheme] = useState({});
  12. const [selectedLanguage, setSelectedLanguage] = useState({});
  13. const themes = [
  14. {
  15. id: 1,
  16. name: t("common.light"),
  17. type: "light",
  18. },
  19. {
  20. id: 2,
  21. name: t("common.dark"),
  22. type: "dark",
  23. },
  24. ];
  25. const languages = [
  26. {
  27. id: 1,
  28. name: t("common.serbian"),
  29. code: "sr",
  30. },
  31. {
  32. id: 2,
  33. name: t("common.english"),
  34. code: "en",
  35. },
  36. ];
  37. const handleLanguage = async (language) => {
  38. setSelectedLanguage(language);
  39. await i18n.changeLanguage(language.code);
  40. await storeObject(LANGUAGE, language);
  41. };
  42. const handleTheme = async (theme) => {
  43. setSelectedTheme(theme);
  44. if (theme.type === "dark") {
  45. setScheme("dark");
  46. } else if (theme.type === "light") {
  47. setScheme("light");
  48. }
  49. await storeObject(THEME, theme);
  50. };
  51. useEffect(() => {
  52. async function handleThemeChange() {
  53. const theme = await getObjectData(THEME);
  54. if (theme !== null) {
  55. setSelectedTheme(theme);
  56. } else if (isDark) {
  57. setSelectedTheme(themes[1]);
  58. } else {
  59. setSelectedTheme(themes[0]);
  60. }
  61. }
  62. handleThemeChange();
  63. }, []);
  64. useEffect(() => {
  65. async function handleLanguageChange() {
  66. const language = await getObjectData(LANGUAGE);
  67. if (language !== null) {
  68. setSelectedLanguage(language);
  69. //await i18n.changeLanguage(language.code);
  70. } else {
  71. setSelectedLanguage(languages[0]);
  72. //await i18n.changeLanguage(languages[0].code);
  73. }
  74. }
  75. handleLanguageChange();
  76. }, []);
  77. return (
  78. <Layout>
  79. <Text style={{ color: colors.textPrimary, paddingLeft: 20 }}>
  80. {t("common.theme")}
  81. </Text>
  82. <View
  83. style={{
  84. flexDirection: "row",
  85. justifyContent: "space-between",
  86. marginTop: 20,
  87. marginHorizontal: 20,
  88. paddingBottom: 20,
  89. borderBottomWidth: 1,
  90. borderBottomColor: colors.borderSecondary,
  91. }}
  92. >
  93. {themes.map((theme) => (
  94. <TouchableOpacity
  95. key={theme.id}
  96. style={{ flex: 1 }}
  97. onPress={() => handleTheme(theme)}
  98. >
  99. <View
  100. style={[
  101. {
  102. alignItems: "center",
  103. borderWidth: 1,
  104. paddingVertical: 8,
  105. borderColor: colors.borderSecondary,
  106. },
  107. theme.id === 1 && { marginRight: 18 },
  108. selectedTheme.id === theme.id && {
  109. backgroundColor: "#aa18ea",
  110. },
  111. ]}
  112. >
  113. <Text style={{ color: colors.textPrimary }}>{theme.name}</Text>
  114. </View>
  115. </TouchableOpacity>
  116. ))}
  117. </View>
  118. <Text
  119. style={{ color: colors.textPrimary, paddingLeft: 20, marginTop: 20 }}
  120. >
  121. {t("common.language")}
  122. </Text>
  123. <View
  124. style={{
  125. flexDirection: "row",
  126. justifyContent: "space-between",
  127. marginTop: 20,
  128. marginHorizontal: 20,
  129. paddingBottom: 20,
  130. borderBottomWidth: 1,
  131. borderBottomColor: colors.borderSecondary,
  132. }}
  133. >
  134. {languages.map((lang) => (
  135. <TouchableOpacity
  136. key={lang.id}
  137. style={{ flex: 1 }}
  138. onPress={() => handleLanguage(lang)}
  139. >
  140. <View
  141. style={[
  142. {
  143. alignItems: "center",
  144. borderWidth: 1,
  145. paddingVertical: 8,
  146. borderColor: colors.borderSecondary,
  147. },
  148. lang.id === 1 && { marginRight: 18 },
  149. selectedLanguage.id === lang.id && {
  150. backgroundColor: "#aa18ea",
  151. },
  152. ]}
  153. >
  154. <Text style={{ color: colors.textPrimary }}>{lang.name}</Text>
  155. </View>
  156. </TouchableOpacity>
  157. ))}
  158. </View>
  159. </Layout>
  160. );
  161. };
  162. export default SettingsScreen;