diff --git a/package-lock.json b/package-lock.json index c773c5b..c5f0878 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,9 +7,10 @@ "dependencies": { "@react-native-async-storage/async-storage": "^1.13.0", "@react-native-community/masked-view": "0.1.10", - "@react-navigation/core": "5.2.3", - "@react-navigation/native": "5.1.1", - "@react-navigation/stack": "5.2.3", + "@react-navigation/bottom-tabs": "^6.3.1", + "@react-navigation/core": "^6.2.1", + "@react-navigation/native": "^6.0.10", + "@react-navigation/stack": "^6.2.1", "expo": "^41.0.0", "expo-image-picker": "~10.1.4", "expo-linking": "~2.2.3", @@ -28,7 +29,6 @@ "react-native-screens": "~3.0.0", "react-native-tab-view": "^2.16.0", "react-native-web": "~0.13.12", - "react-navigation": "^4.4.0", "react-navigation-stack": "^2.8.2" }, "devDependencies": { @@ -3710,58 +3710,127 @@ "react-native": ">=0.57" } }, - "node_modules/@react-navigation/core": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.2.3.tgz", - "integrity": "sha512-iWSj7Eep4qWuEZ/LYSSsK9vs0AskUkIQM3+SmeZJxIqOIQw7nVQZ4sa4RbYbX/PxOBbZ/SOOKcCNuZ7zilve5A==", + "node_modules/@react-navigation/bottom-tabs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.3.1.tgz", + "integrity": "sha512-sL9F4WMhhR6I9bE7bpsPVHnK1cN9doaFHAuy5YmD+Sw6OyO0TAmNgQFx4xZWqboA5ZwSkN0tWcRCr6wGXaRRag==", "dependencies": { - "@react-navigation/routers": "^5.1.1", - "escape-string-regexp": "^2.0.0", - "query-string": "^6.11.1", - "react-is": "^16.13.0", - "shortid": "^2.2.15", - "use-subscription": "^1.4.0" + "@react-navigation/elements": "^1.3.3", + "color": "^3.1.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.2.1.tgz", + "integrity": "sha512-3mjS6ujwGnPA/BC11DN9c2c42gFld6B6dQBgDedxP2djceXESpY2kVTTwISDHuqFnF7WjvRjsrDu3cKBX+JosA==", + "dependencies": { + "@react-navigation/routers": "^6.1.0", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.0.0", + "react-is": "^16.13.0" }, "peerDependencies": { "react": "*" } }, - "node_modules/@react-navigation/native": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.1.1.tgz", - "integrity": "sha512-AzHuO5egm5+JT+M37imyVDe6vfY3mr+HO3FpRTAvXuJabDV5flcLUTIiLuvmd3iyNRFJFR6bCbDirwwmVWMAXg==", + "node_modules/@react-navigation/core/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-navigation/core/node_modules/query-string": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz", + "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==", "dependencies": { - "@react-navigation/core": "^5.2.3" + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-navigation/elements": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.3.tgz", + "integrity": "sha512-Lv2lR7si5gNME8dRsqz57d54m4FJtrwHRjNQLOyQO546ZxO+g864cSvoLC6hQedQU0+IJnPTsZiEI2hHqfpEpw==", + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/native": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.0.10.tgz", + "integrity": "sha512-H6QhLeiieGxNcAJismIDXIPZgf1myr7Og8v116tezIGmincJTOcWavTd7lPHGnMMXaZg94LlVtbaBRIx9cexqw==", + "dependencies": { + "@react-navigation/core": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" }, "peerDependencies": { "react": "*", "react-native": "*" } }, + "node_modules/@react-navigation/native/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@react-navigation/routers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.7.2.tgz", - "integrity": "sha512-BxNSMLHpU+oS37Xok0ql6rc9U7IC8aUD4+U5ZPbjDJ0pwzZxGGh0YOEBzfV4k/Ig3cbPdvVWbc1C9HHbCVr2oQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.0.tgz", + "integrity": "sha512-8xJL+djIzpFdRW/sGlKojQ06fWgFk1c5jER9501HYJ12LF5DIJFr/tqBI2TJ6bk+y+QFu0nbNyeRC80OjRlmkA==", "dependencies": { - "nanoid": "^3.1.15" + "nanoid": "^3.1.23" } }, "node_modules/@react-navigation/stack": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.2.3.tgz", - "integrity": "sha512-mCji6N6r03sTMF09hbVmhdCZHcuIrZCr/MY8yuiG+kzzYcFfj+72wwJ885erKw32jBKAaJV8wZNq8W0K+ZiCQQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.2.1.tgz", + "integrity": "sha512-JI7boxtPAMCBXi4VJHVEq61jLVHFW5f3npvbndS+XfOsv7Gf0f91HOVJ28DS5c2Fn4+CO4AByjUozzlN296X+A==", "dependencies": { - "color": "^3.1.2", - "react-native-iphone-x-helper": "^1.2.1" + "@react-navigation/elements": "^1.3.3", + "color": "^3.1.3", + "warn-once": "^0.1.0" }, "peerDependencies": { - "@react-native-community/masked-view": ">= 0.1.0", - "@react-navigation/native": "^5.0.5", + "@react-navigation/native": "^6.0.0", "react": "*", "react-native": "*", "react-native-gesture-handler": ">= 1.0.0", - "react-native-safe-area-context": ">= 0.6.0", - "react-native-screens": ">= 2.0.0-alpha.0 || >= 2.0.0-beta.0 || >= 2.0.0" + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" } }, "node_modules/@types/hammerjs": { @@ -6182,6 +6251,11 @@ "node": ">= 0.10" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -9084,6 +9158,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "peer": true, "dependencies": { "isarray": "0.0.1" } @@ -9091,7 +9166,8 @@ "node_modules/path-to-regexp/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "peer": true }, "node_modules/phin": { "version": "2.9.3", @@ -9462,6 +9538,7 @@ "version": "6.14.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "peer": true, "dependencies": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -9699,6 +9776,7 @@ "version": "0.14.9", "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-0.14.9.tgz", "integrity": "sha512-WII/ulhpVyL/qbYb7vydq7dJAfZRBcEhg4/UWt6F6nAKpLa3gAceMOxBxI914ppwSP/TdUsandFy6lkJQE0z4A==", + "peer": true, "dependencies": { "hoist-non-react-statics": "^2.3.1" }, @@ -9710,7 +9788,8 @@ "node_modules/react-native-safe-area-view/node_modules/hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "peer": true }, "node_modules/react-native-screens": { "version": "3.0.0", @@ -9868,6 +9947,7 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-4.4.4.tgz", "integrity": "sha512-08Nzy1aKEd73496CsuzN49vLFmxPKYF5WpKGgGvkQ10clB79IRM2BtAfVl6NgPKuUM8FXq1wCsrjo/c5ftl5og==", + "peer": true, "dependencies": { "@react-navigation/core": "^3.7.9", "@react-navigation/native": "^3.8.4" @@ -9899,6 +9979,7 @@ "version": "3.7.9", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-3.7.9.tgz", "integrity": "sha512-EknbzM8OI9A5alRxXtQRV5Awle68B+z1QAxNty5DxmlS3BNfmduWNGnim159ROyqxkuDffK9L/U/Tbd45mx+Jg==", + "peer": true, "dependencies": { "hoist-non-react-statics": "^3.3.2", "path-to-regexp": "^1.8.0", @@ -9913,6 +9994,7 @@ "version": "3.8.4", "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-3.8.4.tgz", "integrity": "sha512-gXSVcL7bfFDyVkvyg1FiAqTCIgZub5K1X/TZqURBs2CPqDpfX1OsCtB9D33eTF14SpbfgHW866btqrrxoCACfg==", + "peer": true, "dependencies": { "hoist-non-react-statics": "^3.3.2", "react-native-safe-area-view": "^0.14.9" @@ -10391,19 +10473,6 @@ "jsonify": "~0.0.0" } }, - "node_modules/shortid": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", - "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", - "dependencies": { - "nanoid": "^2.1.0" - } - }, - "node_modules/shortid/node_modules/nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -11426,6 +11495,11 @@ "makeerror": "1.0.x" } }, + "node_modules/warn-once": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.0.tgz", + "integrity": "sha512-recZTSvuaH/On5ZU5ywq66y99lImWqzP93+AiUo9LUwG8gXHW+LJjhOd6REJHm7qb0niYqrEQJvbHSQfuJtTqA==" + }, "node_modules/warning": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", @@ -14506,42 +14580,86 @@ "integrity": "sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ==", "requires": {} }, - "@react-navigation/core": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.2.3.tgz", - "integrity": "sha512-iWSj7Eep4qWuEZ/LYSSsK9vs0AskUkIQM3+SmeZJxIqOIQw7nVQZ4sa4RbYbX/PxOBbZ/SOOKcCNuZ7zilve5A==", + "@react-navigation/bottom-tabs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.3.1.tgz", + "integrity": "sha512-sL9F4WMhhR6I9bE7bpsPVHnK1cN9doaFHAuy5YmD+Sw6OyO0TAmNgQFx4xZWqboA5ZwSkN0tWcRCr6wGXaRRag==", "requires": { - "@react-navigation/routers": "^5.1.1", - "escape-string-regexp": "^2.0.0", - "query-string": "^6.11.1", - "react-is": "^16.13.0", - "shortid": "^2.2.15", - "use-subscription": "^1.4.0" + "@react-navigation/elements": "^1.3.3", + "color": "^3.1.3", + "warn-once": "^0.1.0" } }, - "@react-navigation/native": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.1.1.tgz", - "integrity": "sha512-AzHuO5egm5+JT+M37imyVDe6vfY3mr+HO3FpRTAvXuJabDV5flcLUTIiLuvmd3iyNRFJFR6bCbDirwwmVWMAXg==", + "@react-navigation/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.2.1.tgz", + "integrity": "sha512-3mjS6ujwGnPA/BC11DN9c2c42gFld6B6dQBgDedxP2djceXESpY2kVTTwISDHuqFnF7WjvRjsrDu3cKBX+JosA==", "requires": { - "@react-navigation/core": "^5.2.3" + "@react-navigation/routers": "^6.1.0", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.0.0", + "react-is": "^16.13.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "query-string": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz", + "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + } + } + }, + "@react-navigation/elements": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.3.tgz", + "integrity": "sha512-Lv2lR7si5gNME8dRsqz57d54m4FJtrwHRjNQLOyQO546ZxO+g864cSvoLC6hQedQU0+IJnPTsZiEI2hHqfpEpw==", + "requires": {} + }, + "@react-navigation/native": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.0.10.tgz", + "integrity": "sha512-H6QhLeiieGxNcAJismIDXIPZgf1myr7Og8v116tezIGmincJTOcWavTd7lPHGnMMXaZg94LlVtbaBRIx9cexqw==", + "requires": { + "@react-navigation/core": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } } }, "@react-navigation/routers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.7.2.tgz", - "integrity": "sha512-BxNSMLHpU+oS37Xok0ql6rc9U7IC8aUD4+U5ZPbjDJ0pwzZxGGh0YOEBzfV4k/Ig3cbPdvVWbc1C9HHbCVr2oQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.0.tgz", + "integrity": "sha512-8xJL+djIzpFdRW/sGlKojQ06fWgFk1c5jER9501HYJ12LF5DIJFr/tqBI2TJ6bk+y+QFu0nbNyeRC80OjRlmkA==", "requires": { - "nanoid": "^3.1.15" + "nanoid": "^3.1.23" } }, "@react-navigation/stack": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.2.3.tgz", - "integrity": "sha512-mCji6N6r03sTMF09hbVmhdCZHcuIrZCr/MY8yuiG+kzzYcFfj+72wwJ885erKw32jBKAaJV8wZNq8W0K+ZiCQQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.2.1.tgz", + "integrity": "sha512-JI7boxtPAMCBXi4VJHVEq61jLVHFW5f3npvbndS+XfOsv7Gf0f91HOVJ28DS5c2Fn4+CO4AByjUozzlN296X+A==", "requires": { - "color": "^3.1.2", - "react-native-iphone-x-helper": "^1.2.1" + "@react-navigation/elements": "^1.3.3", + "color": "^3.1.3", + "warn-once": "^0.1.0" } }, "@types/hammerjs": { @@ -16503,6 +16621,11 @@ "time-stamp": "^1.0.0" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -18845,6 +18968,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "peer": true, "requires": { "isarray": "0.0.1" }, @@ -18852,7 +18976,8 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "peer": true } } }, @@ -19141,6 +19266,7 @@ "version": "6.14.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "peer": true, "requires": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -19410,6 +19536,7 @@ "version": "0.14.9", "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-0.14.9.tgz", "integrity": "sha512-WII/ulhpVyL/qbYb7vydq7dJAfZRBcEhg4/UWt6F6nAKpLa3gAceMOxBxI914ppwSP/TdUsandFy6lkJQE0z4A==", + "peer": true, "requires": { "hoist-non-react-statics": "^2.3.1" }, @@ -19417,7 +19544,8 @@ "hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "peer": true } } }, @@ -19475,6 +19603,7 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-4.4.4.tgz", "integrity": "sha512-08Nzy1aKEd73496CsuzN49vLFmxPKYF5WpKGgGvkQ10clB79IRM2BtAfVl6NgPKuUM8FXq1wCsrjo/c5ftl5og==", + "peer": true, "requires": { "@react-navigation/core": "^3.7.9", "@react-navigation/native": "^3.8.4" @@ -19484,6 +19613,7 @@ "version": "3.7.9", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-3.7.9.tgz", "integrity": "sha512-EknbzM8OI9A5alRxXtQRV5Awle68B+z1QAxNty5DxmlS3BNfmduWNGnim159ROyqxkuDffK9L/U/Tbd45mx+Jg==", + "peer": true, "requires": { "hoist-non-react-statics": "^3.3.2", "path-to-regexp": "^1.8.0", @@ -19495,6 +19625,7 @@ "version": "3.8.4", "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-3.8.4.tgz", "integrity": "sha512-gXSVcL7bfFDyVkvyg1FiAqTCIgZub5K1X/TZqURBs2CPqDpfX1OsCtB9D33eTF14SpbfgHW866btqrrxoCACfg==", + "peer": true, "requires": { "hoist-non-react-statics": "^3.3.2", "react-native-safe-area-view": "^0.14.9" @@ -19897,21 +20028,6 @@ "jsonify": "~0.0.0" } }, - "shortid": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", - "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", - "requires": { - "nanoid": "^2.1.0" - }, - "dependencies": { - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - } - } - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -20710,6 +20826,11 @@ "makeerror": "1.0.x" } }, + "warn-once": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.0.tgz", + "integrity": "sha512-recZTSvuaH/On5ZU5ywq66y99lImWqzP93+AiUo9LUwG8gXHW+LJjhOd6REJHm7qb0niYqrEQJvbHSQfuJtTqA==" + }, "warning": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", diff --git a/package.json b/package.json index 4f7594e..0ca1f96 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,10 @@ "dependencies": { "@react-native-async-storage/async-storage": "^1.13.0", "@react-native-community/masked-view": "0.1.10", - "@react-navigation/core": "5.2.3", - "@react-navigation/native": "5.1.1", - "@react-navigation/stack": "5.2.3", + "@react-navigation/bottom-tabs": "^6.3.1", + "@react-navigation/core": "^6.2.1", + "@react-navigation/native": "^6.0.10", + "@react-navigation/stack": "^6.2.1", "expo": "^41.0.0", "expo-image-picker": "~10.1.4", "expo-linking": "~2.2.3", @@ -31,7 +32,6 @@ "react-native-screens": "~3.0.0", "react-native-tab-view": "^2.16.0", "react-native-web": "~0.13.12", - "react-navigation": "^4.4.0", "react-navigation-stack": "^2.8.2" }, "devDependencies": { diff --git a/src/App.js b/src/App.js index 4184d8c..aa4d8ea 100644 --- a/src/App.js +++ b/src/App.js @@ -1,73 +1,142 @@ import 'react-native-gesture-handler'; import React from "react"; -import { createAppContainer } from 'react-navigation'; -import { createStackNavigator } from "react-navigation-stack"; +import { createStackNavigator } from "@react-navigation/stack"; +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; +import { NavigationContainer } from "@react-navigation/native"; import { MenuProvider } from "react-native-popup-menu"; +import { Ionicons } from "@expo/vector-icons"; import { registerRootComponent } from 'expo'; import * as Linking from "expo-linking"; -import ViewPostJsx from "src/components/pages/view-post"; -import ViewCommentsJsx from "src/components/pages/view-comments.js"; +import ViewPost from "src/components/pages/view-post"; +import ViewComments from "src/components/pages/view-comments.js"; -import AuthenticateJsx from "src/components/pages/authenticate"; -import FeedJsx from "src/components/pages/feed"; -import PublishJsx from "src/components/pages/publish"; -import OlderPostsJsx from "src/components/pages/feed/older-posts"; -import ProfileJsx, { ViewProfileJsx } from "src/components/pages/profile"; -import DiscoverJsx from 'src/components/pages/discover'; -import SearchJsx from 'src/components/pages/discover/search'; -import ViewHashtagJsx from 'src/components/pages/discover/view-hashtag'; -import DirectJsx from "src/components/pages/direct"; -import ConversationJsx, { ComposeJsx } from "src/components/pages/direct/conversation"; -import NotificationsJsx from 'src/components/pages/profile/notifications'; -import UserListJsx from "src/components/pages/user-list.js"; -import SettingsJsx from "src/components/pages/profile/settings.js"; - -const Stack = createStackNavigator({ - Authenticate: { - screen: AuthenticateJsx, - path: "authenticate", - }, - Feed: { screen: FeedJsx, }, - OlderPosts: { screen: OlderPostsJsx }, - Discover: { screen: DiscoverJsx }, - Publish: { screen: PublishJsx }, - Direct: { screen: DirectJsx }, - Compose: { screen: ComposeJsx }, - Conversation: { screen: ConversationJsx }, - Notifications: { screen: NotificationsJsx }, - Profile: { screen: ProfileJsx, }, - Settings: { screen: SettingsJsx }, - Search: { screen: SearchJsx }, - ViewPost: { screen: ViewPostJsx }, - ViewComments: { screen: ViewCommentsJsx }, - ViewProfile: { screen: ViewProfileJsx }, - ViewHashtag: { screen: ViewHashtagJsx }, - UserList: { screen: UserListJsx } -}, { - initialRouteKey: "Authenticate", - headerMode: "none", - navigationOptions: { - headerVisible: false - } -}); - -const AppContainer = createAppContainer(Stack); +import Authenticate from "src/components/pages/authenticate"; +import Feed from "src/components/pages/feed"; +import Publish from "src/components/pages/publish"; +import OlderPosts from "src/components/pages/feed/older-posts"; +import Profile, { ViewProfile } from "src/components/pages/profile"; +import Discover from 'src/components/pages/discover'; +import Search from 'src/components/pages/discover/search'; +import ViewHashtag from 'src/components/pages/discover/view-hashtag'; +import Direct from "src/components/pages/direct"; +import Conversation, { Compose } from "src/components/pages/direct/conversation"; +import Notifications from 'src/components/pages/profile/notifications'; +import UserList from "src/components/pages/user-list.js"; +import Settings from "src/components/pages/profile/settings.js"; const prefix = Linking.makeUrl("/"); +const Tab = createBottomTabNavigator(); + +const MainNavigator = () => { + // Tabbed navigator for Feed, Discover, Publish, Direct and Profile + + const bottomTabIcon = name => { + return ({ size }) => + }; + + const screenOptions = { + all: { + // Options that apply to every screen in the navigator + headerShown: false, + tabBarShowLabel: false, + tabBarStyle: { + height: 60, + } + }, + Feed: { + tabBarAccessibilityLabel: "Feed", + tabBarIcon: bottomTabIcon("home-outline"), + }, + Discover: { + tabBarAccessibilityLabel: "Discover", + tabBarIcon: bottomTabIcon("search-outline"), + }, + Publish: { + tabBarAccessibilityLabel: "Publish", + tabBarIcon: bottomTabIcon("camera-outline"), + }, + Direct: { + tabBarAccessibilityLabel: "Direct messages", + tabBarIcon: bottomTabIcon("mail-outline"), + }, + Profile: { + tabBarAccessibilityLabel: "Profile", + tabBarIcon: bottomTabIcon("person-outline"), + }, + }; + + return ( + + + + + + + + ); +}; + +const Stack = createStackNavigator(); const App = (props) => { const providerStyles = { backdrop: { backgroundColor: "black", opacity: 0.5 - } + }, + }; + + // This allows for the OAuth redirect + const linking = { + prefixes: [prefix], + config: { + screens: { + Authenticate: "authenticate", + }, + }, + }; + + const screenOptions = { + headerTitle: "", }; return - + + + + + + + + + + + + + + + + + ; }; diff --git a/src/components/context-menu.js b/src/components/context-menu.js index a992538..77c5ce5 100644 --- a/src/components/context-menu.js +++ b/src/components/context-menu.js @@ -13,7 +13,7 @@ const { SlideInMenu } = renderers; const SCREEN_WIDTH = Dimensions.get("window").width; -const ContextMenuJsx = (props) => { +const ContextMenu = (props) => { const optionsStyles = { optionWrapper: { // The wrapper around a single option paddingLeft: SCREEN_WIDTH / 15, @@ -47,4 +47,4 @@ const ContextMenuJsx = (props) => { ); } -export { ContextMenuJsx as default }; +export { ContextMenu as default }; diff --git a/src/components/moderate-menu.js b/src/components/moderate-menu.js index 90b5d5d..c2d371e 100644 --- a/src/components/moderate-menu.js +++ b/src/components/moderate-menu.js @@ -13,7 +13,7 @@ const { SlideInMenu } = renderers; const SCREEN_WIDTH = Dimensions.get("window").width; -const ModerateMenuJsx = (props) => { +const ModerateMenu = (props) => { const optionsStyles = { optionWrapper: { // The wrapper around a single option paddingLeft: SCREEN_WIDTH / 15, @@ -50,4 +50,4 @@ const ModerateMenuJsx = (props) => { ); } -export { ModerateMenuJsx as default }; +export { ModerateMenu as default }; diff --git a/src/components/navigation/back-bar.js b/src/components/navigation/back-bar.js deleted file mode 100644 index 1a5e09a..0000000 --- a/src/components/navigation/back-bar.js +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; -import { Image } from "react-native"; -import { TouchableOpacity, View } from "react-native"; -import { Ionicons } from "@expo/vector-icons"; - -const BackBarJsx = (props) => { - - return ( - - props.navigation.goBack() } - style = { styles.button }> - - - - { props.children } - - - ); -}; - -const styles = { - nav: { - borderBottomWidth: 1, - borderBottomColor: "#CCC", - backgroundColor: "white", - - flexDirection: "row", - alignItems: "center", - paddingLeft: 10, - paddingRight: 10, - }, - rest: { - flexGrow: 1, - }, - chevron: { - width: 30, - height: 30, - }, - button: { - paddingRight: 10, - paddingTop: 10, - paddingBottom: 10, - }, -} - -export default BackBarJsx; diff --git a/src/components/navigation/navigators.js b/src/components/navigation/navigators.js deleted file mode 100644 index e4b0f4e..0000000 --- a/src/components/navigation/navigators.js +++ /dev/null @@ -1,63 +0,0 @@ -import React from "react"; -import { SafeAreaView } from "react-native"; -import { ScrollView } from "react-native-gesture-handler"; - -import { StatusBarSpace } from "src/interface/rendering"; -import BackBarJsx from "./back-bar"; -import TrayJsx from "src/components/navigation/tray"; - -export const ScreenWithTrayJsx = (props) => { - return ( - - - - { props.children } - - - - ); -}; - -export const ScreenWithBackBarJsx = (props) => { - return ( - - - - { props.renderBackBar != undefined - ? props.renderBackBar() - : <> - } - - - { props.children } - - - ); -}; - -export const ScreenWithFullNavigationJsx = (props) => { - return ( - - - - { props.renderBackBar != undefined - ? props.renderBackBar() - : <> - } - - - { props.children } - - - - ); -}; diff --git a/src/components/navigation/tray.js b/src/components/navigation/tray.js deleted file mode 100644 index 8745468..0000000 --- a/src/components/navigation/tray.js +++ /dev/null @@ -1,98 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { - Image, - Dimensions, -} from "react-native"; -import { Ionicons } from "@expo/vector-icons"; - -import { checkUnreadNotifications } from "src/requests"; - -import { activeOrNot } from "src/interface/interactions" -import { TouchableWithoutFeedback, View } from "react-native"; - -const TrayButtonJsx = (props) => { - return ( - props.nav.navigate(props.where, {}) }> - - - ); -} - -const TrayJsx = (props) => { - const nav = props.navigation; - const [state, setState] = useState({ - unreadNotifications: false - }); - - useEffect(() => { - checkUnreadNotifications() - .then(isUnread => { - setState({...state, - unreadNotifications: isUnread, - }); - }); - }, []); - - return ( - - - - - - - - - - ); -}; - -const SCREEN_WIDTH = Dimensions.get("window").width; -const styles = { - tray: { - width: SCREEN_WIDTH, - paddingTop: 15, - paddingBottom: 15, - - borderTopWidth: 2, - borderTopColor: "#CCC", - backgroundColor: "white" - }, - iconList: { - flexDirection: "row", - justifyContent: "space-evenly", - alignItems: "center", - - margin: 0, - paddingLeft: 0, - }, -}; - -export default TrayJsx; diff --git a/src/components/pages/authenticate.js b/src/components/pages/authenticate.js index ca71447..e80db5c 100644 --- a/src/components/pages/authenticate.js +++ b/src/components/pages/authenticate.js @@ -16,7 +16,7 @@ import Constants from "expo-constants"; import * as requests from "src/requests"; -const AuthenticateJsx = ({navigation}) => { +const Authenticate = ({navigation}) => { const REDIRECT_URI = Linking.makeUrl("authenticate"); const [state, setState] = useState({ instance: "", @@ -83,7 +83,7 @@ const AuthenticateJsx = ({navigation}) => { ); // Since nothing went wrong, navigate to the feed. - navigation.navigate("Feed"); + navigation.replace("Main"); }; const _handleUrl = async ({ url }) => { @@ -136,7 +136,7 @@ const AuthenticateJsx = ({navigation}) => { ], ]); - navigation.navigate("Feed"); + navigation.replace("Main"); }; useEffect(() => { @@ -265,4 +265,4 @@ const styles = { }, }; -export { AuthenticateJsx as default }; +export { Authenticate as default }; diff --git a/src/components/pages/direct.js b/src/components/pages/direct.js index e9db938..5248486 100644 --- a/src/components/pages/direct.js +++ b/src/components/pages/direct.js @@ -14,8 +14,7 @@ import * as requests from "src/requests"; import { Ionicons } from "@expo/vector-icons"; -import { ScreenWithTrayJsx } from "src/components/navigation/navigators"; -import ModerateMenuJsx from "src/components/moderate-menu.js"; +import ModerateMenu from "src/components/moderate-menu.js"; const TEST_IMAGE_1 = "https://cache.desktopnexus.com/thumbseg/2255/2255124-bigthumbnail.jpg"; const TEST_IMAGE_2 = "https://natureproducts.net/Forest_Products/Cutflowers/Musella_cut.jpg"; @@ -37,7 +36,7 @@ function filterConversations(convs, query) { }); } -const DirectJsx = ({ navigation }) => { +const Direct = ({ navigation }) => { const FETCH_LIMIT = 1; const [state, setState] = useState({ @@ -133,7 +132,7 @@ const DirectJsx = ({ navigation }) => { - @@ -141,9 +140,7 @@ const DirectJsx = ({ navigation }) => { }; return ( - + <> { state.loaded ? <> @@ -188,7 +185,7 @@ const DirectJsx = ({ navigation }) => { : <> } - + ); }; @@ -259,4 +256,4 @@ const styles = { bold: { fontWeight: "bold" }, }; -export { DirectJsx as default }; +export { Direct as default }; diff --git a/src/components/pages/direct/conversation.js b/src/components/pages/direct/conversation.js index e228ff8..a128620 100644 --- a/src/components/pages/direct/conversation.js +++ b/src/components/pages/direct/conversation.js @@ -24,7 +24,6 @@ import { const { SlideInMenu } = renderers; -import BackBarJsx from "src/components/navigation/back-bar"; import { timeToAge, StatusBarSpace } from "src/interface/rendering"; const TEST_IMAGE_1 = "https://cache.desktopnexus.com/thumbseg/2255/2255124-bigthumbnail.jpg"; @@ -46,12 +45,12 @@ const TEST_MESSAGES = [ { ...TEST_STATUS, id: 5 }, ]; -const ConversationContainerJsx = (props) => ( +const ConversationContainer = (props) => ( - + { props.renderBackBar() } - + { props.children } @@ -80,7 +79,7 @@ const ConversationContainerJsx = (props) => ( ); -const ComposeJsx = ({ navigation }) => { +const Compose = ({ navigation }) => { const [state, setState] = useState({ accts: [], newMessage: "", @@ -98,7 +97,7 @@ const ComposeJsx = ({ navigation }) => { }/> ); - return { }/>; }; -const ConversationJsx = ({ navigation }) => { +const Conversation = ({ navigation }) => { const conversation = navigation.getParam("conversation", {}); const [state, setState] = useState({ loaded: false, @@ -227,7 +226,7 @@ const ConversationJsx = ({ navigation }) => { }; return ( - { ? state.messages.map(renderMessage) : <> } - + ); }; @@ -327,4 +326,4 @@ const styles = { }, }; -export { ConversationJsx as default, ComposeJsx, }; +export { Conversation as default, Compose, }; diff --git a/src/components/pages/discover.js b/src/components/pages/discover.js index c5bbf32..1f3db1f 100644 --- a/src/components/pages/discover.js +++ b/src/components/pages/discover.js @@ -8,12 +8,11 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; -import PagedGridJsx from "src/components/posts/paged-grid"; -import { ScreenWithTrayJsx } from "src/components/navigation/navigators"; +import PagedGrid from "src/components/posts/paged-grid"; import { TouchableWithoutFeedback } from "react-native-gesture-handler"; -const DiscoverJsx = (props) => { +const Discover = (props) => { const POST_FETCH_PARAMS = { only_media: true, limit: 18, @@ -103,7 +102,7 @@ const DiscoverJsx = (props) => { }; const LocalTimeline = () => ( - { ); const FederatedTimeline = () => ( - { return ( <> { state.loaded - ? + ? <> props.navigation.navigate("Search") }> @@ -163,7 +159,7 @@ const DiscoverJsx = (props) => { renderTabBar = { renderTabBar } onIndexChange = { setIndex } initialLayout = { { width: SCREEN_WIDTH } } /> - + : <> } @@ -191,4 +187,4 @@ const styles = { }, }; -export default DiscoverJsx; +export default Discover; diff --git a/src/components/pages/discover/search.js b/src/components/pages/discover/search.js index 4fe9971..279b6ac 100644 --- a/src/components/pages/discover/search.js +++ b/src/components/pages/discover/search.js @@ -12,7 +12,6 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; import { StatusBarSpace } from "src/interface/rendering"; -import { ScreenWithTrayJsx } from "src/components/navigation/navigators"; import { TouchableOpacity } from "react-native-gesture-handler"; @@ -22,7 +21,7 @@ function navCallbackFactory(navigation, route) { } } -const SearchJsx = ({navigation}) => { +const Search = ({navigation}) => { // The number of additional items to fetch each time const FETCH_LIMIT = 5; @@ -122,7 +121,7 @@ const SearchJsx = ({navigation}) => { ]); const AccountRenderer = () => ( - { ); const HashtagRenderer = () => ( - { return ( <> { state.loaded - ? + ? <> { initialLayout = { { width: SCREEN_WIDTH } } /> : <> } - + : <> } ); }; -const SearchItemJsx = (props) => { +const SearchItem = (props) => { return ( props.callback(props.navParams) }> @@ -222,22 +218,22 @@ const SearchItemJsx = (props) => { }; // Display message noting when no results turned up. This component wraps -// AccountListJsx and HashtagListJsx. -const SearchListContainerJsx = ({ results, children }) => results.length == 0 +// AccountList and HashtagList. +const SearchListContainer = ({ results, children }) => results.length == 0 ? No results! : children; -const AccountListJsx = (props) => { +const AccountList = (props) => { return ( - + <> { props.results.map(item => { return ( - { { item.display_name } - + ); }) } @@ -267,19 +263,19 @@ const AccountListJsx = (props) => { } - + ); }; -const HashtagListJsx = (props) => { +const HashtagList = (props) => { return ( - + <> { props.results.map((item, i) => { return ( - { #{ item.name } - + ); }) } @@ -306,7 +302,7 @@ const HashtagListJsx = (props) => { } - + ); } @@ -388,4 +384,4 @@ const styles = { }, } -export default SearchJsx; +export default Search; diff --git a/src/components/pages/discover/view-hashtag.js b/src/components/pages/discover/view-hashtag.js index c13a153..d9f422e 100644 --- a/src/components/pages/discover/view-hashtag.js +++ b/src/components/pages/discover/view-hashtag.js @@ -1,12 +1,11 @@ import React, { useState, useEffect } from "react"; import { View, Image, Dimensions, Text } from "react-native"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators"; -import PagedGridJsx from "src/components/posts/paged-grid"; +import PagedGrid from "src/components/posts/paged-grid"; import * as requests from "src/requests"; import AsyncStorage from "@react-native-async-storage/async-storage"; -const ViewHashtagJsx = ({navigation}) => { +const ViewHashtag = ({navigation}) => { const FETCH_LIMIT = 18; let [state, setState] = useState({ tag: navigation.getParam("tag", null), @@ -70,7 +69,7 @@ const ViewHashtagJsx = ({navigation}) => { const latest = state.tag.history[0]; return ( - + <> @@ -106,7 +105,7 @@ const ViewHashtagJsx = ({navigation}) => { <> { state.loaded && state.posts.length > 0 - ? @@ -116,7 +115,7 @@ const ViewHashtagJsx = ({navigation}) => { } - + ); }; @@ -149,4 +148,4 @@ const styles = { }, } -export default ViewHashtagJsx; +export default ViewHashtag; diff --git a/src/components/pages/feed.js b/src/components/pages/feed.js index 8a3ab50..11808d6 100644 --- a/src/components/pages/feed.js +++ b/src/components/pages/feed.js @@ -1,16 +1,16 @@ import React, { useState, useEffect } from "react"; -import { Dimensions, View, Image, Text } from "react-native"; +import { ScrollView, Dimensions, View, Image, Text } from "react-native"; import { Ionicons } from '@expo/vector-icons'; -import TimelineViewJsx from "src/components/posts/timeline-view"; -import { ScreenWithTrayJsx } from "src/components/navigation/navigators"; +import TimelineView from "src/components/posts/timeline-view"; import { TouchableWithoutFeedback } from "react-native-gesture-handler"; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; +import { StatusBarSpace } from "src/interface/rendering"; -const FeedJsx = (props) => { +const Feed = (props) => { const [state, setState] = useState({ loaded: false, postsRendered: false, @@ -69,13 +69,13 @@ const FeedJsx = (props) => { }); let endOfTimelineMessage = <>; - if (state.postsRendered) { + if (state.postsRendered || state.loaded && state.posts.length == 0) { // Only render the timeline interruption if all of the posts have been // rendered in the feed. endOfTimelineMessage = <> @@ -88,7 +88,7 @@ const FeedJsx = (props) => { You're all caught up. Wow, it sure is a lovely day outside 🌳 - + { return ( <> + { state.loaded - ? - - - { endOfTimelineMessage } - + ? state.posts.length > 0 + ? + + { endOfTimelineMessage } + + : endOfTimelineMessage : <> } @@ -161,4 +156,4 @@ const styles = { }, }; -export default FeedJsx; +export default Feed; diff --git a/src/components/pages/feed/older-posts.js b/src/components/pages/feed/older-posts.js index fdaf70a..8235483 100644 --- a/src/components/pages/feed/older-posts.js +++ b/src/components/pages/feed/older-posts.js @@ -2,13 +2,12 @@ import React, { useState, useEffect } from "react"; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators"; -import PagedGridJsx from "src/components/posts/paged-grid"; +import PagedGrid from "src/components/posts/paged-grid"; // The number of posts to fetch at a time const POST_FETCH_LIMIT = 18; -const OlderPostsJsx = (props) => { +const OlderPosts = (props) => { const [ state, setState ] = useState({ loaded: false, }); @@ -59,16 +58,16 @@ const OlderPostsJsx = (props) => { return ( <> { state.loaded - ? - + - + : <> } ); }; -export default OlderPostsJsx; +export default OlderPosts; diff --git a/src/components/pages/profile.js b/src/components/pages/profile.js index ce83594..dc4688a 100644 --- a/src/components/pages/profile.js +++ b/src/components/pages/profile.js @@ -16,14 +16,10 @@ import HTML from "react-native-render-html"; import { withLeadingAcct, withoutHTML, pluralize } from "src/interface/rendering"; import * as requests from "src/requests"; -import GridViewJsx from "src/components/posts/grid-view"; -import { - ScreenWithTrayJsx, - ScreenWithBackBarJsx, -} from "src/components/navigation/navigators"; +import GridView from "src/components/posts/grid-view"; import { MenuOption } from "react-native-popup-menu"; -import ContextMenuJsx from "src/components/context-menu.js"; +import ContextMenu from "src/components/context-menu.js"; function getMutuals(yourFollowing, theirFollowers) { // Where yours and theirs are arrays of followers, as returned by the API @@ -60,7 +56,7 @@ const HTMLLink = ({link}) => { } } -const ViewProfileJsx = ({navigation}) => { +const ViewProfile = ({navigation}) => { // As rendered when opened from somewhere other than the tab bar const [state, setState] = useState({ loaded: false, @@ -163,10 +159,10 @@ const ViewProfileJsx = ({navigation}) => { return ( <> { state.loaded - ? active = { navigation.getParam("originTab") } navigation = { navigation }> - { listedUsers = { state.listedUsers } followed = { state.followed } posts = { state.posts }/> - + : <> } ); } -const ProfileJsx = ({ navigation }) => { +const Profile = ({ navigation }) => { const [state, setState] = useState({ loaded: false, }); @@ -230,25 +226,22 @@ const ProfileJsx = ({ navigation }) => { return ( <> { state.loaded - ? - + - + : <> } ) }; -const RawProfileJsx = (props) => { +const RawProfile = (props) => { let profileButton; /* Some profiles won't have a note, and react-native-render-html will @@ -317,7 +310,7 @@ const RawProfileJsx = (props) => { { !props.own - ? @@ -330,7 +323,7 @@ const RawProfileJsx = (props) => { - + : <> } @@ -389,7 +382,7 @@ const RawProfileJsx = (props) => { {profileButton} - @@ -470,4 +463,4 @@ const styles = { }, }; -export { ViewProfileJsx, ProfileJsx as default }; +export { ViewProfile, Profile as default }; diff --git a/src/components/pages/profile/notifications.js b/src/components/pages/profile/notifications.js index 31d1d7c..c9fbecc 100644 --- a/src/components/pages/profile/notifications.js +++ b/src/components/pages/profile/notifications.js @@ -11,8 +11,6 @@ import { FontAwesome } from "@expo/vector-icons"; import AsyncStorage from "@react-native-async-storage/async-storage"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators"; - const TEST_IMAGE = "https://cache.desktopnexus.com/thumbseg/2255/2255124-bigthumbnail.jpg"; const TEST_NOTIFICATIONS = [ { @@ -139,32 +137,32 @@ function navigatePostFactory(nav, id) { function renderNotification(notif, navigation) { switch(notif.type) { case "follow": - return case "follow_request": - return case "mention": - return case "reblog": - return case "favourite": - return case "status": - return @@ -174,7 +172,7 @@ function renderNotification(notif, navigation) { } } -const UserTextJsx = (props) => { +const UserText = (props) => { return ( { ); }; -const NotificationJsx = (props) => { +const Notification = (props) => { return ( @@ -223,25 +221,25 @@ const NotificationJsx = (props) => { ); }; -const FollowJsx = (props) => { +const Follow = (props) => { return ( - - + has followed you. - + ); }; -const FollowRequestJsx = (props) => { +const FollowRequest = (props) => { return ( - { buttonLabel = { "Accept" } buttonCallback = { () => console.log("Request accepted") }> - + has requested to follow you. - + ); }; -const MentionJsx = (props) => { +const Mention = (props) => { let uri; let imageStyle; let thumbnailCallback; @@ -282,24 +280,24 @@ const MentionJsx = (props) => { } return ( - - + mentioned you: "{ props.data.status.content }" - + ); }; -const ReblogJsx = (props) => { +const Reblog = (props) => { return ( - { size = { 20 } style = { styles.notif.inlineIcon }/> - + shared your post. - + ); }; -const FavouriteJsx = (props) => { +const Favourite = (props) => { return ( - { color = "black" style = { styles.notif.inlineIcon }/> - + liked your post. - + ); }; -const StatusJsx = (props) => { +const Status = (props) => { return ( - - + just posted. - + ); }; -const NotificationsJsx = ({navigation}) => { +const Notifications = ({navigation}) => { const [state, setState] = useState({ loaded: false, }); @@ -378,7 +376,7 @@ const NotificationsJsx = ({navigation}) => { }, []); return ( - navigation = { navigation }> { state.loaded ? @@ -390,7 +388,7 @@ const NotificationsJsx = ({navigation}) => { : <> } - + ); } @@ -439,4 +437,4 @@ const styles = { bold: { fontWeight: "bold" }, }; -export default NotificationsJsx; +export default Notifications; diff --git a/src/components/pages/profile/settings.js b/src/components/pages/profile/settings.js index 89131d2..23b2174 100644 --- a/src/components/pages/profile/settings.js +++ b/src/components/pages/profile/settings.js @@ -19,9 +19,7 @@ import * as ImagePicker from 'expo-image-picker'; import { withoutHTML } from "src/interface/rendering"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators"; - -const SettingsJsx = (props) => { +const Settings = (props) => { const [state, setState] = useState({ loaded: false, }); @@ -136,7 +134,7 @@ const SettingsJsx = (props) => { return ( <> { state.loaded - ? + ? <> { - + : <> } @@ -289,4 +287,4 @@ const styles = { }, }; -export default SettingsJsx; +export default Settings; diff --git a/src/components/pages/publish.js b/src/components/pages/publish.js index e88617e..ad7b84a 100644 --- a/src/components/pages/publish.js +++ b/src/components/pages/publish.js @@ -9,7 +9,6 @@ import { import { Ionicons } from '@expo/vector-icons'; import { getAutoHeight } from "src/interface/rendering"; -import { ScreenWithTrayJsx } from "src/components/navigation/navigators"; import { TouchableOpacity } from "react-native-gesture-handler"; import mime from "mime"; @@ -18,7 +17,7 @@ import * as Permissions from "expo-permissions"; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; -const PublishJsx = ({ navigation }) => { +const Publish = ({ navigation }) => { const [ state, setState ] = useState({ loaded: false, }); @@ -131,9 +130,7 @@ const PublishJsx = ({ navigation }) => { return ( <> { state.loaded - ? + ? <> { - + : <> } @@ -243,4 +240,4 @@ const styles = { }, }; -export { PublishJsx as default }; +export { Publish as default }; diff --git a/src/components/pages/user-list.js b/src/components/pages/user-list.js index d935fbb..519e814 100644 --- a/src/components/pages/user-list.js +++ b/src/components/pages/user-list.js @@ -8,15 +8,14 @@ import { TouchableOpacity, } from "react-native"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators.js"; -import ModerateMenuJsx from "src/components/moderate-menu.js"; +import ModerateMenu from "src/components/moderate-menu.js"; -const UserListJsx = ({navigation}) => { +const UserList = ({navigation}) => { const data = navigation.getParam("data", []) const context = navigation.getParam("context", ""); return ( - + <> { context ? @@ -50,13 +49,13 @@ const UserListJsx = ({navigation}) => { - ) } - + ); }; @@ -100,4 +99,4 @@ const styles = { }, }; -export { UserListJsx as default }; +export { UserList as default }; diff --git a/src/components/pages/view-comments.js b/src/components/pages/view-comments.js index 396b9b1..d6878d1 100644 --- a/src/components/pages/view-comments.js +++ b/src/components/pages/view-comments.js @@ -19,8 +19,7 @@ import { } from "src/interface/rendering"; import { activeOrNot } from "src/interface/interactions"; -import TimelineViewJsx from "src/components/posts/timeline-view"; -import BackBarJsx from "src/components/navigation/back-bar"; +import TimelineView from "src/components/posts/timeline-view"; import { TouchableOpacity } from "react-native-gesture-handler"; import * as requests from "src/requests"; @@ -124,7 +123,7 @@ function threadify(descendants) { return sorted; } -const CommentJsx = (props) => { +const Comment = (props) => { const menuOptionsStyles = { optionWrapper: { // The wrapper around a single option paddingLeft: SCREEN_WIDTH / 15, @@ -234,13 +233,14 @@ const CommentJsx = (props) => { ); } -const ViewCommentsJsx = (props) => { +const ViewComments = (props) => { let [state, setState] = useState({ - postData: props.navigation.getParam("postData", null), loaded: false, reply: "", }); + const postData = props.route.params.postData; + useEffect(() => { let profile, instance, accessToken; AsyncStorage @@ -254,7 +254,7 @@ const ViewCommentsJsx = (props) => { accessToken = JSON.parse(tokenPair[1]).access_token; return requests - .fetchStatusContext(instance, state.postData.id, accessToken) + .fetchStatusContext(instance, postData.id, accessToken) }) .then(context => { setState({...state, @@ -263,8 +263,8 @@ const ViewCommentsJsx = (props) => { instance, accessToken, inReplyTo: { - acct: state.postData.account.acct, - id: state.postData.id, + acct: postData.account.acct, + id: postData.id, }, loaded: true, }); @@ -275,7 +275,7 @@ const ViewCommentsJsx = (props) => { // Fetch an updated context to rerender the page const { descendants } = await requests.fetchStatusContext( state.instance, - state.postData.id, + postData.id, state.accessToken, ); @@ -291,7 +291,7 @@ const ViewCommentsJsx = (props) => { * Returns a new collection of threads without the comment with the * given id */ - + return state.descendants.map(thread => thread.filter(comment => comment.id != id) ).filter(thread => thread.length > 0); @@ -351,8 +351,8 @@ const ViewCommentsJsx = (props) => { const _handleCancelSubReply = () => { setState({...state, inReplyTo: { - acct: state.postData.account.acct, - id: state.postData.id, + acct: postData.account.acct, + id: postData.id, }, }); }; @@ -371,8 +371,8 @@ const ViewCommentsJsx = (props) => { setState({...state, // Reset the comment form inReplyTo: { - acct: state.postData.account.acct, - id: state.postData.id, + acct: postData.account.acct, + id: postData.id, }, reply: "", @@ -383,7 +383,7 @@ const ViewCommentsJsx = (props) => { }; const PartialComment = (props) => ( - { <> { state.loaded ? - - { state.loaded ? + data = { postData } /> { state.descendants.length != 0 @@ -443,7 +441,7 @@ const ViewCommentsJsx = (props) => { <> - { state.inReplyTo.id != state.postData.id + { state.inReplyTo.id != postData.id ? @@ -582,4 +580,4 @@ const styles = { }, }; -export default ViewCommentsJsx; +export default ViewComments; diff --git a/src/components/pages/view-post.js b/src/components/pages/view-post.js index 4d0c63b..540369f 100644 --- a/src/components/pages/view-post.js +++ b/src/components/pages/view-post.js @@ -1,32 +1,20 @@ -import React, { useState, useEffect } from "react"; +import React from "react"; +import { ScrollView } from "react-native"; -import { ScreenWithBackBarJsx } from "src/components/navigation/navigators"; -import { PostByDataJsx } from "src/components/posts/post"; +import { PostByData } from "src/components/posts/post"; -const ViewPostJsx = ({navigation}) => { - const [state, setState] = useState({ - post: navigation.getParam("post", null), - loaded: false, - }); +const ViewPost = ({ navigation, route }) => ( + + navigation.goBack() + } + afterModerate = { + () => navigation.goBack() + } + data = { route.params.post } /> + +) - if (state.post == null) { - throw Error("Post not given when navigating to ViewPost!"); - } - - return ( - - navigation.goBack() - } - afterModerate = { - () => navigation.goBack() - } - data = { state.post } /> - - ); -} - -export default ViewPostJsx; +export default ViewPost; diff --git a/src/components/posts/grid-view.js b/src/components/posts/grid-view.js index d925ba6..bf3a5a4 100644 --- a/src/components/posts/grid-view.js +++ b/src/components/posts/grid-view.js @@ -16,7 +16,7 @@ function partition(arr, size) { return newArray } -const GridPostJsx = (props) => { +const GridPost = (props) => { return ( { @@ -33,7 +33,7 @@ const GridPostJsx = (props) => { ) } -const GridViewJsx = (props) => { +const GridView = (props) => { // Ensure only posts with media get into the grid const postsWithMedia = props.posts.filter( p => p.media_attachments != null @@ -52,7 +52,7 @@ const GridViewJsx = (props) => { row.map((post) => { return ( - @@ -80,4 +80,4 @@ const styles = { }, }; -export default GridViewJsx; +export default GridView; diff --git a/src/components/posts/paged-grid.js b/src/components/posts/paged-grid.js index cab3627..fbde599 100644 --- a/src/components/posts/paged-grid.js +++ b/src/components/posts/paged-grid.js @@ -1,7 +1,7 @@ import React, { useState, useEffect } from "react"; import { View, TouchableOpacity, Text } from "react-native"; -import GridViewJsx from "src/components/posts/grid-view"; +import GridView from "src/components/posts/grid-view"; const TEST_IMAGE = "https://cache.desktopnexus.com/thumbseg/2255/2255124-bigthumbnail.jpg"; const TEST_POSTS = [ @@ -34,7 +34,7 @@ const TEST_POSTS = [ const PagedGridJSX = (props) => { return ( - { +const PostAction = (props) => { return ( @@ -28,7 +28,7 @@ const PostActionJsx = (props) => { ) } -const PostActionBarJsx = (props) => { +const PostActionBar = (props) => { const icons = { heart: { active: "heart", @@ -45,17 +45,17 @@ const PostActionBarJsx = (props) => { } return ( - - - @@ -71,4 +71,4 @@ const styles = { }, } -export default PostActionBarJsx; +export default PostActionBar; diff --git a/src/components/posts/post.js b/src/components/posts/post.js index 26f899c..b4cb6ac 100644 --- a/src/components/posts/post.js +++ b/src/components/posts/post.js @@ -20,13 +20,12 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; import { withLeadingAcct } from "src/interface/rendering"; -import PostActionBarJsx from "src/components/posts/post-action-bar"; +import PostActionBar from "src/components/posts/post-action-bar"; import { MenuOption } from "react-native-popup-menu"; -import ContextMenuJsx from "src/components/context-menu.js"; +import ContextMenu from "src/components/context-menu.js"; const SCREEN_WIDTH = Dimensions.get("window").width; -const TEST_IMAGE = "https://cache.desktopnexus.com/thumbseg/2255/2255124-bigthumbnail.jpg"; function getDimensionsPromises(uris) { return uris.map(attachment => new Promise(resolve => { @@ -52,19 +51,18 @@ function handleFavouriteFactory(state, setState) { }; } -const PostImageJsx = (props) => { +const PostImage = (props) => { return }; -export const RawPostJsx = (props) => { +export const RawPost = (props) => { const repliesCount = props.data.replies_count; let commentsText; @@ -95,7 +93,7 @@ export const RawPostJsx = (props) => { { props.data.account.acct } - { props.own @@ -116,7 +114,7 @@ export const RawPostJsx = (props) => { text = "Block" /> } - + { props.data.media_attachments.length > 1 ? @@ -129,7 +127,7 @@ export const RawPostJsx = (props) => { { props.data.media_attachments .map((attachment, i) => { - return ( { }) } - : } - { props.navigation.navigate("ViewComments", { - originTab: props.navigation.getParam("originTab"), postData: props.data }) }> @@ -178,7 +175,7 @@ export const RawPostJsx = (props) => { ); } -export const PostByDataJsx = (props) => { +export const PostByData = (props) => { /* * Renders a post where the data is supplied directly to the element through * its properties, as it is in a timeline. @@ -211,7 +208,7 @@ export const PostByDataJsx = (props) => { ) .then(dimensions => { setState({...state, - dimensions: dimensions, + dimensions, instance, accessToken, own, @@ -284,7 +281,6 @@ export const PostByDataJsx = (props) => { state.accessToken ); } - console.warn(newStatus.bookmarked); setState({...state, data: newStatus, @@ -350,7 +346,7 @@ export const PostByDataJsx = (props) => { return ( { state.loaded && !state.deleted ? - { onBlock = { _handleBlock } own = { state.own } navigation = { props.navigation }/> - : } + : <> } ); } diff --git a/src/components/posts/timeline-view.js b/src/components/posts/timeline-view.js index 71cedce..208603f 100644 --- a/src/components/posts/timeline-view.js +++ b/src/components/posts/timeline-view.js @@ -1,9 +1,9 @@ import React, { useState, useEffect } from "react"; import { View } from "react-native"; -import { PostByDataJsx } from "src/components/posts/post"; +import { PostByData } from "src/components/posts/post"; -const TimelineViewJsx = (props) => { +const TimelineView = (props) => { // Count the number of posts that have already loaded const [postsLoaded, setPostsLoaded] = useState(0); @@ -30,7 +30,7 @@ const TimelineViewJsx = (props) => { { props.posts.map((post, i) => { return ( - @@ -41,4 +41,4 @@ const TimelineViewJsx = (props) => { ); }; -export default TimelineViewJsx; +export default TimelineView;