From cfae8523a18bdc89ad7de3fb5368fbd4408adeae Mon Sep 17 00:00:00 2001 From: tigattack <10629864+tigattack@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:22:08 +0000 Subject: [PATCH 01/75] [cli] Don't perform CLI secret initialisation when not needed Calling `GetOrCreateClISecret()` can cause issues in some unattended scenarios. --- cli/main.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/cli/main.go b/cli/main.go index 7b0312485e..79c8500dc3 100644 --- a/cli/main.go +++ b/cli/main.go @@ -49,14 +49,28 @@ func main() { panic(err) } } + + // Define a set of commands that do not require KeyHolder initialisation. + skipKeyHolderCommands := map[string]struct{}{"version": {}, "docs": {}, "help": {}} + + var keyHolder *secrets.KeyHolder + + // Only initialise KeyHolder if the command isn't in the skip list. + if len(os.Args) > 1 { + if _, skip := skipKeyHolderCommands[os.Args[1]]; !skip { + keyHolder = secrets.NewKeyHolder(secrets.GetOrCreateClISecret()) + } + } + ctrl := pkg.ClICtrl{ Client: api.NewClient(api.Params{ Debug: viper.GetBool("log.http"), Host: viper.GetString("endpoint.api"), }), DB: db, - KeyHolder: secrets.NewKeyHolder(secrets.GetOrCreateClISecret()), + KeyHolder: keyHolder, } + err = ctrl.Init() if err != nil { panic(err) From a1f0c1024b2d9dfd16e3f5c41b0e5bf13a12862a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:59:44 +0530 Subject: [PATCH 02/75] [staff] Fix disable 2FA --- infra/staff/src/components/Disable2FA.tsx | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/infra/staff/src/components/Disable2FA.tsx b/infra/staff/src/components/Disable2FA.tsx index c43dbd0992..d26e91093e 100644 --- a/infra/staff/src/components/Disable2FA.tsx +++ b/infra/staff/src/components/Disable2FA.tsx @@ -50,24 +50,33 @@ const Disable2FA: React.FC = ({ const encodedToken = encodeURIComponent(token); // Fetch user data - const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - const userResponse = await fetch(userUrl); + const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const userResponse = await fetch(userUrl, { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Auth-Token": encodedToken, + }, + }); if (!userResponse.ok) { throw new Error("Failed to fetch user data"); } const userData = (await userResponse.json()) as UserData; - const userId = userData.subscription?.userID; + const userID = userData.subscription?.userID; - if (!userId) { + if (!userID) { throw new Error("User ID not found"); } // Disable 2FA - const disableUrl = `${apiOrigin}/admin/user/disable-2fa?token=${encodedToken}`; - const body = JSON.stringify({ userId }); + const disableUrl = `${apiOrigin}/admin/user/disable-2fa`; + const body = JSON.stringify({ userID }); const disableResponse = await fetch(disableUrl, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "X-Auth-Token": encodedToken, + }, body: body, }); From eb949bcad9b46fc34166f4b79c5e6d87b805ca72 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:07:24 +0530 Subject: [PATCH 03/75] [staff] Lint fix --- infra/staff/src/components/Disable2FA.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/infra/staff/src/components/Disable2FA.tsx b/infra/staff/src/components/Disable2FA.tsx index d26e91093e..b7a14c2de8 100644 --- a/infra/staff/src/components/Disable2FA.tsx +++ b/infra/staff/src/components/Disable2FA.tsx @@ -53,10 +53,10 @@ const Disable2FA: React.FC = ({ const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}`; const userResponse = await fetch(userUrl, { method: "GET", - headers: { + headers: { "Content-Type": "application/json", "X-Auth-Token": encodedToken, - }, + }, }); if (!userResponse.ok) { throw new Error("Failed to fetch user data"); @@ -73,10 +73,10 @@ const Disable2FA: React.FC = ({ const body = JSON.stringify({ userID }); const disableResponse = await fetch(disableUrl, { method: "POST", - headers: { + headers: { "Content-Type": "application/json", "X-Auth-Token": encodedToken, - }, + }, body: body, }); From f2210fbbaeedcaafaecbe5c1c99e2dd6507d4474 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:01:38 +0530 Subject: [PATCH 04/75] [staff] Surface error as dialog --- infra/staff/src/components/Disable2FA.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/infra/staff/src/components/Disable2FA.tsx b/infra/staff/src/components/Disable2FA.tsx index b7a14c2de8..29a3a6cd5a 100644 --- a/infra/staff/src/components/Disable2FA.tsx +++ b/infra/staff/src/components/Disable2FA.tsx @@ -47,7 +47,6 @@ const Disable2FA: React.FC = ({ } const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); // Fetch user data const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}`; @@ -55,7 +54,7 @@ const Disable2FA: React.FC = ({ method: "GET", headers: { "Content-Type": "application/json", - "X-Auth-Token": encodedToken, + "X-Auth-Token": token, }, }); if (!userResponse.ok) { @@ -75,7 +74,7 @@ const Disable2FA: React.FC = ({ method: "POST", headers: { "Content-Type": "application/json", - "X-Auth-Token": encodedToken, + "X-Auth-Token": token, }, body: body, }); @@ -84,12 +83,15 @@ const Disable2FA: React.FC = ({ const errorResponse = await disableResponse.text(); throw new Error(`Failed to disable 2FA: ${errorResponse}`); } - handleDisable2FA(); // Notify parent component of successful disable handleClose(); // Close dialog on successful disable console.log("2FA disabled successfully"); } catch (error) { - console.error("Error disabling 2FA:", error); + if (error instanceof Error) { + alert(error.message); + } else { + alert("Failed to disable 2FA"); + } } finally { setLoading(false); } From 9f9567817db9fb546f863dc38328d1599d7517bf Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:15:52 +0530 Subject: [PATCH 05/75] [staff]Suraface error as alert & send token via header --- infra/staff/src/App.tsx | 12 +- infra/staff/src/components/ChangeEmail.tsx | 8 +- infra/staff/src/components/CloseFamily.tsx | 25 +- infra/staff/src/components/DeleteAccont.tsx | 17 +- .../staff/src/components/DisablePasskeys.tsx | 24 +- .../src/components/FamilyComponentTable.tsx | 12 +- .../components/StorageBonusTableComponent.tsx | 12 +- .../src/components/UpdateSubscription.tsx | 16 +- infra/staff/yarn.lock | 541 +++++++++++++++++- 9 files changed, 610 insertions(+), 57 deletions(-) diff --git a/infra/staff/src/App.tsx b/infra/staff/src/App.tsx index a3c4761f3e..bb3e04f78f 100644 --- a/infra/staff/src/App.tsx +++ b/infra/staff/src/App.tsx @@ -119,10 +119,14 @@ const App: React.FC = () => { const startTime = Date.now(); try { const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); - const url = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - console.log(`Fetching data from URL: ${url}`); - const response = await fetch(url); + + const url = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const response = await fetch(url, { + headers: { + "Content-Type": "application/json", + "X-AUTH-TOKEN": token, + }, + }); if (!response.ok) { throw new Error("Network response was not ok"); } diff --git a/infra/staff/src/components/ChangeEmail.tsx b/infra/staff/src/components/ChangeEmail.tsx index 68da6abb79..26407af50e 100644 --- a/infra/staff/src/components/ChangeEmail.tsx +++ b/infra/staff/src/components/ChangeEmail.tsx @@ -31,20 +31,18 @@ const ChangeEmail: React.FC = ({ open, onClose }) => { useEffect(() => { const fetchUserID = async () => { - const token = getToken(); const email = getEmail(); setNewEmail(email); // Set initial email state const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); - const url = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; + const url = `${apiOrigin}/admin/user?email=${encodedEmail}`; try { const response = await fetch(url, { method: "GET", headers: { "Content-Type": "application/json", - "X-AUTH-TOKEN": token, + "X-AUTH-TOKEN": getToken(), }, }); @@ -78,7 +76,7 @@ const ChangeEmail: React.FC = ({ open, onClose }) => { event.preventDefault(); const token = getToken(); - const url = `${apiOrigin}/admin/user/change-email?token=${token}`; + const url = `${apiOrigin}/admin/user/change-email`; const body = { userID, diff --git a/infra/staff/src/components/CloseFamily.tsx b/infra/staff/src/components/CloseFamily.tsx index 303d8b0dfe..145c11b505 100644 --- a/infra/staff/src/components/CloseFamily.tsx +++ b/infra/staff/src/components/CloseFamily.tsx @@ -47,11 +47,16 @@ const CloseFamily: React.FC = ({ } const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); // Fetch user data - const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - const userResponse = await fetch(userUrl); + const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const userResponse = await fetch(userUrl, { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, + }); if (!userResponse.ok) { throw new Error("Failed to fetch user data"); } @@ -63,11 +68,14 @@ const CloseFamily: React.FC = ({ } // Close family action - const closeFamilyUrl = `${apiOrigin}/admin/user/close-family?token=${encodedToken}`; + const closeFamilyUrl = `${apiOrigin}/admin/user/close-family`; const body = JSON.stringify({ userId }); const closeFamilyResponse = await fetch(closeFamilyUrl, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, body: body, }); @@ -78,9 +86,12 @@ const CloseFamily: React.FC = ({ handleCloseFamily(); // Notify parent component of successful action handleClose(); // Close dialog on successful action - console.log("Family closed successfully"); } catch (error) { - console.error("Error closing family:", error); + if (error instanceof Error) { + alert(error.message); + } else { + alert("Failed to close family"); + } } finally { setLoading(false); } diff --git a/infra/staff/src/components/DeleteAccont.tsx b/infra/staff/src/components/DeleteAccont.tsx index 84c9c47fa2..f1acb48b1a 100644 --- a/infra/staff/src/components/DeleteAccont.tsx +++ b/infra/staff/src/components/DeleteAccont.tsx @@ -21,17 +21,24 @@ const DeleteAccount: React.FC = ({ open, handleClose }) => { try { const encodedEmail = encodeURIComponent(getEmail()); console.log(encodedEmail); - const encodedToken = encodeURIComponent(getToken()); - console.log(encodedToken); - const deleteUrl = `${apiOrigin}/admin/user/delete?email=${encodedEmail}&token=${encodedToken}`; - const response = await fetch(deleteUrl, { method: "DELETE" }); + const token = getToken(); + + const deleteUrl = `${apiOrigin}/admin/user/delete?email=${encodedEmail}`; + const response = await fetch(deleteUrl, { + method: "DELETE", + headers: { "X-Auth-Token": token }, + }); if (!response.ok) { throw new Error("Failed to delete user account"); } handleClose(); // Close dialog on successful delete console.log("Account deleted successfully"); } catch (error) { - console.error("Error deleting user account:", error); + if (error instanceof Error) { + alert("Failed to delete the account: " + error.message); + } else { + alert("An error occurred while deleting the account"); + } } }; diff --git a/infra/staff/src/components/DisablePasskeys.tsx b/infra/staff/src/components/DisablePasskeys.tsx index 175c9631f2..824b2f2f87 100644 --- a/infra/staff/src/components/DisablePasskeys.tsx +++ b/infra/staff/src/components/DisablePasskeys.tsx @@ -47,11 +47,16 @@ const DisablePasskeys: React.FC = ({ } const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); // Fetch user data - const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - const userResponse = await fetch(userUrl); + const userUrl = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const userResponse = await fetch(userUrl, { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, + }); if (!userResponse.ok) { throw new Error("Failed to fetch user data"); } @@ -63,11 +68,14 @@ const DisablePasskeys: React.FC = ({ } // Disable passkeys action - const disablePasskeysUrl = `${apiOrigin}/admin/user/disable-passkeys?token=${encodedToken}`; + const disablePasskeysUrl = `${apiOrigin}/admin/user/disable-passkeys`; const body = JSON.stringify({ userId }); const disablePasskeysResponse = await fetch(disablePasskeysUrl, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, body: body, }); @@ -80,7 +88,11 @@ const DisablePasskeys: React.FC = ({ handleClose(); // Close dialog on successful action console.log("Passkeys disabled successfully"); } catch (error) { - console.error("Error disabling passkeys:", error); + if (error instanceof Error) { + alert(error.message); + } else { + alert("Failed to disable passkeys"); + } } finally { setLoading(false); } diff --git a/infra/staff/src/components/FamilyComponentTable.tsx b/infra/staff/src/components/FamilyComponentTable.tsx index 2035ecda28..2171b3aeda 100644 --- a/infra/staff/src/components/FamilyComponentTable.tsx +++ b/infra/staff/src/components/FamilyComponentTable.tsx @@ -40,9 +40,15 @@ const FamilyTableComponent: React.FC = () => { const fetchData = async () => { try { const encodedEmail = encodeURIComponent(getEmail()); - const encodedToken = encodeURIComponent(getToken()); - const url = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - const response = await fetch(url); + const token = getToken(); + const url = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, + }); if (!response.ok) { throw new Error("Network response was not ok"); } diff --git a/infra/staff/src/components/StorageBonusTableComponent.tsx b/infra/staff/src/components/StorageBonusTableComponent.tsx index e914358f5a..2d26edc82a 100644 --- a/infra/staff/src/components/StorageBonusTableComponent.tsx +++ b/infra/staff/src/components/StorageBonusTableComponent.tsx @@ -37,9 +37,15 @@ const StorageBonusTableComponent: React.FC = () => { const fetchData = async () => { try { const encodedEmail = encodeURIComponent(getEmail()); - const encodedToken = encodeURIComponent(getToken()); - const url = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - const response = await fetch(url); + const token = getToken(); + const url = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Auth-Token": token, + }, + }); if (!response.ok) { throw new Error("Failed to fetch bonus data"); } diff --git a/infra/staff/src/components/UpdateSubscription.tsx b/infra/staff/src/components/UpdateSubscription.tsx index cf4ee404da..9a640646be 100644 --- a/infra/staff/src/components/UpdateSubscription.tsx +++ b/infra/staff/src/components/UpdateSubscription.tsx @@ -63,10 +63,12 @@ const UpdateSubscription: React.FC = ({ const email = getEmail(); const token = getToken(); const encodedEmail = encodeURIComponent(email); - const encodedToken = encodeURIComponent(token); - const url = `${apiOrigin}/admin/user?email=${encodedEmail}&token=${encodedToken}`; - - const response = await fetch(url); + const url = `${apiOrigin}/admin/user?email=${encodedEmail}`; + const response = await fetch(url, { + headers: { + "X-AUTH-TOKEN": token, + }, + }); if (!response.ok) { throw new Error("Network response was not ok"); } @@ -172,7 +174,11 @@ const UpdateSubscription: React.FC = ({ console.log("Subscription updated successfully"); onClose(); } catch (error) { - console.error("Error updating subscription:", error); + if (error instanceof Error) { + alert(`Failed to update subscription: ${error.message}`); + } else { + alert("Failed to update subscription"); + } } })().catch((error: unknown) => { console.error("Unhandled promise rejection:", error); diff --git a/infra/staff/yarn.lock b/infra/staff/yarn.lock index 6e982d4676..f3bf85dcd0 100644 --- a/infra/staff/yarn.lock +++ b/infra/staff/yarn.lock @@ -10,6 +10,15 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/code-frame@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz" @@ -54,6 +63,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-compilation-targets@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz" @@ -85,6 +105,14 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-module-imports@^7.16.7": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-imports@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz" @@ -127,11 +155,21 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz" integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz" integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz" @@ -160,6 +198,13 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz" integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + "@babel/plugin-transform-react-jsx-self@^7.24.5": version "7.24.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz" @@ -174,6 +219,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.6" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.9", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz" @@ -183,6 +235,15 @@ "@babel/parser" "^7.24.6" "@babel/types" "^7.24.6" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/traverse@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz" @@ -199,6 +260,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.6": version "7.24.6" resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz" @@ -208,6 +282,133 @@ "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@date-io/core@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-3.0.0.tgz#9fd2375383b5791b7211dfce3e576211f9ddce5e" + integrity sha512-S3j+IAQVBYNkQzchVVhX40eBkGDreBpScy9RXwTS5j2+k07+62pMVPisQ44Gq76Rqy5AOG/EZXCwBpY/jbemvA== + +"@date-io/date-fns@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-3.0.0.tgz#b082daa73ab9f1f8be55fe99a529653f69a7275b" + integrity sha512-hsLAbsdP8LKfi7OQ729cXMWfmHQEq0hn3ysXfAAoc92j6j6sBq0s0tplnkWu6O4iBUpVCYRPGuNjQQhTaOu2AA== + dependencies: + "@date-io/core" "^3.0.0" + +"@emotion/babel-plugin@^11.12.0": + version "11.12.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2" + integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.2.0" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0", "@emotion/cache@^11.13.0": + version "11.13.1" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7" + integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw== + dependencies: + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.0" + "@emotion/weak-memoize" "^0.4.0" + stylis "4.2.0" + +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@emotion/is-prop-valid@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240" + integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw== + dependencies: + "@emotion/memoize" "^0.9.0" + +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.11.4": + version "11.13.3" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4" + integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.12.0" + "@emotion/cache" "^11.13.0" + "@emotion/serialize" "^1.3.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" + "@emotion/utils" "^1.4.0" + "@emotion/weak-memoize" "^0.4.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a" + integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA== + dependencies: + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== + +"@emotion/styled@^11.11.5": + version "11.13.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.0.tgz#633fd700db701472c7a5dbef54d6f9834e9fb190" + integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.12.0" + "@emotion/is-prop-valid" "^1.3.0" + "@emotion/serialize" "^1.3.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" + "@emotion/utils" "^1.4.0" + +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + +"@emotion/use-insertion-effect-with-fallbacks@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" + integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== + +"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad" + integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA== + +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== + "@esbuild/aix-ppc64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" @@ -370,6 +571,13 @@ "@floating-ui/core" "^1.0.0" "@floating-ui/utils" "^0.2.0" +"@floating-ui/react-dom@^2.0.8", "@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + "@floating-ui/react-dom@^2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz" @@ -386,11 +594,25 @@ "@floating-ui/utils" "^0.2.0" tabbable "^6.0.0" +"@floating-ui/react@^0.26.23": + version "0.26.27" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.27.tgz#402f7b4b2702650662705fe9cbe0f1d5607846a1" + integrity sha512-jLP72x0Kr2CgY6eTYi/ra3VA9LOkTo4C+DUTrbFgFOExKy3omYVmwMjNKqxAHdsnyLS96BIDLcO2SlnsNf8KUQ== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + "@floating-ui/utils@^0.2.0": version "0.2.2" resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -442,6 +664,145 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mui/base@5.0.0-beta.40": + version "5.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.40.tgz#1f8a782f1fbf3f84a961e954c8176b187de3dae2" + integrity sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@floating-ui/react-dom" "^2.0.8" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" + "@popperjs/core" "^2.11.8" + clsx "^2.1.0" + prop-types "^15.8.1" + +"@mui/core-downloads-tracker@^5.16.7": + version "5.16.7" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz#182a325a520f7ebd75de051fceabfc0314cfd004" + integrity sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ== + +"@mui/icons-material@^5.16.0": + version "5.16.7" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.16.7.tgz#e27f901af792065efc9f3d75d74a66af7529a10a" + integrity sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q== + dependencies: + "@babel/runtime" "^7.23.9" + +"@mui/lab@^5.0.0-alpha.171": + version "5.0.0-alpha.173" + resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.173.tgz#a0f9696d93a765b48d69a7da5aaca0affa510ae8" + integrity sha512-Gt5zopIWwxDgGy/MXcp6GueD84xFFugFai4hYiXY0zowJpTVnIrTQCQXV004Q7rejJ7aaCntX9hpPJqCrioshA== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/base" "5.0.0-beta.40" + "@mui/system" "^5.16.5" + "@mui/types" "^7.2.15" + "@mui/utils" "^5.16.5" + clsx "^2.1.0" + prop-types "^15.8.1" + +"@mui/material@^5.16.0": + version "5.16.7" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.16.7.tgz#6e814e2eefdaf065a769cecf549c3569e107a50b" + integrity sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/core-downloads-tracker" "^5.16.7" + "@mui/system" "^5.16.7" + "@mui/types" "^7.2.15" + "@mui/utils" "^5.16.6" + "@popperjs/core" "^2.11.8" + "@types/react-transition-group" "^4.4.10" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + react-is "^18.3.1" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.16.6": + version "5.16.6" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.16.6.tgz#547671e7ae3f86b68d1289a0b90af04dfcc1c8c9" + integrity sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/utils" "^5.16.6" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.16.6": + version "5.16.6" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.16.6.tgz#60110c106dd482dfdb7e2aa94fd6490a0a3f8852" + integrity sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g== + dependencies: + "@babel/runtime" "^7.23.9" + "@emotion/cache" "^11.11.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/system@^5.16.5", "@mui/system@^5.16.7": + version "5.16.7" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.16.7.tgz#4583ca5bf3b38942e02c15a1e622ba869ac51393" + integrity sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/private-theming" "^5.16.6" + "@mui/styled-engine" "^5.16.6" + "@mui/types" "^7.2.15" + "@mui/utils" "^5.16.6" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/types@^7.2.14", "@mui/types@^7.2.15", "@mui/types@^7.2.19": + version "7.2.19" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.19.tgz#c941954dd24393fdce5f07830d44440cf4ab6c80" + integrity sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA== + +"@mui/utils@^5.15.14", "@mui/utils@^5.16.5", "@mui/utils@^5.16.6": + version "5.16.6" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.16.6.tgz#905875bbc58d3dcc24531c3314a6807aba22a711" + integrity sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/types" "^7.2.15" + "@types/prop-types" "^15.7.12" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^18.3.1" + +"@mui/utils@^5.16.6 || ^6.0.0": + version "6.1.7" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.7.tgz#0959d9772ae13c6ceac984a493e06aebb9087e71" + integrity sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw== + dependencies: + "@babel/runtime" "^7.26.0" + "@mui/types" "^7.2.19" + "@types/prop-types" "^15.7.13" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^18.3.1" + +"@mui/x-date-pickers@^7.9.0": + version "7.22.2" + resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-7.22.2.tgz#99ebf6ff3d5f926c8bceb43324c9d91022d79852" + integrity sha512-1KHSlIlnSoY3oHm820By8X344pIdGYqPvCCvfVHrEeeIQ/pHdxDD8tjZFWkFl4Jgm9oVFK90fMcqNZAzc+WaCw== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/utils" "^5.16.6 || ^6.0.0" + "@mui/x-internals" "7.21.0" + "@types/react-transition-group" "^4.4.11" + clsx "^2.1.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@mui/x-internals@7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-7.21.0.tgz#daca984059015b27efdb47bb44dc7ff4a6816673" + integrity sha512-94YNyZ0BhK5Z+Tkr90RKf47IVCW8R/1MvdUhh6MCQg6sZa74jsX+x+gEZ4kzuCqOsuyTyxikeQ8vVuCIQiP7UQ== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/utils" "^5.16.6 || ^6.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -468,6 +829,11 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@rollup/plugin-node-resolve@^15.2.3": version "15.2.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" @@ -607,11 +973,30 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/prop-types@^15.7.12", "@types/prop-types@^15.7.13": + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + +"@types/react-datepicker@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@types/react-datepicker/-/react-datepicker-6.2.0.tgz#1c93c10d12d1d683eacf46a82e35b953cd0da117" + integrity sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q== + dependencies: + "@floating-ui/react" "^0.26.2" + "@types/react" "*" + date-fns "^3.3.1" + "@types/react-dom@^18": version "18.3.0" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" @@ -619,6 +1004,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.11": + version "4.4.11" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" + integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18": version "18.3.3" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz" @@ -872,6 +1264,15 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -952,7 +1353,7 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -clsx@^2.1.0: +clsx@^2.1.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== @@ -986,11 +1387,27 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -1000,7 +1417,7 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -csstype@^3.0.2: +csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1103,11 +1520,26 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + electron-to-chromium@^1.4.668: version "1.4.788" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz" integrity sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" @@ -1444,6 +1876,11 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -1665,6 +2102,13 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" @@ -1713,6 +2157,11 @@ is-array-buffer@^3.0.4: call-bind "^1.0.2" get-intrinsic "^1.2.1" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" @@ -1930,11 +2379,21 @@ jsesc@^2.5.1: resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -1975,6 +2434,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -2150,6 +2614,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -2222,7 +2696,7 @@ prettier@^3: resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz" integrity sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g== -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -2241,16 +2715,15 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-datepicker@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.1.0.tgz" - integrity sha512-Z91n5ybhmzI+YChj1ZG7ntPPOmHR2Dh4jbIl+mNgKXKoxyzUQBh7M3eQaFOwrBCVdKy5vsj370/ocQlGu1qsGA== +react-datepicker@^7.3.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-7.5.0.tgz#e7b1014a6dbd3b314839a5c57a6dacfbb16074e4" + integrity sha512-6MzeamV8cWSOcduwePHfGqY40acuGlS1cG//ePHT6bVbLxWyqngaStenfH03n1wbzOibFggF66kWaBTb1SbTtQ== dependencies: - "@floating-ui/react" "^0.26.2" - clsx "^2.1.0" - date-fns "^3.3.1" - prop-types "^15.7.2" - react-onclickoutside "^6.13.0" + "@floating-ui/react" "^0.26.23" + clsx "^2.1.1" + date-fns "^3.6.0" + prop-types "^15.8.1" react-dom@^18: version "18.3.1" @@ -2260,15 +2733,15 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.2" -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-onclickoutside@^6.13.0: - version "6.13.1" - resolved "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz" - integrity sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w== +react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-refresh@^0.14.2: version "0.14.2" @@ -2282,6 +2755,16 @@ react-toastify@^10.0.5: dependencies: clsx "^2.1.0" +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" @@ -2302,6 +2785,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" @@ -2317,7 +2805,7 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.22.1: +resolve@^1.19.0, resolve@^1.22.1: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -2493,6 +2981,11 @@ source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + string.prototype.matchall@^4.0.11: version "4.0.11" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" @@ -2551,6 +3044,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -2779,6 +3277,11 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" From 916ae34bacd9c2faca5a7ce62a41de7d5b26615e Mon Sep 17 00:00:00 2001 From: Braky <53004544+DerBraky@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:24:01 +0100 Subject: [PATCH 06/75] Add three new icons (#4011) Includes custom icons for - Microsoft 365 - Raindrop.io - WEB.DE --- auth/assets/custom-icons/_data/custom-icons.json | 15 +++++++++++++++ auth/assets/custom-icons/icons/microsoft365.svg | 1 + auth/assets/custom-icons/icons/raindrop_io.svg | 1 + auth/assets/custom-icons/icons/web_de.svg | 1 + 4 files changed, 18 insertions(+) create mode 100644 auth/assets/custom-icons/icons/microsoft365.svg create mode 100644 auth/assets/custom-icons/icons/raindrop_io.svg create mode 100644 auth/assets/custom-icons/icons/web_de.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index dfcffe31bb..1e057ae1bf 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -629,6 +629,10 @@ { "title": "Microsoft" }, + { + "title": "Microsoft 365", + "slug": "microsoft365" + }, { "title": "Microsoft Azure" }, @@ -859,6 +863,13 @@ { "title": "Railway" }, + { + "title": "Raindrop.io", + "slug": "raindrop_io", + "altNames": [ + "Raindrop" + ] + }, { "title": "Rapidgator" }, @@ -1157,6 +1168,10 @@ { "title": "Wealthsimple" }, + { + "title": "WEB.DE", + "slug": "web_de" + }, { "title": "Wetransfer" }, diff --git a/auth/assets/custom-icons/icons/microsoft365.svg b/auth/assets/custom-icons/icons/microsoft365.svg new file mode 100644 index 0000000000..f03f8ff258 --- /dev/null +++ b/auth/assets/custom-icons/icons/microsoft365.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/raindrop_io.svg b/auth/assets/custom-icons/icons/raindrop_io.svg new file mode 100644 index 0000000000..246add360b --- /dev/null +++ b/auth/assets/custom-icons/icons/raindrop_io.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/web_de.svg b/auth/assets/custom-icons/icons/web_de.svg new file mode 100644 index 0000000000..4ae74af65a --- /dev/null +++ b/auth/assets/custom-icons/icons/web_de.svg @@ -0,0 +1 @@ + \ No newline at end of file From e9923fbf4425b2e22560007939ec3ea147405d17 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 14 Nov 2024 17:07:38 +0530 Subject: [PATCH 07/75] [mob][photos] Change UI of PersonSearchExample widget --- .../ui/viewer/file_details/face_widget.dart | 4 +- .../ui/viewer/search_tab/people_section.dart | 186 +++++++++--------- 2 files changed, 98 insertions(+), 92 deletions(-) diff --git a/mobile/lib/ui/viewer/file_details/face_widget.dart b/mobile/lib/ui/viewer/file_details/face_widget.dart index 15c506021a..5f2086cd9d 100644 --- a/mobile/lib/ui/viewer/file_details/face_widget.dart +++ b/mobile/lib/ui/viewer/file_details/face_widget.dart @@ -37,8 +37,8 @@ class FaceWidget extends StatefulWidget { this.clusterID, this.highlight = false, this.editMode = false, - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _FaceWidgetState(); diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index f118e101c3..8b3fd21d0a 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -1,6 +1,5 @@ import "dart:async"; -import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:photos/core/constants.dart"; import "package:photos/events/event.dart"; @@ -170,43 +169,32 @@ class SearchExampleRow extends StatelessWidget { @override Widget build(BuildContext context) { - //Cannot use listView.builder here - final scrollableExamples = []; - examples.forEachIndexed((index, element) { - scrollableExamples.add( - SearchExample( - searchResult: examples.elementAt(index), - ), - ); - }); return SizedBox( - child: SingleChildScrollView( + height: 128, + child: ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 7), physics: const BouncingScrollPhysics(), scrollDirection: Axis.horizontal, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: scrollableExamples, - ), + itemCount: examples.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: examples[index], + ); + }, + separatorBuilder: (context, index) => const SizedBox(width: 5), ), ); } } -class SearchExample extends StatelessWidget { +class PersonSearchExample extends StatelessWidget { final SearchResult searchResult; - const SearchExample({required this.searchResult, super.key}); + const PersonSearchExample({super.key, required this.searchResult}); @override Widget build(BuildContext context) { - final textScaleFactor = MediaQuery.textScaleFactorOf(context); final bool isCluster = (searchResult.type() == ResultType.faces && int.tryParse(searchResult.name()) != null); - late final double width; - if (textScaleFactor <= 1.0) { - width = 85.0; - } else { - width = 85.0 + ((textScaleFactor - 1.0) * 64); - } final heroTag = searchResult.heroTag() + (searchResult.previewThumbnail()?.tag ?? ""); return GestureDetector( @@ -222,22 +210,38 @@ class SearchExample extends StatelessWidget { ); } }, - child: SizedBox( - width: width, - child: Padding( - padding: const EdgeInsets.only(left: 6, right: 6, top: 8), - child: Column( - mainAxisSize: MainAxisSize.min, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Stack( + alignment: Alignment.center, children: [ + ClipPath( + clipper: ShapeBorderClipper( + shape: ContinuousRectangleBorder( + borderRadius: BorderRadius.circular(82), + ), + ), + child: Container( + width: 102, + height: 102, + decoration: BoxDecoration( + color: getEnteColorScheme(context).strokeFaint, + ), + ), + ), SizedBox( - width: 64, - height: 64, + width: 100, + height: 100, child: searchResult.previewThumbnail() != null ? Hero( tag: heroTag, - child: ClipRRect( - borderRadius: - const BorderRadius.all(Radius.elliptical(16, 12)), + child: ClipPath( + clipper: ShapeBorderClipper( + shape: ContinuousRectangleBorder( + borderRadius: BorderRadius.circular(80), + ), + ), child: searchResult.type() != ResultType.faces ? ThumbnailWidget( searchResult.previewThumbnail()!, @@ -246,67 +250,69 @@ class SearchExample extends StatelessWidget { : FaceSearchResult(searchResult, heroTag), ), ) - : const ClipRRect( - borderRadius: - BorderRadius.all(Radius.elliptical(16, 12)), - child: NoThumbnailWidget( + : ClipPath( + clipper: ShapeBorderClipper( + shape: ContinuousRectangleBorder( + borderRadius: BorderRadius.circular(80), + ), + ), + child: const NoThumbnailWidget( addBorder: false, ), ), ), - isCluster - ? GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () async { - final result = await showAssignPersonAction( - context, - clusterID: searchResult.name(), - ); - if (result != null && - result is (PersonEntity, EnteFile)) { - // ignore: unawaited_futures - routeToPage( - context, - PeoplePage( - person: result.$1, - searchResult: null, - ), - ); - } else if (result != null && result is PersonEntity) { - // ignore: unawaited_futures - routeToPage( - context, - PeoplePage( - person: result, - searchResult: null, - ), - ); - } - }, - child: Padding( - padding: const EdgeInsets.only(top: 10, bottom: 16), - child: Text( - "Add name", - maxLines: 1, - textAlign: TextAlign.center, - overflow: TextOverflow.ellipsis, - style: getEnteTextTheme(context).mini, - ), - ), - ) - : Padding( - padding: const EdgeInsets.only(top: 10, bottom: 16), - child: Text( - searchResult.name(), - maxLines: 2, - textAlign: TextAlign.center, - overflow: TextOverflow.ellipsis, - style: getEnteTextTheme(context).mini, - ), - ), ], ), - ), + isCluster + ? GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () async { + final result = await showAssignPersonAction( + context, + clusterID: searchResult.name(), + ); + if (result != null && result is (PersonEntity, EnteFile)) { + // ignore: unawaited_futures + routeToPage( + context, + PeoplePage( + person: result.$1, + searchResult: null, + ), + ); + } else if (result != null && result is PersonEntity) { + // ignore: unawaited_futures + routeToPage( + context, + PeoplePage( + person: result, + searchResult: null, + ), + ); + } + }, + child: Padding( + padding: const EdgeInsets.only(top: 6, bottom: 0), + child: Text( + "Add name", + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: getEnteTextTheme(context).small, + ), + ), + ) + : Padding( + padding: const EdgeInsets.only(top: 6, bottom: 0), + child: Text( + searchResult.name(), + maxLines: 2, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: getEnteTextTheme(context).small, + ), + ), + ], ), ); } From a5480025e9a1aafce9cba61176ea0ced6fcd996d Mon Sep 17 00:00:00 2001 From: tigattack <10629864+tigattack@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:01:49 +0000 Subject: [PATCH 08/75] Create custom icon for authentik (#4029) * Adds a custom icon for [authentik](https://goauthentik.io/). * Fixes minor formatting issues in `custom-icons.json`. --- auth/assets/custom-icons/_data/custom-icons.json | 15 +++++++++++---- auth/assets/custom-icons/icons/authentik.svg | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 auth/assets/custom-icons/icons/authentik.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 1e057ae1bf..b921aeccd4 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -48,6 +48,13 @@ { "title": "Aternos" }, + { + "title": "authentik", + "altNames": [ + "goauthentik" + ], + "hex": "fd4b2d" + }, { "title": "BaiduCloud", "altNames": [ @@ -194,7 +201,7 @@ { "title": "Capcom" }, - { + { "title": "Carta", "altNames": [ "Carta.com" @@ -524,7 +531,7 @@ { "title": "Kite" }, - { + { "title": "KnownHost", "altNames": [ "Known Host", @@ -532,7 +539,7 @@ ] }, { - "title": "Ko-fi", + "title": "Ko-fi", "altNames": [ "Ko fi", "Kofi" @@ -1086,7 +1093,7 @@ { "title": "Tresorit" }, - { + { "title": "TRowePrice", "altNames": [ "T Rowe Price", diff --git a/auth/assets/custom-icons/icons/authentik.svg b/auth/assets/custom-icons/icons/authentik.svg new file mode 100644 index 0000000000..cbabf59712 --- /dev/null +++ b/auth/assets/custom-icons/icons/authentik.svg @@ -0,0 +1 @@ + From ba314455e2a59602aa54c434ce0e9d326f778079 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 14 Nov 2024 22:05:53 +0530 Subject: [PATCH 09/75] [web] Show files that are archived in two ways in the archive section --- .../new/photos/components/gallery/reducer.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/web/packages/new/photos/components/gallery/reducer.ts b/web/packages/new/photos/components/gallery/reducer.ts index 83b98f1f28..7bd98fda94 100644 --- a/web/packages/new/photos/components/gallery/reducer.ts +++ b/web/packages/new/photos/components/gallery/reducer.ts @@ -1190,14 +1190,13 @@ const deriveAlbumsFilteredFiles = ( if (hiddenFileIDs.has(file.id)) return false; if (tempHiddenFileIDs.has(file.id)) return false; - // Files in archived collections can only be seen in their respective - // collection. - if (archivedCollectionIDs.has(file.collectionID)) { - return activeCollectionSummaryID === file.collectionID; - } - // Archived files can only be seen in the archive section, or in their // respective collection. + // + // Note that a file may both be archived, AND be part of an archived + // collection. Such files should be shown in both the archive section + // and in their respective collection. Thus this (archived file) case + // needs to be before the following (archived collection) case. if (isArchivedFile(file)) { return ( activeCollectionSummaryID === ARCHIVE_SECTION || @@ -1205,6 +1204,12 @@ const deriveAlbumsFilteredFiles = ( ); } + // Files in archived collections can only be seen in their respective + // collection. + if (archivedCollectionIDs.has(file.collectionID)) { + return activeCollectionSummaryID === file.collectionID; + } + // Show all remaining (non-hidden, non-archived) files in "All". if (activeCollectionSummaryID === ALL_SECTION) { return true; From 120053f61d1f0e420d30b161410840961fa9ed11 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Fri, 15 Nov 2024 02:24:13 +0530 Subject: [PATCH 10/75] fix: dismiss image editor on save edits --- mobile/lib/ui/tools/editor/image_editor_page.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/tools/editor/image_editor_page.dart b/mobile/lib/ui/tools/editor/image_editor_page.dart index e04133b931..26f2cc5f6f 100644 --- a/mobile/lib/ui/tools/editor/image_editor_page.dart +++ b/mobile/lib/ui/tools/editor/image_editor_page.dart @@ -387,6 +387,7 @@ class _ImageEditorPageState extends State { files.add(newFile); selectionIndex = files.length - 1; } + await dialog.hide(); replacePage( context, DetailPage( @@ -397,12 +398,12 @@ class _ImageEditorPageState extends State { ), ); } catch (e, s) { + await dialog.hide(); showToast(context, S.of(context).oopsCouldNotSaveEdits); _logger.severe(e, s); } finally { await PhotoManager.startChangeNotify(); } - await dialog.hide(); } void flip() { From 708109f5e411ab6b52645cd46cdc8cc0891a1099 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 08:42:58 +0530 Subject: [PATCH 11/75] [web] Retain original's file creation time on edits --- .../PhotoViewer/ImageEditorOverlay/index.tsx | 11 ++++---- .../src/services/upload/uploadManager.ts | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx index de5afca30b..848bf2e462 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx @@ -475,15 +475,14 @@ const ImageEditorOverlay = (props: IProps) => { ); const editedFile = await getEditedFile(); - const file = { - uploadItem: editedFile, - localID: 1, - collectionID: props.file.collectionID, - }; uploadManager.prepareForNewUpload(); uploadManager.showUploadProgressDialog(); - uploadManager.uploadItems([file], [collection]); + uploadManager.uploadFile( + editedFile, + collection, + props.file.metadata.creationTime, + ); setFileURL(null); props.onClose(); props.closePhotoViewer(); diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 700dbc9738..1a4dcb3908 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -450,6 +450,33 @@ class UploadManager { return this.uiService.hasFilesInResultList(); } + /** + * Upload a single file to the given collection. + * + * @param file A web {@link File} object representing the file to upload. + * + * @param collection The {@link Collection} in which the file should be added. + * + * @param creationTime The timestamp (unix epoch microseconds) to use as the + * `creationTime` of the newly created {@link EnteFile}. + */ + public async uploadFile( + file: File, + collection: Collection, + creationTime: number, + ) { + const item = { + uploadItem: file, + localID: 1, + collectionID: collection.id, + }; + this.parsedMetadataJSONMap.set( + getMetadataJSONMapKeyForJSON(collection.id, file.name), + { creationTime }, + ); + return this.uploadItems([item], [collection]); + } + private abortIfCancelled = () => { if (uploadCancelService.isUploadCancelationRequested()) { throw Error(CustomError.UPLOAD_CANCELLED); From 057bd3a4d2eb00a632b615df1caee14f14ebb0ce Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 10:21:12 +0530 Subject: [PATCH 12/75] Retain more info Also invent a new scheme for passing around this data instead of piggy backing on the JSON route, since the JSON route has other complications (e.g. it strips off the "-edited" prefix) that we'd anyways would've needed to workaround. --- .../PhotoViewer/ImageEditorOverlay/index.tsx | 6 +-- .../src/services/upload/upload-service.ts | 35 +++++++++++++-- .../src/services/upload/uploadManager.ts | 44 ++++++++++--------- web/packages/media/file.ts | 4 ++ 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx index 848bf2e462..248976a57b 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx @@ -478,11 +478,7 @@ const ImageEditorOverlay = (props: IProps) => { uploadManager.prepareForNewUpload(); uploadManager.showUploadProgressDialog(); - uploadManager.uploadFile( - editedFile, - collection, - props.file.metadata.creationTime, - ); + uploadManager.uploadFile(editedFile, collection, props.file); setFileURL(null); props.onClose(); props.closePhotoViewer(); diff --git a/web/apps/photos/src/services/upload/upload-service.ts b/web/apps/photos/src/services/upload/upload-service.ts index 35a1937c60..c08a08ad60 100644 --- a/web/apps/photos/src/services/upload/upload-service.ts +++ b/web/apps/photos/src/services/upload/upload-service.ts @@ -197,10 +197,25 @@ export const uploadItemFileName = (uploadItem: UploadItem) => { /* -- Various intermediate type used during upload -- */ -interface UploadAsset { +export interface UploadAsset { + /** `true` if this is a live photo. */ isLivePhoto?: boolean; - uploadItem?: UploadItem; + /* Valid for live photos */ livePhotoAssets?: LivePhotoAssets; + /* Valid for non-live photos */ + uploadItem?: UploadItem; + /** + * Metadata we know about a file externally. Valid for non-live photos. + * + * This is metadata that is not present within the file, but we have + * available from external sources. There is also a parsed metadata we + * obtain from JSON files. So together with the metadata present within the + * file itself, there are three places where the file's initial metadata can + * be filled in from. + * + * This will not be present for live photos. + */ + externalParsedMetadata?: ParsedMetadata; } interface ThumbnailedFile { @@ -871,7 +886,12 @@ interface ExtractAssetMetadataResult { * {@link parsedMetadataJSONMap} for the assets. Return the resultant metadatum. */ const extractAssetMetadata = async ( - { isLivePhoto, uploadItem, livePhotoAssets }: UploadAsset, + { + isLivePhoto, + uploadItem, + externalParsedMetadata, + livePhotoAssets, + }: UploadAsset, fileTypeInfo: FileTypeInfo, lastModifiedMs: number, collectionID: number, @@ -889,6 +909,7 @@ const extractAssetMetadata = async ( ) : await extractImageOrVideoMetadata( uploadItem, + externalParsedMetadata, fileTypeInfo, lastModifiedMs, collectionID, @@ -911,6 +932,7 @@ const extractLivePhotoMetadata = async ( const { metadata: imageMetadata, publicMagicMetadata } = await extractImageOrVideoMetadata( livePhotoAssets.image, + undefined, imageFileTypeInfo, lastModifiedMs, collectionID, @@ -935,6 +957,7 @@ const extractLivePhotoMetadata = async ( const extractImageOrVideoMetadata = async ( uploadItem: UploadItem, + externalParsedMetadata: ParsedMetadata | undefined, fileTypeInfo: FileTypeInfo, lastModifiedMs: number, collectionID: number, @@ -956,6 +979,12 @@ const extractImageOrVideoMetadata = async ( throw new Error(`Unexpected file type ${fileType} for ${uploadItem}`); } + // The `UploadAsset` itself might have metadata associated with a-priori, if + // so, merge the data we read from the file's contents into it. + if (externalParsedMetadata) { + parsedMetadata = { ...externalParsedMetadata, ...parsedMetadata }; + } + const hash = await computeHash(uploadItem, worker); // Some of this logic is duplicated in `uploadItemCreationDate`. diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 1a4dcb3908..12ddef9ee2 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -7,6 +7,7 @@ import { ComlinkWorker } from "@/base/worker/comlink-worker"; import { shouldDisableCFUploadProxy } from "@/gallery/upload"; import type { Collection } from "@/media/collection"; import { EncryptedEnteFile, EnteFile } from "@/media/file"; +import type { ParsedMetadata } from "@/media/file-metadata"; import { FileType } from "@/media/file-type"; import { potentialFileTypeFromExtension } from "@/media/live-photo"; import { getLocalFiles } from "@/new/photos/services/files"; @@ -38,6 +39,7 @@ import UploadService, { uploadItemFileName, uploader, type PotentialLivePhotoAsset, + type UploadAsset, } from "./upload-service"; export type FileID = number; @@ -85,13 +87,10 @@ export interface ProgressUpdater { /** The number of uploads to process in parallel. */ const maxConcurrentUploads = 4; -export interface UploadItemWithCollection { +export type UploadItemWithCollection = UploadAsset & { localID: number; collectionID: number; - isLivePhoto?: boolean; - uploadItem?: UploadItem; - livePhotoAssets?: LivePhotoAssets; -} +}; export interface LivePhotoAssets { image: UploadItem; @@ -455,25 +454,35 @@ class UploadManager { * * @param file A web {@link File} object representing the file to upload. * - * @param collection The {@link Collection} in which the file should be added. + * @param collection The {@link Collection} in which the file should be + * added. * - * @param creationTime The timestamp (unix epoch microseconds) to use as the - * `creationTime` of the newly created {@link EnteFile}. + * @param sourceEnteFile The {@link EnteFile} from which the file being + * uploaded has been derived. This is used to extract and reassociated + * relevant metadata to the newly uploaded file. */ public async uploadFile( file: File, collection: Collection, - creationTime: number, + sourceEnteFile: EnteFile, ) { + const timestamp = sourceEnteFile.metadata.creationTime; + const dateTime = sourceEnteFile.pubMagicMetadata.data.dateTime; + const offset = sourceEnteFile.pubMagicMetadata.data.offsetTime; + + const creationDate: ParsedMetadata["creationDate"] = { + timestamp, + dateTime, + offset, + }; + const item = { uploadItem: file, localID: 1, collectionID: collection.id, + externalParsedMetadata: { creationDate }, }; - this.parsedMetadataJSONMap.set( - getMetadataJSONMapKeyForJSON(collection.id, file.name), - { creationTime }, - ); + return this.uploadItems([item], [collection]); } @@ -732,7 +741,7 @@ export default new UploadManager(); * {@link collection}, giving us {@link UploadableUploadItem}. This is what * gets queued and then passed to the {@link uploader}. */ -type UploadItemWithCollectionIDAndName = { +type UploadItemWithCollectionIDAndName = UploadAsset & { /** A unique ID for the duration of the upload */ localID: number; /** The ID of the collection to which this file should be uploaded. */ @@ -743,12 +752,6 @@ type UploadItemWithCollectionIDAndName = { * In case of live photos, this'll be the name of the image part. */ fileName: string; - /** `true` if this is a live photo. */ - isLivePhoto?: boolean; - /* Valid for non-live photos */ - uploadItem?: UploadItem; - /* Valid for live photos */ - livePhotoAssets?: LivePhotoAssets; }; const makeUploadItemWithCollectionIDAndName = ( @@ -764,6 +767,7 @@ const makeUploadItemWithCollectionIDAndName = ( isLivePhoto: f.isLivePhoto, uploadItem: f.uploadItem, livePhotoAssets: f.livePhotoAssets, + externalParsedMetadata: f.externalParsedMetadata, }); /** diff --git a/web/packages/media/file.ts b/web/packages/media/file.ts index 1ec99b8a71..2be0a0dd1c 100644 --- a/web/packages/media/file.ts +++ b/web/packages/media/file.ts @@ -163,6 +163,10 @@ export interface FilePublicMagicMetadataProps { * Epoch microseconds. */ editedTime?: number; + /** See {@link PublicMagicMetadata} in file-metadata.ts */ + dateTime?: string; + /** See {@link PublicMagicMetadata} in file-metadata.ts */ + offsetTime?: string; /** * Edited name of the {@link EnteFile}. * From 184323429acb6213cdb1aa55b4b989c37b38089e Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 15 Nov 2024 13:22:29 +0530 Subject: [PATCH 13/75] [mob][photos] Create new 'All' page for people section --- .../result/people_section_all_page.dart | 67 +++++++++++++++++++ .../ui/viewer/search_tab/people_section.dart | 23 ++++--- 2 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 mobile/lib/ui/viewer/search/result/people_section_all_page.dart diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart new file mode 100644 index 0000000000..43ddc7f268 --- /dev/null +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/search/search_result.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/viewer/search_tab/people_section.dart"; + +class PeopleSectionAllPage extends StatelessWidget { + final Future> searchResults; + + const PeopleSectionAllPage({ + super.key, + required this.searchResults, + }); + + @override + Widget build(BuildContext context) { + final smallFontSize = getEnteTextTheme(context).small.fontSize!; + final textScaleFactor = + MediaQuery.textScalerOf(context).scale(smallFontSize) / smallFontSize; + const horizontalEdgePadding = 4.0; + const gridPadding = 16.0; + return Scaffold( + appBar: AppBar( + title: Text(S.of(context).people), + ), + body: FutureBuilder>( + future: searchResults, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Center(child: Text('No results found.')); + } else { + final results = snapshot.data!; + final screenWidth = MediaQuery.of(context).size.width; + final crossAxisCount = (screenWidth / 100).floor(); + + final itemSize = (screenWidth - + ((horizontalEdgePadding * 2) + + (crossAxisCount * gridPadding))) / + crossAxisCount; + + return GridView.builder( + padding: const EdgeInsets.all(horizontalEdgePadding), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + mainAxisSpacing: gridPadding, + crossAxisSpacing: gridPadding, + crossAxisCount: crossAxisCount, + childAspectRatio: + itemSize / (itemSize + (18 * textScaleFactor)), + ), + itemCount: results.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: results[index], + size: itemSize, + ); + }, + ); + } + }, + ), + ); + } +} diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 8b3fd21d0a..3460002583 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -16,9 +16,9 @@ import "package:photos/ui/viewer/file/no_thumbnail_widget.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/ui/viewer/people/add_person_action_sheet.dart"; import "package:photos/ui/viewer/people/people_page.dart"; +import "package:photos/ui/viewer/search/result/people_section_all_page.dart"; import 'package:photos/ui/viewer/search/result/person_face_widget.dart'; import "package:photos/ui/viewer/search/result/search_result_page.dart"; -import 'package:photos/ui/viewer/search/result/search_section_all_page.dart'; import "package:photos/ui/viewer/search/search_section_cta.dart"; import "package:photos/utils/navigation_util.dart"; @@ -86,8 +86,8 @@ class _PeopleSectionState extends State { if (shouldShowMore) { routeToPage( context, - SearchSectionAllPage( - sectionType: widget.sectionType, + PeopleSectionAllPage( + searchResults: Future.value(widget.examples), ), ); } @@ -189,7 +189,12 @@ class SearchExampleRow extends StatelessWidget { class PersonSearchExample extends StatelessWidget { final SearchResult searchResult; - const PersonSearchExample({super.key, required this.searchResult}); + final double size; + const PersonSearchExample({ + super.key, + required this.searchResult, + this.size = 102, + }); @override Widget build(BuildContext context) { @@ -223,16 +228,16 @@ class PersonSearchExample extends StatelessWidget { ), ), child: Container( - width: 102, - height: 102, + width: size, + height: size, decoration: BoxDecoration( color: getEnteColorScheme(context).strokeFaint, ), ), ), SizedBox( - width: 100, - height: 100, + width: size - 2, + height: size - 2, child: searchResult.previewThumbnail() != null ? Hero( tag: heroTag, @@ -306,7 +311,7 @@ class PersonSearchExample extends StatelessWidget { padding: const EdgeInsets.only(top: 6, bottom: 0), child: Text( searchResult.name(), - maxLines: 2, + maxLines: 1, textAlign: TextAlign.center, overflow: TextOverflow.ellipsis, style: getEnteTextTheme(context).small, From fe59e0ae65543d1c9a52049f28330db351f57469 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Fri, 15 Nov 2024 13:24:22 +0530 Subject: [PATCH 14/75] [server] Update constraints for adding BF deal by support --- server/ente/admin.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server/ente/admin.go b/server/ente/admin.go index 183675c19d..97aa64fde6 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -112,7 +112,7 @@ func (u SupportUpdateBonus) UpdateLog() string { func (u SupportUpdateBonus) Validate() error { isSupportBonus := u.BonusType == "ADD_ON_SUPPORT" - if u.BonusType != "ADD_ON_SUPPORT" && u.BonusType != "ADD_ON_BF_2023" { + if u.BonusType != "ADD_ON_SUPPORT" && u.BonusType != "ADD_ON_BF_2023" && u.BonusType != "ADD_ON_BF_2024" { return errors.New("invalid bonus type") } if u.Action == ADD || u.Action == UPDATE { @@ -121,7 +121,6 @@ func (u SupportUpdateBonus) Validate() error { return errors.New("invalid input, set in MB and minute for test") } } else { - if isSupportBonus { if u.Year == 0 || u.Year > 100 { return errors.New("invalid input for year, only 1-100") @@ -130,11 +129,11 @@ func (u SupportUpdateBonus) Validate() error { return errors.New("invalid GB storage, only 1-2000") } } else { - if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 1000 && u.StorageInGB != 50 { - return errors.New("invalid input for deal, only 50, 200, 1000, 2000 allowed") + if u.StorageInGB != 50 && u.StorageInGB != 200 && u.StorageInGB != 500 && u.StorageInGB != 1000 && u.StorageInGB != 2000 { + return errors.New("invalid input for deal, only 50, 200, 500, 1000, 2000 allowed") } - if u.Year != 3 && u.Year != 5 { - return errors.New("invalid input for year, only 3 or 5") + if u.Year != 3 && u.Year != 5 && u.Year != 10 { + return errors.New("invalid input for year, only 3 or 5 or 10") } } } From 39252122efad4a4a301c577d81be709d6ccd2dfb Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 15 Nov 2024 13:35:41 +0530 Subject: [PATCH 15/75] [mob][photos] Show all faces in 'All' section of faces --- .../result/people_section_all_page.dart | 44 ++++++++++++++++--- .../ui/viewer/search_tab/people_section.dart | 4 +- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 43ddc7f268..17cb144f3c 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -1,17 +1,51 @@ +import "dart:async"; + import 'package:flutter/material.dart'; +import "package:photos/events/event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/search/search_result.dart"; +import "package:photos/models/search/search_types.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/viewer/search_tab/people_section.dart"; -class PeopleSectionAllPage extends StatelessWidget { - final Future> searchResults; - +class PeopleSectionAllPage extends StatefulWidget { const PeopleSectionAllPage({ super.key, - required this.searchResults, }); + @override + State createState() => _PeopleSectionAllPageState(); +} + +class _PeopleSectionAllPageState extends State { + late Future> sectionData; + final streamSubscriptions = []; + + @override + void initState() { + super.initState(); + sectionData = SectionType.face.getData(context); + + final streamsToListenTo = SectionType.face.viewAllUpdateEvents(); + for (Stream stream in streamsToListenTo) { + streamSubscriptions.add( + stream.listen((event) async { + setState(() { + sectionData = SectionType.face.getData(context); + }); + }), + ); + } + } + + @override + void dispose() { + for (var subscriptions in streamSubscriptions) { + subscriptions.cancel(); + } + super.dispose(); + } + @override Widget build(BuildContext context) { final smallFontSize = getEnteTextTheme(context).small.fontSize!; @@ -24,7 +58,7 @@ class PeopleSectionAllPage extends StatelessWidget { title: Text(S.of(context).people), ), body: FutureBuilder>( - future: searchResults, + future: sectionData, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 3460002583..df5c929e31 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -86,9 +86,7 @@ class _PeopleSectionState extends State { if (shouldShowMore) { routeToPage( context, - PeopleSectionAllPage( - searchResults: Future.value(widget.examples), - ), + const PeopleSectionAllPage(), ); } }, From 8d2288fbb443dd7d75adc2fd8a1721b25aa4cf64 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 15:22:27 +0530 Subject: [PATCH 16/75] [mob][photos] super key --- mobile/lib/ui/components/notification_widget.dart | 4 ++-- mobile/lib/ui/home/header_widget.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/components/notification_widget.dart b/mobile/lib/ui/components/notification_widget.dart index 864e4c29c0..430b8a247b 100644 --- a/mobile/lib/ui/components/notification_widget.dart +++ b/mobile/lib/ui/components/notification_widget.dart @@ -25,7 +25,7 @@ class NotificationWidget extends StatelessWidget { final bool isBlackFriday; const NotificationWidget({ - Key? key, + super.key, required this.startIcon, required this.actionIcon, required this.text, @@ -33,7 +33,7 @@ class NotificationWidget extends StatelessWidget { this.isBlackFriday = false, this.subText, this.type = NotificationType.warning, - }) : super(key: key); + }); @override Widget build(BuildContext context) { diff --git a/mobile/lib/ui/home/header_widget.dart b/mobile/lib/ui/home/header_widget.dart index a322382f14..04ec237f37 100644 --- a/mobile/lib/ui/home/header_widget.dart +++ b/mobile/lib/ui/home/header_widget.dart @@ -5,8 +5,8 @@ import 'package:photos/ui/home/status_bar_widget.dart'; class HeaderWidget extends StatelessWidget { const HeaderWidget({ - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { From 27d5ef2bc06271f4607fe17de7878ea81d07d920 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 15 Nov 2024 15:31:53 +0530 Subject: [PATCH 17/75] [mob][photos] Fix alignment of faces in People section --- .../result/people_section_all_page.dart | 78 ++++++++++--------- .../ui/viewer/search_tab/people_section.dart | 4 +- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 17cb144f3c..6a5528fea3 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -51,50 +51,54 @@ class _PeopleSectionAllPageState extends State { final smallFontSize = getEnteTextTheme(context).small.fontSize!; final textScaleFactor = MediaQuery.textScalerOf(context).scale(smallFontSize) / smallFontSize; - const horizontalEdgePadding = 4.0; + const horizontalEdgePadding = 20.0; const gridPadding = 16.0; return Scaffold( appBar: AppBar( title: Text(S.of(context).people), ), - body: FutureBuilder>( - future: sectionData, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); - } else if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Center(child: Text('No results found.')); - } else { - final results = snapshot.data!; - final screenWidth = MediaQuery.of(context).size.width; - final crossAxisCount = (screenWidth / 100).floor(); + body: SafeArea( + child: FutureBuilder>( + future: sectionData, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Center(child: Text('No results found.')); + } else { + final results = snapshot.data!; + final screenWidth = MediaQuery.of(context).size.width; + final crossAxisCount = (screenWidth / 100).floor(); - final itemSize = (screenWidth - - ((horizontalEdgePadding * 2) + - (crossAxisCount * gridPadding))) / - crossAxisCount; + final itemSize = (screenWidth - + ((horizontalEdgePadding * 2) + + ((crossAxisCount - 1) * gridPadding))) / + crossAxisCount; - return GridView.builder( - padding: const EdgeInsets.all(horizontalEdgePadding), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - mainAxisSpacing: gridPadding, - crossAxisSpacing: gridPadding, - crossAxisCount: crossAxisCount, - childAspectRatio: - itemSize / (itemSize + (18 * textScaleFactor)), - ), - itemCount: results.length, - itemBuilder: (context, index) { - return PersonSearchExample( - searchResult: results[index], - size: itemSize, - ); - }, - ); - } - }, + return GridView.builder( + padding: const EdgeInsets.symmetric( + horizontal: horizontalEdgePadding, + ), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + mainAxisSpacing: gridPadding, + crossAxisSpacing: gridPadding, + crossAxisCount: crossAxisCount, + childAspectRatio: + itemSize / (itemSize + (24 * textScaleFactor)), + ), + itemCount: results.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: results[index], + size: itemSize, + ); + }, + ); + } + }, + ), ), ); } diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index df5c929e31..7ec0686ed2 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -170,7 +170,7 @@ class SearchExampleRow extends StatelessWidget { return SizedBox( height: 128, child: ListView.separated( - padding: const EdgeInsets.symmetric(horizontal: 7), + padding: const EdgeInsets.symmetric(horizontal: 6), physics: const BouncingScrollPhysics(), scrollDirection: Axis.horizontal, itemCount: examples.length, @@ -179,7 +179,7 @@ class SearchExampleRow extends StatelessWidget { searchResult: examples[index], ); }, - separatorBuilder: (context, index) => const SizedBox(width: 5), + separatorBuilder: (context, index) => const SizedBox(width: 3), ), ); } From 8a7e11e4af499175dbe832123182cf7eed22f65d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 15:37:35 +0530 Subject: [PATCH 18/75] [mob][photos] Enable ml banner --- mobile/lib/ui/home/status_bar_widget.dart | 36 ++++++++++++++++--- .../lib/ui/settings/ml/enable_ml_consent.dart | 4 +++ mobile/lib/utils/local_settings.dart | 7 ++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index df3efa0c1d..1eddcb1337 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -10,6 +10,7 @@ import 'package:photos/events/sync_status_update_event.dart'; import "package:photos/generated/l10n.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/sync_service.dart'; +import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/theme/ente_theme.dart"; import 'package:photos/theme/text_style.dart'; import 'package:photos/ui/account/verify_recovery_page.dart'; @@ -17,12 +18,13 @@ import 'package:photos/ui/components/home_header_widget.dart'; import 'package:photos/ui/components/notification_widget.dart'; import 'package:photos/ui/home/header_error_widget.dart'; import "package:photos/ui/settings/backup/backup_status_screen.dart"; +import "package:photos/ui/settings/ml/enable_ml_consent.dart"; import 'package:photos/utils/navigation_util.dart'; const double kContainerHeight = 36; class StatusBarWidget extends StatefulWidget { - const StatusBarWidget({Key? key}) : super(key: key); + const StatusBarWidget({super.key}); @override State createState() => _StatusBarWidgetState(); @@ -35,6 +37,9 @@ class _StatusBarWidgetState extends State { late StreamSubscription _notificationSubscription; bool _showStatus = false; bool _showErrorBanner = false; + final bool _showMlBanner = !userRemoteFlagService + .getCachedBoolValue(UserRemoteFlagService.mlEnabled) && + !localSettings.hasSeenMLEnablingBanner; Error? _syncError; @override @@ -112,8 +117,29 @@ class _StatusBarWidgetState extends State { _showErrorBanner ? HeaderErrorWidget(error: _syncError) : const SizedBox.shrink(), + _showMlBanner && !_showErrorBanner + ? Padding( + padding: + const EdgeInsets.symmetric(horizontal: 2.0, vertical: 12), + child: NotificationWidget( + startIcon: Icons.offline_bolt, + actionIcon: Icons.arrow_forward, + text: + "Enable machine learning for magic search and face recognition", + type: NotificationType.greenBanner, + onTap: () async => { + await routeToPage( + context, + const EnableMachineLearningConsent(), + forceCustomPageRoute: true, + ), + }, + ), + ) + : const SizedBox.shrink(), userRemoteFlagService.shouldShowRecoveryVerification() && - !_showErrorBanner + !_showErrorBanner && + !_showMlBanner ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), @@ -138,7 +164,7 @@ class _StatusBarWidgetState extends State { } class SyncStatusWidget extends StatefulWidget { - const SyncStatusWidget({Key? key}) : super(key: key); + const SyncStatusWidget({super.key}); @override State createState() => _SyncStatusWidgetState(); @@ -195,7 +221,7 @@ class RefreshIndicatorWidget extends StatelessWidget { final SyncStatusUpdate? event; - const RefreshIndicatorWidget(this.event, {Key? key}) : super(key: key); + const RefreshIndicatorWidget(this.event, {super.key}); @override Widget build(BuildContext context) { @@ -275,7 +301,7 @@ class RefreshIndicatorWidget extends StatelessWidget { } class SyncStatusCompletedWidget extends StatelessWidget { - const SyncStatusCompletedWidget({Key? key}) : super(key: key); + const SyncStatusCompletedWidget({super.key}); @override Widget build(BuildContext context) { diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart index 66ee553c81..ea11e132aa 100644 --- a/mobile/lib/ui/settings/ml/enable_ml_consent.dart +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -1,4 +1,6 @@ import "package:flutter/material.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/notification_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/user_remote_flag_service.dart"; @@ -120,6 +122,8 @@ class _EnableMachineLearningConsentState buttonType: ButtonType.secondary, labelText: S.of(context).cancel, onTap: () async { + await localSettings.setHasSeenMLEnablingBanner(); + Bus.instance.fire(NotificationEvent()); Navigator.of(context).pop(); }, ), diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index e293375653..78923805f4 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -12,6 +12,7 @@ class LocalSettings { static const kCollectionSortPref = "collection_sort_pref"; static const kPhotoGridSize = "photo_grid_size"; static const _kisMLLocalIndexingEnabled = "ls.ml_local_indexing"; + static const _kHasSeenMLEnablingBanner = "ls.has_seen_ml_enabling_banner"; static const kRateUsShownCount = "rate_us_shown_count"; static const kEnableMultiplePart = "ls.enable_multiple_part"; static const kRateUsPromptThreshold = 2; @@ -75,6 +76,12 @@ class LocalSettings { return isMLLocalIndexingEnabled; } + bool get hasSeenMLEnablingBanner => + _prefs.getBool(_kHasSeenMLEnablingBanner) ?? false; + Future setHasSeenMLEnablingBanner() async { + await _prefs.setBool(_kHasSeenMLEnablingBanner, true); + } + //#region todo:(NG) remove this section, only needed for internal testing to see // if the OS stops the app during indexing bool get remoteFetchEnabled => _prefs.getBool("remoteFetchEnabled") ?? true; From 0f3e490699d77d54b172d2498c782cd3633076ff Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 15:45:23 +0530 Subject: [PATCH 19/75] [mob][photos] Don't keep showing the banner --- mobile/lib/ui/home/status_bar_widget.dart | 5 ++++- mobile/lib/ui/settings/ml/enable_ml_consent.dart | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index 1eddcb1337..bd23dd34dc 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -37,7 +37,7 @@ class _StatusBarWidgetState extends State { late StreamSubscription _notificationSubscription; bool _showStatus = false; bool _showErrorBanner = false; - final bool _showMlBanner = !userRemoteFlagService + bool _showMlBanner = !userRemoteFlagService .getCachedBoolValue(UserRemoteFlagService.mlEnabled) && !localSettings.hasSeenMLEnablingBanner; Error? _syncError; @@ -75,6 +75,9 @@ class _StatusBarWidgetState extends State { _notificationSubscription = Bus.instance.on().listen((event) { if (mounted) { + _showMlBanner = !userRemoteFlagService + .getCachedBoolValue(UserRemoteFlagService.mlEnabled) && + !localSettings.hasSeenMLEnablingBanner; setState(() {}); } }); diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart index ea11e132aa..e9fb4ffb6e 100644 --- a/mobile/lib/ui/settings/ml/enable_ml_consent.dart +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -149,6 +149,7 @@ class _EnableMachineLearningConsentState UserRemoteFlagService.mlEnabled, true, ); + Bus.instance.fire(NotificationEvent()); Navigator.of(context).pop(true); } catch (e) { // ignore: unawaited_futures From d4479a1a66653e6723582d356af9fd0aaea41985 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 15:49:58 +0530 Subject: [PATCH 20/75] [mob][photos] Extract to string --- mobile/lib/generated/intl/messages_ar.dart | 2 ++ mobile/lib/generated/intl/messages_be.dart | 2 ++ mobile/lib/generated/intl/messages_bg.dart | 4 +++- mobile/lib/generated/intl/messages_ca.dart | 4 +++- mobile/lib/generated/intl/messages_cs.dart | 2 ++ mobile/lib/generated/intl/messages_da.dart | 2 ++ mobile/lib/generated/intl/messages_de.dart | 2 ++ mobile/lib/generated/intl/messages_el.dart | 2 ++ mobile/lib/generated/intl/messages_en.dart | 2 ++ mobile/lib/generated/intl/messages_es.dart | 2 ++ mobile/lib/generated/intl/messages_et.dart | 2 ++ mobile/lib/generated/intl/messages_fa.dart | 2 ++ mobile/lib/generated/intl/messages_fr.dart | 2 ++ mobile/lib/generated/intl/messages_gu.dart | 4 +++- mobile/lib/generated/intl/messages_he.dart | 2 ++ mobile/lib/generated/intl/messages_hi.dart | 2 ++ mobile/lib/generated/intl/messages_id.dart | 2 ++ mobile/lib/generated/intl/messages_it.dart | 2 ++ mobile/lib/generated/intl/messages_ja.dart | 2 ++ mobile/lib/generated/intl/messages_km.dart | 4 +++- mobile/lib/generated/intl/messages_ko.dart | 2 ++ mobile/lib/generated/intl/messages_lt.dart | 2 ++ mobile/lib/generated/intl/messages_nl.dart | 2 ++ mobile/lib/generated/intl/messages_no.dart | 2 ++ mobile/lib/generated/intl/messages_pl.dart | 2 ++ mobile/lib/generated/intl/messages_pt.dart | 2 ++ mobile/lib/generated/intl/messages_ro.dart | 2 ++ mobile/lib/generated/intl/messages_ru.dart | 2 ++ mobile/lib/generated/intl/messages_sl.dart | 4 +++- mobile/lib/generated/intl/messages_sv.dart | 2 ++ mobile/lib/generated/intl/messages_ta.dart | 2 ++ mobile/lib/generated/intl/messages_te.dart | 4 +++- mobile/lib/generated/intl/messages_th.dart | 2 ++ mobile/lib/generated/intl/messages_ti.dart | 4 +++- mobile/lib/generated/intl/messages_tr.dart | 2 ++ mobile/lib/generated/intl/messages_uk.dart | 2 ++ mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_ar.arb | 3 ++- mobile/lib/l10n/intl_be.arb | 3 ++- mobile/lib/l10n/intl_bg.arb | 3 ++- mobile/lib/l10n/intl_ca.arb | 3 ++- mobile/lib/l10n/intl_cs.arb | 3 ++- mobile/lib/l10n/intl_da.arb | 3 ++- mobile/lib/l10n/intl_de.arb | 3 ++- mobile/lib/l10n/intl_el.arb | 3 ++- mobile/lib/l10n/intl_en.arb | 3 ++- mobile/lib/l10n/intl_es.arb | 3 ++- mobile/lib/l10n/intl_et.arb | 3 ++- mobile/lib/l10n/intl_fa.arb | 3 ++- mobile/lib/l10n/intl_fr.arb | 3 ++- mobile/lib/l10n/intl_gu.arb | 3 ++- mobile/lib/l10n/intl_he.arb | 3 ++- mobile/lib/l10n/intl_hi.arb | 3 ++- mobile/lib/l10n/intl_id.arb | 3 ++- mobile/lib/l10n/intl_it.arb | 3 ++- mobile/lib/l10n/intl_ja.arb | 3 ++- mobile/lib/l10n/intl_km.arb | 3 ++- mobile/lib/l10n/intl_ko.arb | 3 ++- mobile/lib/l10n/intl_lt.arb | 3 ++- mobile/lib/l10n/intl_nl.arb | 3 ++- mobile/lib/l10n/intl_no.arb | 3 ++- mobile/lib/l10n/intl_pl.arb | 3 ++- mobile/lib/l10n/intl_pt.arb | 3 ++- mobile/lib/l10n/intl_ro.arb | 3 ++- mobile/lib/l10n/intl_ru.arb | 3 ++- mobile/lib/l10n/intl_sl.arb | 3 ++- mobile/lib/l10n/intl_sv.arb | 3 ++- mobile/lib/l10n/intl_ta.arb | 3 ++- mobile/lib/l10n/intl_te.arb | 3 ++- mobile/lib/l10n/intl_th.arb | 3 ++- mobile/lib/l10n/intl_ti.arb | 3 ++- mobile/lib/l10n/intl_tr.arb | 3 ++- mobile/lib/l10n/intl_uk.arb | 3 ++- mobile/lib/l10n/intl_zh.arb | 3 ++- mobile/lib/ui/home/status_bar_widget.dart | 2 +- 76 files changed, 166 insertions(+), 45 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 95665bd0d1..3eef00968a 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -31,6 +31,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Checking models..."), "decrypting": MessageLookupByLibrary.simpleMessage("فك التشفير..."), "email": MessageLookupByLibrary.simpleMessage("البريد الإلكتروني"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("أدخل عنوان بريدك الإلكتروني"), "enterYourRecoveryKey": diff --git a/mobile/lib/generated/intl/messages_be.dart b/mobile/lib/generated/intl/messages_be.dart index 42791a7935..0073d42dfa 100644 --- a/mobile/lib/generated/intl/messages_be.dart +++ b/mobile/lib/generated/intl/messages_be.dart @@ -112,6 +112,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Зрабіць гэта пазней"), "done": MessageLookupByLibrary.simpleMessage("Гатова"), "email": MessageLookupByLibrary.simpleMessage("Электронная пошта"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("Шыфраванне"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Ключы шыфравання"), diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index e3f8835ae7..d5e56669cc 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index 73cf74ac9b..f90fa8ca1a 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 7c3ab0ebe2..2d2e4f11da 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -28,6 +28,8 @@ class MessageLookup extends MessageLookupByLibrary { "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"), "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage("") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index 530acf8fc2..aa1a66c7a5 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -73,6 +73,8 @@ class MessageLookup extends MessageLookupByLibrary { "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( "Er du sikker på, at du vil ændre udviklerindstillingerne?"), "email": MessageLookupByLibrary.simpleMessage("Email"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enterPin": MessageLookupByLibrary.simpleMessage("Indtast PIN"), "enterValidEmail": MessageLookupByLibrary.simpleMessage( "Indtast venligst en gyldig email adresse."), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 461b93dfd3..19b4d90ed6 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -738,6 +738,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Aktivieren"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente unterstützt maschinelles Lernen für Gesichtserkennung, magische Suche und andere erweiterte Suchfunktionen auf dem Gerät"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Karten aktivieren"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Dies zeigt Ihre Fotos auf einer Weltkarte.\n\nDiese Karte wird von OpenStreetMap gehostet und die genauen Standorte Ihrer Fotos werden niemals geteilt.\n\nSie können diese Funktion jederzeit in den Einstellungen deaktivieren."), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index 3977b079de..7bd1109fa5 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -24,6 +24,8 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") }; diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 940af4877f..01701f4d73 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -712,6 +712,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Enable"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente supports on-device machine learning for face recognition, magic search and other advanced search features"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Enable Maps"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "This will show your photos on a world map.\n\nThis map is hosted by Open Street Map, and the exact locations of your photos are never shared.\n\nYou can disable this feature anytime from Settings."), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index f3f666ba1e..7f5dfe4011 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -730,6 +730,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Habilitar"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente soporta aprendizaje automático en el dispositivo para la detección de caras, búsqueda mágica y otras características de búsqueda avanzada"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activar Mapas"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Esto mostrará tus fotos en el mapa mundial.\n\nEste mapa está gestionado por Open Street Map, y la ubicación exacta de tus fotos nunca se comparte.\n\nPuedes deshabilitar esta función en cualquier momento en Ajustes."), diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index 801f75c33c..2e446b5ad3 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -100,6 +100,8 @@ class MessageLookup extends MessageLookupByLibrary { "done": MessageLookupByLibrary.simpleMessage("Valmis"), "edit": MessageLookupByLibrary.simpleMessage("Muuda"), "email": MessageLookupByLibrary.simpleMessage("E-post"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("Krüpteerimine"), "enterCode": MessageLookupByLibrary.simpleMessage("Sisesta kood"), "enterEmail": MessageLookupByLibrary.simpleMessage("Sisesta e-post"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index b4778b9f8d..e976091b99 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -170,6 +170,8 @@ class MessageLookup extends MessageLookupByLibrary { "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("ویرایش مکان"), "email": MessageLookupByLibrary.simpleMessage("ایمیل"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("رمزگذاری"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("کلیدهای رمزنگاری"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index c159cbf564..bfa7298e1e 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -746,6 +746,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Activer"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente prend en charge l\'apprentissage automatique sur l\'appareil pour la reconnaissance faciale, la recherche magique et d\'autres fonctionnalités de recherche avancée"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activer la carte"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Vos photos seront affichées sur une carte du monde.\n\nCette carte est hébergée par Open Street Map, et les emplacements exacts de vos photos ne sont jamais partagés.\n\nVous pouvez désactiver cette fonction à tout moment dans les Paramètres."), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index 4bef7ab5f7..e408bb1370 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index eb9ee49a9d..0234c08f71 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -412,6 +412,8 @@ class MessageLookup extends MessageLookupByLibrary { "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("אימות מייל"), "empty": MessageLookupByLibrary.simpleMessage("ריק"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("הצפנה"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("מפתחות ההצפנה"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index 057c2e52e8..fa5ae3c05e 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -58,6 +58,8 @@ class MessageLookup extends MessageLookupByLibrary { "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( "आपका अनुरोध 72 घंटों के भीतर संसाधित किया जाएगा।"), "email": MessageLookupByLibrary.simpleMessage("ईमेल"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "entePhotosPerm": MessageLookupByLibrary.simpleMessage( "Ente को आपकी तस्वीरों को संरक्षित करने के लिए अनुमति की आवश्यकता है"), "enterValidEmail": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index a2b4f6a619..47790fc6cf 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -614,6 +614,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verifikasi email"), "empty": MessageLookupByLibrary.simpleMessage("Kosongkan"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Kosongkan sampah?"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Aktifkan Peta"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Mengenkripsi cadangan..."), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index fb76c9f87a..3186b9a2a1 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -734,6 +734,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Abilita"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente supporta l\'apprendimento automatico eseguito sul dispositivo per il riconoscimento dei volti, la ricerca magica e altre funzioni di ricerca avanzata"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Abilita le Mappe"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Questo mostrerà le tue foto su una mappa del mondo.\n\nQuesta mappa è ospitata da Open Street Map e le posizioni esatte delle tue foto non sono mai condivise.\n\nPuoi disabilitare questa funzionalità in qualsiasi momento, dalle Impostazioni."), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index 06006f5621..cb41bbf92c 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -623,6 +623,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("有効化"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Enteは顔認識、マジック検索、その他の高度な検索機能のため、あなたのデバイス上で機械学習をしています"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("マップを有効にする"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "世界地図上にあなたの写真を表示します。\n\n地図はOpenStreetMapを利用しており、あなたの写真の位置情報が外部に共有されることはありません。\n\nこの機能は設定から無効にすることができます"), diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index 14989cc411..b650b83a43 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 1f72356e6c..03fb9e08d1 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAccountPermanentlyButton": MessageLookupByLibrary.simpleMessage("계정을 영구적으로 삭제"), "email": MessageLookupByLibrary.simpleMessage("이메일"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enterValidEmail": MessageLookupByLibrary.simpleMessage("올바른 이메일 주소를 입력하세요."), "enterYourEmailAddress": diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 66bab14616..769f912743 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -412,6 +412,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Įjungti"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "„Ente“ palaiko įrenginyje mašininį mokymąsi, skirtą veidų atpažinimui, magiškai paieškai ir kitoms išplėstinėms paieškos funkcijoms"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Tai parodys jūsų nuotraukas pasaulio žemėlapyje.\n\nŠį žemėlapį talpina „OpenStreetMap“, o tiksliomis nuotraukų vietovėmis niekada nebendrinama.\n\nŠią funkciją bet kada galite išjungti iš nustatymų."), "enabled": MessageLookupByLibrary.simpleMessage("Įjungta"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 11bcb82b4e..558411f1c1 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -726,6 +726,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Inschakelen"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente ondersteunt on-device machine learning voor gezichtsherkenning, magisch zoeken en andere geavanceerde zoekfuncties"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Kaarten inschakelen"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 6426bdbbcb..0f984787c0 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -189,6 +189,8 @@ class MessageLookup extends MessageLookupByLibrary { "dropSupportEmail": m25, "duplicateItemsGroup": m27, "email": MessageLookupByLibrary.simpleMessage("E-post"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Krypteringsnøkkel"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index d446bb852b..55ac3cb004 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -732,6 +732,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Włącz"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente obsługuje uczenie maszynowe na urządzeniu dla rozpoznawania twarzy, wyszukiwania magicznego i innych zaawansowanych funkcji wyszukiwania"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Włącz mapy"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "To pokaże Twoje zdjęcia na mapie świata.\n\nTa mapa jest hostowana przez Open Street Map, a dokładne lokalizacje Twoich zdjęć nigdy nie są udostępniane.\n\nMożesz wyłączyć tę funkcję w każdej chwili w ustawieniach."), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 017fd3d557..8321a7a958 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -729,6 +729,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Ativar"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente suporta aprendizagem de máquina para reconhecimento facial, busca mágica e outros recursos de busca avançados"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Ativar mapas"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isso exibirá suas fotos em um mapa mundial.\n\nEste mapa é hospedado por Open Street Map, e as exatas localizações das fotos nunca serão compartilhadas.\n\nVocê pode desativar esta função a qualquer momento em Opções."), diff --git a/mobile/lib/generated/intl/messages_ro.dart b/mobile/lib/generated/intl/messages_ro.dart index fd6bd7ddd0..52eeea8e1d 100644 --- a/mobile/lib/generated/intl/messages_ro.dart +++ b/mobile/lib/generated/intl/messages_ro.dart @@ -605,6 +605,8 @@ class MessageLookup extends MessageLookupByLibrary { "emptyTrash": MessageLookupByLibrary.simpleMessage("Goliți coșul de gunoi?"), "enable": MessageLookupByLibrary.simpleMessage("Activare"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enabled": MessageLookupByLibrary.simpleMessage("Activat"), "encryption": MessageLookupByLibrary.simpleMessage("Criptarea"), "encryptionKeys": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index b2baeda55b..1ae4375355 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -681,6 +681,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Включить"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente поддерживает машинное обучение на устройстве для распознавания лиц, умного поиска и других расширенных функций поиска"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Включить карты"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Ваши фотографии будут показаны на карте мира.\n\nЭта карта размещена на Open Street Map, и точное местоположение ваших фотографий никогда не разглашается.\n\nВы можете отключить эту функцию в любое время в настройках."), diff --git a/mobile/lib/generated/intl/messages_sl.dart b/mobile/lib/generated/intl/messages_sl.dart index 88252dd5d5..ab72175346 100644 --- a/mobile/lib/generated/intl/messages_sl.dart +++ b/mobile/lib/generated/intl/messages_sl.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index 3c2d8049a8..e3dd48662a 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -244,6 +244,8 @@ class MessageLookup extends MessageLookupByLibrary { "edit": MessageLookupByLibrary.simpleMessage("Redigera"), "email": MessageLookupByLibrary.simpleMessage("E-post"), "emailNoEnteAccount": m29, + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Krypteringsnycklar"), diff --git a/mobile/lib/generated/intl/messages_ta.dart b/mobile/lib/generated/intl/messages_ta.dart index a293e51fc1..14d84e0d10 100644 --- a/mobile/lib/generated/intl/messages_ta.dart +++ b/mobile/lib/generated/intl/messages_ta.dart @@ -41,6 +41,8 @@ class MessageLookup extends MessageLookupByLibrary { "deleteReason1": MessageLookupByLibrary.simpleMessage( "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை"), "email": MessageLookupByLibrary.simpleMessage("மின்னஞ்சல்"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enterValidEmail": MessageLookupByLibrary.simpleMessage( "சரியான மின்னஞ்சல் முகவரியை உள்ளிடவும்."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart index 9f7ed5e4df..c6bca6a9e2 100644 --- a/mobile/lib/generated/intl/messages_te.dart +++ b/mobile/lib/generated/intl/messages_te.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index ba95cc741b..318e6500d8 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -151,6 +151,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("แก้ไขตำแหน่ง"), "eligible": MessageLookupByLibrary.simpleMessage("มีสิทธิ์"), "email": MessageLookupByLibrary.simpleMessage("อีเมล"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("เปิดใช้งานแผนที่"), "encryption": MessageLookupByLibrary.simpleMessage("การเข้ารหัส"), "enterCode": MessageLookupByLibrary.simpleMessage("ป้อนรหัส"), diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart index 4c54aa4ee8..0068f54713 100644 --- a/mobile/lib/generated/intl/messages_ti.dart +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "checkingModels": - MessageLookupByLibrary.simpleMessage("Checking models...") + MessageLookupByLibrary.simpleMessage("Checking models..."), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition") }; } diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 864c0df840..8d1e9494ba 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -606,6 +606,8 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Boşalt"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Çöp kutusu boşaltılsın mı?"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Haritaları Etkinleştir"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_uk.dart b/mobile/lib/generated/intl/messages_uk.dart index 8d4c85a99e..2fb8869353 100644 --- a/mobile/lib/generated/intl/messages_uk.dart +++ b/mobile/lib/generated/intl/messages_uk.dart @@ -731,6 +731,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Увімкнути"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente підтримує машинне навчання для розпізнавання обличчя, магічний пошук та інші розширені функції пошуку"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("Увімкнути мапи"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Це покаже ваші фотографії на мапі світу.\n\nЦя мапа розміщена на OpenStreetMap, і точне розташування ваших фотографій ніколи не розголошується.\n\nВи можете будь-коли вимкнути цю функцію в налаштуваннях."), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 22109eeb32..c046e58cfa 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -599,6 +599,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("启用"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente 支持设备上的机器学习,实现人脸识别、魔法搜索和其他高级搜索功能"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Enable machine learning for magic search and face recognition"), "enableMaps": MessageLookupByLibrary.simpleMessage("启用地图"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "这将在世界地图上显示您的照片。\n\n该地图由 Open Street Map 托管,并且您的照片的确切位置永远不会共享。\n\n您可以随时从“设置”中禁用此功能。"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index a33c0511ea..625468eba7 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9915,6 +9915,16 @@ class S { args: [], ); } + + /// `Enable machine learning for magic search and face recognition` + String get enableMachineLearningBanner { + return Intl.message( + 'Enable machine learning for magic search and face recognition', + name: 'enableMachineLearningBanner', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index d094e442f1..f371a61c36 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -24,5 +24,6 @@ "verifyEmail": "التحقق من البريد الإلكتروني", "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية.", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_be.arb b/mobile/lib/l10n/intl_be.arb index 0d33674d8a..9eaea845ec 100644 --- a/mobile/lib/l10n/intl_be.arb +++ b/mobile/lib/l10n/intl_be.arb @@ -200,5 +200,6 @@ "systemTheme": "Сістэма", "freeTrial": "Бясплатная пробная версія", "faqs": "Частыя пытанні", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index e6b421ac6f..47380fc3b6 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -3,5 +3,6 @@ "askDeleteReason": "Jaký je váš hlavní důvod, proč mažete svůj účet?", "incorrectRecoveryKeyBody": "", "checkInboxAndSpamFolder": "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index d346545b28..abc8d34fa1 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -85,5 +85,6 @@ "developerSettingsWarning": "Er du sikker på, at du vil ændre udviklerindstillingerne?", "next": "Næste", "enterPin": "Indtast PIN", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 6e76bed407..03d670ab60 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "Alle Gruppierungen für diese Person werden zurückgesetzt und du wirst alle Vorschläge für diese Person verlieren", "yesResetPerson": "Ja, Person zurücksetzen", "onlyThem": "Nur diese", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index 479cab3eb2..ac1eb831e6 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -1,5 +1,6 @@ { "@@locale ": "en", "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 88629cf49f..a5debb542a 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "All groupings for this person will be reset, and you will lose all suggestions made for this person", "yesResetPerson": "Yes, reset person", "onlyThem": "Only them", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 66d62e0e9f..1d0928fca4 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1344,5 +1344,6 @@ "mostRelevant": "Más relevante", "loadingYourPhotos": "Cargando tus fotos...", "processingImport": "Procesando {folderName}...", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index 5b2dd4da34..8e5e6a92ed 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -219,5 +219,6 @@ "@storageBreakupYou": { "description": "Label to indicate how much storage you are using when you are part of a family plan" }, - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index 8253c7b631..29a87ba96c 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -308,5 +308,6 @@ "search": "جستجو", "whatsNew": "تغییرات جدید", "reviewSuggestions": "مرور پیشنهادها", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index fb12933bb9..3f1b2b5ed6 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1348,5 +1348,6 @@ "areYouSureYouWantToResetThisPerson": "Êtes-vous certain de vouloir réinitialiser cette personne ?", "allPersonGroupingWillReset": "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne", "yesResetPerson": "Oui, réinitialiser la personne", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index 788e45608d..171f0f4cdc 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -817,5 +817,6 @@ "create": "צור", "viewAll": "הצג הכל", "hiding": "מחביא...", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 686c13003b..3d6bc0c35e 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -49,5 +49,6 @@ "noRecoveryKeyNoDecryption": "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है", "verifyEmail": "ईमेल सत्यापित करें", "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index 50e9d43505..b758ad7afa 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1144,5 +1144,6 @@ "left": "Kiri", "right": "Kanan", "whatsNew": "Hal yang baru", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 778f80de26..d698526c93 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "Tutti i raggruppamenti per questa persona saranno resettati e perderai tutti i suggerimenti fatti per questa persona", "yesResetPerson": "Sì, resetta persona", "onlyThem": "Solo loro", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index d1d7e61049..b61bd4eaeb 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1344,5 +1344,6 @@ "mostRelevant": "関連度順", "loadingYourPhotos": "写真を読み込んでいます...", "processingImport": "{folderName} を処理中...", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 72dce82729..10a0c441d4 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -13,5 +13,6 @@ "confirmAccountDeletion": "계정 삭제 확인", "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", "yourAccountHasBeenDeleted": "계정이 삭제되었습니다.", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index 2cab8e5276..fb419e9b67 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -801,5 +801,6 @@ "allPersonGroupingWillReset": "Visi šio asmens grupavimai bus iš naujo nustatyti, o jūs neteksite visų šiam asmeniui pateiktų pasiūlymų", "yesResetPerson": "Taip, nustatyti asmenį iš naujo", "onlyThem": "Tik jiems", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 1b46c6ac1b..2c00bb0718 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1344,5 +1344,6 @@ "mostRelevant": "Meest relevant", "loadingYourPhotos": "Je foto's worden geladen...", "processingImport": "Verwerken van {folderName}...", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index bea3834ff2..5775677c35 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -372,5 +372,6 @@ "general": "Generelt", "security": "Sikkerhet", "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 182563ad0c..5837abc41b 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1359,5 +1359,6 @@ "areYouSureYouWantToResetThisPerson": "Czy na pewno chcesz zresetować tę osobę?", "allPersonGroupingWillReset": "Wszystkie grupy dla tej osoby zostaną zresetowane i stracisz wszystkie sugestie dla tej osoby", "yesResetPerson": "Tak, zresetuj osobę", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 7641231b3b..3c6d5d28a8 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "Todos os agrupamentos dessa pessoa serão redefinidos, e você perderá todas as sugestões feitas por essa pessoa.", "yesResetPerson": "Sim, redefinir pessoa", "onlyThem": "Apenas eles", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ro.arb b/mobile/lib/l10n/intl_ro.arb index 9032e9b8a8..b83ae18460 100644 --- a/mobile/lib/l10n/intl_ro.arb +++ b/mobile/lib/l10n/intl_ro.arb @@ -1093,5 +1093,6 @@ "enable": "Activare", "enabled": "Activat", "moreDetails": "Mai multe detalii", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 1d4bf614e1..6559fb214e 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1301,5 +1301,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Это удалит публичные ссылки на все выбранные быстрые ссылки.", "guestView": "Гостевой вид", "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sl.arb b/mobile/lib/l10n/intl_sl.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_sl.arb +++ b/mobile/lib/l10n/intl_sl.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 97475b7857..6145982e61 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -456,5 +456,6 @@ "newPerson": "Ny person", "addName": "Lägg till namn", "add": "Lägg till", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb index e8217d2d3a..e900512449 100644 --- a/mobile/lib/l10n/intl_ta.arb +++ b/mobile/lib/l10n/intl_ta.arb @@ -16,5 +16,6 @@ "confirmAccountDeletion": "கணக்கு நீக்குதலை உறுதிப்படுத்தவும்", "deleteAccountPermanentlyButton": "கணக்கை நிரந்தரமாக நீக்கவும்", "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index 8793ad7410..e4862e1245 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -296,5 +296,6 @@ }, "maps": "แผนที่", "enableMaps": "เปิดใช้งานแผนที่", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index c9d5b5480b..17136b96a6 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index f9483721b5..2bae81401e 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1170,5 +1170,6 @@ "invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.", "endpointUpdatedMessage": "Fatura başarıyla güncellendi", "customEndpoint": "{endpoint}'e bağlanıldı", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index 1dbb7458a0..8c3c7ba1ab 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -1359,5 +1359,6 @@ "areYouSureYouWantToResetThisPerson": "Ви впевнені, що хочете скинути цю особу?", "allPersonGroupingWillReset": "Усі групи для цієї особи будуть скинуті, і ви втратите всі пропозиції, зроблені для неї", "yesResetPerson": "Так, скинути особу", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 90bc60ed3e..30a28cce31 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1344,5 +1344,6 @@ "mostRelevant": "最相关", "loadingYourPhotos": "正在加载您的照片...", "processingImport": "正在处理 {folderName}...", - "checkingModels": "Checking models..." + "checkingModels": "Checking models...", + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" } \ No newline at end of file diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index bd23dd34dc..391675b2b5 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -128,7 +128,7 @@ class _StatusBarWidgetState extends State { startIcon: Icons.offline_bolt, actionIcon: Icons.arrow_forward, text: - "Enable machine learning for magic search and face recognition", + S.of(context).enableMachineLearningBanner, type: NotificationType.greenBanner, onTap: () async => { await routeToPage( From 4ce2d0a1e253e58ef8d819b939ef1363e1f57fe1 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 16:02:45 +0530 Subject: [PATCH 21/75] [mob][photos] ml section empty copy --- mobile/lib/generated/intl/messages_ar.dart | 4 ++++ mobile/lib/generated/intl/messages_be.dart | 4 ++++ mobile/lib/generated/intl/messages_bg.dart | 6 +++++- mobile/lib/generated/intl/messages_ca.dart | 6 +++++- mobile/lib/generated/intl/messages_cs.dart | 6 +++++- mobile/lib/generated/intl/messages_da.dart | 4 ++++ mobile/lib/generated/intl/messages_de.dart | 2 ++ mobile/lib/generated/intl/messages_el.dart | 6 +++++- mobile/lib/generated/intl/messages_en.dart | 2 ++ mobile/lib/generated/intl/messages_es.dart | 2 ++ mobile/lib/generated/intl/messages_et.dart | 4 ++++ mobile/lib/generated/intl/messages_fa.dart | 4 ++++ mobile/lib/generated/intl/messages_fr.dart | 2 ++ mobile/lib/generated/intl/messages_gu.dart | 6 +++++- mobile/lib/generated/intl/messages_he.dart | 4 ++++ mobile/lib/generated/intl/messages_hi.dart | 4 ++++ mobile/lib/generated/intl/messages_id.dart | 4 ++++ mobile/lib/generated/intl/messages_it.dart | 2 ++ mobile/lib/generated/intl/messages_ja.dart | 2 ++ mobile/lib/generated/intl/messages_km.dart | 6 +++++- mobile/lib/generated/intl/messages_ko.dart | 4 ++++ mobile/lib/generated/intl/messages_lt.dart | 4 ++++ mobile/lib/generated/intl/messages_nl.dart | 2 ++ mobile/lib/generated/intl/messages_no.dart | 4 ++++ mobile/lib/generated/intl/messages_pl.dart | 2 ++ mobile/lib/generated/intl/messages_pt.dart | 2 ++ mobile/lib/generated/intl/messages_ro.dart | 2 ++ mobile/lib/generated/intl/messages_ru.dart | 2 ++ mobile/lib/generated/intl/messages_sl.dart | 6 +++++- mobile/lib/generated/intl/messages_sv.dart | 4 ++++ mobile/lib/generated/intl/messages_ta.dart | 4 ++++ mobile/lib/generated/intl/messages_te.dart | 6 +++++- mobile/lib/generated/intl/messages_th.dart | 4 ++++ mobile/lib/generated/intl/messages_ti.dart | 6 +++++- mobile/lib/generated/intl/messages_tr.dart | 2 ++ mobile/lib/generated/intl/messages_uk.dart | 2 ++ mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_ar.arb | 4 +++- mobile/lib/l10n/intl_be.arb | 4 +++- mobile/lib/l10n/intl_bg.arb | 4 +++- mobile/lib/l10n/intl_ca.arb | 4 +++- mobile/lib/l10n/intl_cs.arb | 4 +++- mobile/lib/l10n/intl_da.arb | 4 +++- mobile/lib/l10n/intl_de.arb | 3 ++- mobile/lib/l10n/intl_el.arb | 4 +++- mobile/lib/l10n/intl_en.arb | 3 ++- mobile/lib/l10n/intl_es.arb | 3 ++- mobile/lib/l10n/intl_et.arb | 4 +++- mobile/lib/l10n/intl_fa.arb | 4 +++- mobile/lib/l10n/intl_fr.arb | 3 ++- mobile/lib/l10n/intl_gu.arb | 4 +++- mobile/lib/l10n/intl_he.arb | 4 +++- mobile/lib/l10n/intl_hi.arb | 4 +++- mobile/lib/l10n/intl_id.arb | 4 +++- mobile/lib/l10n/intl_it.arb | 3 ++- mobile/lib/l10n/intl_ja.arb | 3 ++- mobile/lib/l10n/intl_km.arb | 4 +++- mobile/lib/l10n/intl_ko.arb | 4 +++- mobile/lib/l10n/intl_lt.arb | 4 +++- mobile/lib/l10n/intl_nl.arb | 3 ++- mobile/lib/l10n/intl_no.arb | 4 +++- mobile/lib/l10n/intl_pl.arb | 3 ++- mobile/lib/l10n/intl_pt.arb | 3 ++- mobile/lib/l10n/intl_ro.arb | 3 ++- mobile/lib/l10n/intl_ru.arb | 3 ++- mobile/lib/l10n/intl_sl.arb | 4 +++- mobile/lib/l10n/intl_sv.arb | 4 +++- mobile/lib/l10n/intl_ta.arb | 4 +++- mobile/lib/l10n/intl_te.arb | 4 +++- mobile/lib/l10n/intl_th.arb | 4 +++- mobile/lib/l10n/intl_ti.arb | 4 +++- mobile/lib/l10n/intl_tr.arb | 3 ++- mobile/lib/l10n/intl_uk.arb | 3 ++- mobile/lib/l10n/intl_zh.arb | 3 ++- mobile/lib/models/search/search_types.dart | 4 ++-- 76 files changed, 238 insertions(+), 48 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 3eef00968a..1e772e9a1d 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -52,6 +52,10 @@ class MessageLookup extends MessageLookupByLibrary { "recoverButton": MessageLookupByLibrary.simpleMessage("استرداد"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("نجح الاسترداد!"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "sorry": MessageLookupByLibrary.simpleMessage("المعذرة"), "terminate": MessageLookupByLibrary.simpleMessage("إنهاء"), "terminateSession": diff --git a/mobile/lib/generated/intl/messages_be.dart b/mobile/lib/generated/intl/messages_be.dart index 0073d42dfa..5dfdc901fa 100644 --- a/mobile/lib/generated/intl/messages_be.dart +++ b/mobile/lib/generated/intl/messages_be.dart @@ -223,6 +223,10 @@ class MessageLookup extends MessageLookupByLibrary { "retry": MessageLookupByLibrary.simpleMessage("Паўтарыць"), "saveKey": MessageLookupByLibrary.simpleMessage("Захаваць ключ"), "scanCode": MessageLookupByLibrary.simpleMessage("Сканіраваць код"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Бяспека"), "selectAll": MessageLookupByLibrary.simpleMessage("Абраць усё"), "selectReason": diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index d5e56669cc..6090389084 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index f90fa8ca1a..b9dd77cc86 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 2d2e4f11da..8004045c76 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -30,6 +30,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( "Enable machine learning for magic search and face recognition"), - "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage("") + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(""), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index aa1a66c7a5..f0a1e5f8b0 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -118,8 +118,12 @@ class MessageLookup extends MessageLookupByLibrary { "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Skan denne QR-kode med godkendelses-appen"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchHint1": MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"), "selectedPhotos": m4, "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 19b4d90ed6..0f4e19f9cf 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -1436,6 +1436,8 @@ class MessageLookup extends MessageLookupByLibrary { "Füge Beschreibungen wie \"#trip\" in der Fotoinfo hinzu um diese schnell hier wiederzufinden"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Suche nach Datum, Monat oder Jahr"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Personen werden hier angezeigt, sobald die Indizierung abgeschlossen ist"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index 7bd1109fa5..cd7cefc67d 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -27,6 +27,10 @@ class MessageLookup extends MessageLookupByLibrary { "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( "Enable machine learning for magic search and face recognition"), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( - "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") + "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 01701f4d73..79cda6fb51 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -1371,6 +1371,8 @@ class MessageLookup extends MessageLookupByLibrary { "Add descriptions like \"#trip\" in photo info to quickly find them here"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Search by a date, month or year"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once indexing is done"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 7f5dfe4011..e095c5777c 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -1421,6 +1421,8 @@ class MessageLookup extends MessageLookupByLibrary { "Agrega descripciones como \"#viaje\" en la información de la foto para encontrarlas aquí rápidamente"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("Buscar por fecha, mes o año"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Las personas se mostrarán aquí una vez que se haya hecho la indexación"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index 2e446b5ad3..e2cf2affdc 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -207,6 +207,10 @@ class MessageLookup extends MessageLookupByLibrary { "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Skaneeri seda QR koodi\noma autentimisrakendusega"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Turvalisus"), "selectAll": MessageLookupByLibrary.simpleMessage("Vali kõik"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Vali keel"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index e976091b99..5eb7669028 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -326,6 +326,10 @@ class MessageLookup extends MessageLookupByLibrary { "safelyStored": MessageLookupByLibrary.simpleMessage("به طور ایمن"), "saveKey": MessageLookupByLibrary.simpleMessage("ذخیره کلید"), "search": MessageLookupByLibrary.simpleMessage("جستجو"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("امنیت"), "selectAll": MessageLookupByLibrary.simpleMessage("انتخاب همه"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index bfa7298e1e..41941d6b79 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -1445,6 +1445,8 @@ class MessageLookup extends MessageLookupByLibrary { "Ajoutez des descriptions comme \"#trip\" dans les infos photo pour les retrouver ici plus rapidement"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Recherche par date, mois ou année"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Les personnes seront affichées ici une fois l\'indexation terminée"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index e408bb1370..c87e295b8a 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index 0234c08f71..68bb9df9b6 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -744,6 +744,10 @@ class MessageLookup extends MessageLookupByLibrary { "סרוק את הברקוד הזה\nבעזרת אפליקציית האימות שלך"), "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("שם האלבום"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("אבטחה"), "selectAlbum": MessageLookupByLibrary.simpleMessage("בחר אלבום"), "selectAll": MessageLookupByLibrary.simpleMessage("בחר הכל"), diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index fa5ae3c05e..a5cc80662b 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -89,6 +89,10 @@ class MessageLookup extends MessageLookupByLibrary { "recoverButton": MessageLookupByLibrary.simpleMessage("पुनः प्राप्त"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("रिकवरी सफल हुई!"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectReason": MessageLookupByLibrary.simpleMessage("कारण चुनें"), "sendEmail": MessageLookupByLibrary.simpleMessage("ईमेल भेजें"), "somethingWentWrongPleaseTryAgain": diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 47790fc6cf..4bb33304fd 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -1179,6 +1179,8 @@ class MessageLookup extends MessageLookupByLibrary { "Tambah keterangan seperti \"#trip\" pada info foto agar mudah ditemukan di sini"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Telusuri dengan tanggal, bulan, atau tahun"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Orang akan ditampilkan di sini setelah pengindeksan selesai"), "searchFileTypesAndNamesEmptySection": @@ -1189,6 +1191,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album, nama dan jenis file"), "searchHint5": MessageLookupByLibrary.simpleMessage( "Segera tiba: Penelusuran wajah & ajaib ✨"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Keamanan"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 3186b9a2a1..2ea988ce06 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -1427,6 +1427,8 @@ class MessageLookup extends MessageLookupByLibrary { "Aggiungi descrizioni come \"#viaggio\" nelle informazioni delle foto per trovarle rapidamente qui"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Ricerca per data, mese o anno"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Le persone saranno mostrate qui una volta completata l\'indicizzazione"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index cb41bbf92c..c72ea6645f 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -1204,6 +1204,8 @@ class MessageLookup extends MessageLookupByLibrary { "写真情報に \"#trip\" のように説明を追加すれば、ここで簡単に見つけることができます"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("日付、月または年で検索"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage("学習が完了すると、ここに人が表示されます"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index b650b83a43..100cf69418 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 03fb9e08d1..e4286ee7a6 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -44,6 +44,10 @@ class MessageLookup extends MessageLookupByLibrary { "feedback": MessageLookupByLibrary.simpleMessage("피드백"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 769f912743..da787568e6 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -826,9 +826,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skenuokite šį QR kodą\nsu autentifikatoriaus programa"), "search": MessageLookupByLibrary.simpleMessage("Ieškoti"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchHint4": MessageLookupByLibrary.simpleMessage("Vietovė"), "searchLocationEmptySection": MessageLookupByLibrary.simpleMessage( "Grupės nuotraukos, kurios padarytos tam tikru spinduliu nuo nuotraukos"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "selectALocation": MessageLookupByLibrary.simpleMessage("Pasirinkite vietovę"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 558411f1c1..fce47ff806 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -1411,6 +1411,8 @@ class MessageLookup extends MessageLookupByLibrary { "Voeg beschrijvingen zoals \"#weekendje weg\" toe in foto-info om ze snel hier te vinden"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Zoeken op een datum, maand of jaar"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Mensen worden hier getoond als het indexeren klaar is"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 0f984787c0..250c61eb0b 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -352,6 +352,10 @@ class MessageLookup extends MessageLookupByLibrary { "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Skann denne strekkoden med\nautentiseringsappen din"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Sikkerhet"), "selectAll": MessageLookupByLibrary.simpleMessage("Velg alle"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 55ac3cb004..5778f31676 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -1427,6 +1427,8 @@ class MessageLookup extends MessageLookupByLibrary { "Dodaj opisy takie jak \"#trip\" w informacji o zdjęciu, aby szybko znaleźć je tutaj"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Szukaj według daty, miesiąca lub roku"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Po zakończeniu indeksowania ludzie będą tu wyświetlani"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 8321a7a958..0e6b7b1a70 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -1421,6 +1421,8 @@ class MessageLookup extends MessageLookupByLibrary { "Adicione marcações como \"#viagem\" nas informações das fotos para encontrá-las aqui com facilidade"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("Buscar por data, mês ou ano"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "As pessoas apareceram aqui quando a indexação for concluída"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_ro.dart b/mobile/lib/generated/intl/messages_ro.dart index 52eeea8e1d..09609b3400 100644 --- a/mobile/lib/generated/intl/messages_ro.dart +++ b/mobile/lib/generated/intl/messages_ro.dart @@ -1162,6 +1162,8 @@ class MessageLookup extends MessageLookupByLibrary { "Adăugați descrieri precum „#excursie” în informațiile fotografiilor pentru a le găsi ușor aici"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Căutare după o dată, o lună sau un an"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Persoanele vor fi afișate aici odată ce indexarea este finalizată"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 1ae4375355..6b9cf9f933 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -1353,6 +1353,8 @@ class MessageLookup extends MessageLookupByLibrary { "Добавьте описания типа \"#поездка\" в информацию о фото и быстро найдите их здесь"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Поиск по дате, месяцу или году"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Люди будут показаны здесь, как только будет выполнено индексирование"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_sl.dart b/mobile/lib/generated/intl/messages_sl.dart index ab72175346..72e3aba9a4 100644 --- a/mobile/lib/generated/intl/messages_sl.dart +++ b/mobile/lib/generated/intl/messages_sl.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index e3dd48662a..be17ec8ab8 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -457,8 +457,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album"), "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("Albumnamn"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFileTypesAndNamesEmptySection": MessageLookupByLibrary.simpleMessage("Filtyper och namn"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "selectAlbum": MessageLookupByLibrary.simpleMessage("Välj album"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Välj språk"), diff --git a/mobile/lib/generated/intl/messages_ta.dart b/mobile/lib/generated/intl/messages_ta.dart index 14d84e0d10..296e3ad91b 100644 --- a/mobile/lib/generated/intl/messages_ta.dart +++ b/mobile/lib/generated/intl/messages_ta.dart @@ -52,6 +52,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("தவறான மின்னஞ்சல் முகவரி"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "இந்த தகவலுடன் தயவுசெய்து எங்களுக்கு உதவுங்கள்"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "verify": MessageLookupByLibrary.simpleMessage("சரிபார்க்கவும்") }; } diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart index c6bca6a9e2..9fd08625dd 100644 --- a/mobile/lib/generated/intl/messages_te.dart +++ b/mobile/lib/generated/intl/messages_te.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index 318e6500d8..1b23328542 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -288,6 +288,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "บันทึกคีย์การกู้คืนของคุณหากคุณยังไม่ได้ทำ"), "scanCode": MessageLookupByLibrary.simpleMessage("สแกนรหัส"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectAll": MessageLookupByLibrary.simpleMessage("เลือกทั้งหมด"), "selectReason": MessageLookupByLibrary.simpleMessage("เลือกเหตุผล"), "sendEmail": MessageLookupByLibrary.simpleMessage("ส่งอีเมล"), diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart index 0068f54713..ae38369d50 100644 --- a/mobile/lib/generated/intl/messages_ti.dart +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -25,6 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "checkingModels": MessageLookupByLibrary.simpleMessage("Checking models..."), "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( - "Enable machine learning for magic search and face recognition") + "Enable machine learning for magic search and face recognition"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 8d1e9494ba..1b858247da 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -1167,6 +1167,8 @@ class MessageLookup extends MessageLookupByLibrary { "Fotoğraf bilgilerini burada hızlı bir şekilde bulmak için \"#trip\" gibi açıklamalar ekleyin"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Tarihe, aya veya yıla göre arama yapın"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFileTypesAndNamesEmptySection": MessageLookupByLibrary.simpleMessage("Dosya türleri ve adları"), "searchHint1": diff --git a/mobile/lib/generated/intl/messages_uk.dart b/mobile/lib/generated/intl/messages_uk.dart index 2fb8869353..f9f2c56f98 100644 --- a/mobile/lib/generated/intl/messages_uk.dart +++ b/mobile/lib/generated/intl/messages_uk.dart @@ -1431,6 +1431,8 @@ class MessageLookup extends MessageLookupByLibrary { "Додавайте такі описи як «#подорож» в інформацію про фотографію, щоб швидко знайти їх тут"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Шукати за датою, місяцем або роком"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Люди будуть показані тут після завершення індексації"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index c046e58cfa..005751d400 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -1137,6 +1137,8 @@ class MessageLookup extends MessageLookupByLibrary { "在照片信息中添加“#旅游”等描述,以便在此处快速找到它们"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("按日期搜索,月份或年份"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Images will be shown here once processing is complete"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage("待索引完成后,人物将显示在此处"), "searchFileTypesAndNamesEmptySection": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 625468eba7..072fe8472a 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9925,6 +9925,16 @@ class S { args: [], ); } + + /// `Images will be shown here once processing is complete` + String get searchDiscoverEmptySection { + return Intl.message( + 'Images will be shown here once processing is complete', + name: 'searchDiscoverEmptySection', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index f371a61c36..3ea9676ec0 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -25,5 +25,7 @@ "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية.", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_be.arb b/mobile/lib/l10n/intl_be.arb index 9eaea845ec..04ee0bec6f 100644 --- a/mobile/lib/l10n/intl_be.arb +++ b/mobile/lib/l10n/intl_be.arb @@ -201,5 +201,7 @@ "freeTrial": "Бясплатная пробная версія", "faqs": "Частыя пытанні", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 47380fc3b6..f687466154 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -4,5 +4,7 @@ "incorrectRecoveryKeyBody": "", "checkInboxAndSpamFolder": "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index abc8d34fa1..af05ff2bb5 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -86,5 +86,7 @@ "next": "Næste", "enterPin": "Indtast PIN", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 03d670ab60..8da762b17a 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Ja, Person zurücksetzen", "onlyThem": "Nur diese", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index ac1eb831e6..3cbebecbf7 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -2,5 +2,7 @@ "@@locale ": "en", "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index a5debb542a..f7c5a6e75e 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Yes, reset person", "onlyThem": "Only them", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 1d0928fca4..a0b348e5c4 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1345,5 +1345,6 @@ "loadingYourPhotos": "Cargando tus fotos...", "processingImport": "Procesando {folderName}...", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index 8e5e6a92ed..ac2aefa042 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -220,5 +220,7 @@ "description": "Label to indicate how much storage you are using when you are part of a family plan" }, "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index 29a87ba96c..8065416cfe 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -309,5 +309,7 @@ "whatsNew": "تغییرات جدید", "reviewSuggestions": "مرور پیشنهادها", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 3f1b2b5ed6..b183bc144f 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1349,5 +1349,6 @@ "allPersonGroupingWillReset": "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne", "yesResetPerson": "Oui, réinitialiser la personne", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index 171f0f4cdc..936d19f8aa 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -818,5 +818,7 @@ "viewAll": "הצג הכל", "hiding": "מחביא...", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 3d6bc0c35e..7c5dc9799d 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -50,5 +50,7 @@ "verifyEmail": "ईमेल सत्यापित करें", "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index b758ad7afa..f5eaa5ad55 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1145,5 +1145,7 @@ "right": "Kanan", "whatsNew": "Hal yang baru", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index d698526c93..6ea1a49d3f 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Sì, resetta persona", "onlyThem": "Solo loro", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index b61bd4eaeb..22e28e63d5 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1345,5 +1345,6 @@ "loadingYourPhotos": "写真を読み込んでいます...", "processingImport": "{folderName} を処理中...", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 10a0c441d4..0ad9164f8b 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -14,5 +14,7 @@ "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", "yourAccountHasBeenDeleted": "계정이 삭제되었습니다.", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index fb419e9b67..a60b13547c 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -802,5 +802,7 @@ "yesResetPerson": "Taip, nustatyti asmenį iš naujo", "onlyThem": "Tik jiems", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 2c00bb0718..b2ca04afdd 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1345,5 +1345,6 @@ "loadingYourPhotos": "Je foto's worden geladen...", "processingImport": "Verwerken van {folderName}...", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 5775677c35..6fc83d3bf9 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -373,5 +373,7 @@ "security": "Sikkerhet", "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 5837abc41b..98abaf3d92 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "Wszystkie grupy dla tej osoby zostaną zresetowane i stracisz wszystkie sugestie dla tej osoby", "yesResetPerson": "Tak, zresetuj osobę", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 3c6d5d28a8..cf336a9ef8 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Sim, redefinir pessoa", "onlyThem": "Apenas eles", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ro.arb b/mobile/lib/l10n/intl_ro.arb index b83ae18460..be4b48f576 100644 --- a/mobile/lib/l10n/intl_ro.arb +++ b/mobile/lib/l10n/intl_ro.arb @@ -1094,5 +1094,6 @@ "enabled": "Activat", "moreDetails": "Mai multe detalii", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 6559fb214e..eb447765d9 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1302,5 +1302,6 @@ "guestView": "Гостевой вид", "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sl.arb b/mobile/lib/l10n/intl_sl.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_sl.arb +++ b/mobile/lib/l10n/intl_sl.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 6145982e61..6d981953d9 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -457,5 +457,7 @@ "addName": "Lägg till namn", "add": "Lägg till", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb index e900512449..a3e14d5201 100644 --- a/mobile/lib/l10n/intl_ta.arb +++ b/mobile/lib/l10n/intl_ta.arb @@ -17,5 +17,7 @@ "deleteAccountPermanentlyButton": "கணக்கை நிரந்தரமாக நீக்கவும்", "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index e4862e1245..260d1e76be 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -297,5 +297,7 @@ "maps": "แผนที่", "enableMaps": "เปิดใช้งานแผนที่", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index 17136b96a6..d2e533e382 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -1,5 +1,7 @@ { "@@locale ": "en", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchPeopleEmptySection": "People will be shown here once processing is complete", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 2bae81401e..c40483e539 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1171,5 +1171,6 @@ "endpointUpdatedMessage": "Fatura başarıyla güncellendi", "customEndpoint": "{endpoint}'e bağlanıldı", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index 8c3c7ba1ab..b7229aac6b 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -1360,5 +1360,6 @@ "allPersonGroupingWillReset": "Усі групи для цієї особи будуть скинуті, і ви втратите всі пропозиції, зроблені для неї", "yesResetPerson": "Так, скинути особу", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 30a28cce31..3596891e3e 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1345,5 +1345,6 @@ "loadingYourPhotos": "正在加载您的照片...", "processingImport": "正在处理 {folderName}...", "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition" + "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", + "searchDiscoverEmptySection": "Images will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/models/search/search_types.dart b/mobile/lib/models/search/search_types.dart index cd66acdee7..5b21dc4e86 100644 --- a/mobile/lib/models/search/search_types.dart +++ b/mobile/lib/models/search/search_types.dart @@ -77,9 +77,9 @@ extension SectionTypeExtensions on SectionType { String getEmptyStateText(BuildContext context) { switch (this) { case SectionType.face: - return S.of(context).searchFaceEmptySection; + return S.of(context).searchPeopleEmptySection; case SectionType.magic: - return "Discover"; + return S.of(context).searchDiscoverEmptySection; case SectionType.moment: return S.of(context).searchDatesEmptySection; case SectionType.location: From 93986461ddce746ffd4a880d15d1a40510ee2ff7 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 15 Nov 2024 16:06:11 +0530 Subject: [PATCH 22/75] [mob][photos] Copy changes --- mobile/lib/generated/intl/messages_ar.dart | 2 ++ mobile/lib/generated/intl/messages_be.dart | 2 ++ mobile/lib/generated/intl/messages_bg.dart | 2 ++ mobile/lib/generated/intl/messages_ca.dart | 2 ++ mobile/lib/generated/intl/messages_cs.dart | 2 ++ mobile/lib/generated/intl/messages_da.dart | 2 ++ mobile/lib/generated/intl/messages_de.dart | 2 ++ mobile/lib/generated/intl/messages_el.dart | 2 ++ mobile/lib/generated/intl/messages_en.dart | 2 ++ mobile/lib/generated/intl/messages_es.dart | 2 ++ mobile/lib/generated/intl/messages_et.dart | 2 ++ mobile/lib/generated/intl/messages_fa.dart | 2 ++ mobile/lib/generated/intl/messages_fr.dart | 2 ++ mobile/lib/generated/intl/messages_gu.dart | 2 ++ mobile/lib/generated/intl/messages_he.dart | 2 ++ mobile/lib/generated/intl/messages_hi.dart | 2 ++ mobile/lib/generated/intl/messages_id.dart | 2 ++ mobile/lib/generated/intl/messages_it.dart | 2 ++ mobile/lib/generated/intl/messages_ja.dart | 2 ++ mobile/lib/generated/intl/messages_km.dart | 2 ++ mobile/lib/generated/intl/messages_ko.dart | 2 ++ mobile/lib/generated/intl/messages_lt.dart | 2 ++ mobile/lib/generated/intl/messages_nl.dart | 2 ++ mobile/lib/generated/intl/messages_no.dart | 2 ++ mobile/lib/generated/intl/messages_pl.dart | 2 ++ mobile/lib/generated/intl/messages_pt.dart | 2 ++ mobile/lib/generated/intl/messages_ro.dart | 2 ++ mobile/lib/generated/intl/messages_ru.dart | 2 ++ mobile/lib/generated/intl/messages_sl.dart | 2 ++ mobile/lib/generated/intl/messages_sv.dart | 2 ++ mobile/lib/generated/intl/messages_ta.dart | 2 ++ mobile/lib/generated/intl/messages_te.dart | 2 ++ mobile/lib/generated/intl/messages_th.dart | 2 ++ mobile/lib/generated/intl/messages_ti.dart | 2 ++ mobile/lib/generated/intl/messages_tr.dart | 2 ++ mobile/lib/generated/intl/messages_uk.dart | 2 ++ mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_ar.arb | 3 ++- mobile/lib/l10n/intl_be.arb | 3 ++- mobile/lib/l10n/intl_bg.arb | 3 ++- mobile/lib/l10n/intl_ca.arb | 3 ++- mobile/lib/l10n/intl_cs.arb | 3 ++- mobile/lib/l10n/intl_da.arb | 3 ++- mobile/lib/l10n/intl_de.arb | 3 ++- mobile/lib/l10n/intl_el.arb | 3 ++- mobile/lib/l10n/intl_en.arb | 3 ++- mobile/lib/l10n/intl_es.arb | 3 ++- mobile/lib/l10n/intl_et.arb | 3 ++- mobile/lib/l10n/intl_fa.arb | 3 ++- mobile/lib/l10n/intl_fr.arb | 3 ++- mobile/lib/l10n/intl_gu.arb | 3 ++- mobile/lib/l10n/intl_he.arb | 3 ++- mobile/lib/l10n/intl_hi.arb | 3 ++- mobile/lib/l10n/intl_id.arb | 3 ++- mobile/lib/l10n/intl_it.arb | 3 ++- mobile/lib/l10n/intl_ja.arb | 3 ++- mobile/lib/l10n/intl_km.arb | 3 ++- mobile/lib/l10n/intl_ko.arb | 3 ++- mobile/lib/l10n/intl_lt.arb | 3 ++- mobile/lib/l10n/intl_nl.arb | 3 ++- mobile/lib/l10n/intl_no.arb | 3 ++- mobile/lib/l10n/intl_pl.arb | 3 ++- mobile/lib/l10n/intl_pt.arb | 3 ++- mobile/lib/l10n/intl_ro.arb | 3 ++- mobile/lib/l10n/intl_ru.arb | 3 ++- mobile/lib/l10n/intl_sl.arb | 3 ++- mobile/lib/l10n/intl_sv.arb | 3 ++- mobile/lib/l10n/intl_ta.arb | 3 ++- mobile/lib/l10n/intl_te.arb | 3 ++- mobile/lib/l10n/intl_th.arb | 3 ++- mobile/lib/l10n/intl_ti.arb | 3 ++- mobile/lib/l10n/intl_tr.arb | 3 ++- mobile/lib/l10n/intl_uk.arb | 3 ++- mobile/lib/l10n/intl_zh.arb | 3 ++- mobile/lib/models/search/search_types.dart | 2 +- 76 files changed, 159 insertions(+), 38 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 1e772e9a1d..406efc0cce 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -56,6 +56,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "sorry": MessageLookupByLibrary.simpleMessage("المعذرة"), "terminate": MessageLookupByLibrary.simpleMessage("إنهاء"), "terminateSession": diff --git a/mobile/lib/generated/intl/messages_be.dart b/mobile/lib/generated/intl/messages_be.dart index 5dfdc901fa..9092285095 100644 --- a/mobile/lib/generated/intl/messages_be.dart +++ b/mobile/lib/generated/intl/messages_be.dart @@ -227,6 +227,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Бяспека"), "selectAll": MessageLookupByLibrary.simpleMessage("Абраць усё"), "selectReason": diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index 6090389084..a23489ec1f 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index b9dd77cc86..2b8f5a7ebc 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 8004045c76..a2a98616d5 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -34,6 +34,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index f0a1e5f8b0..5c2005ea4d 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -124,6 +124,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"), "selectedPhotos": m4, "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 0f4e19f9cf..1a22db95fe 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -1455,6 +1455,8 @@ class MessageLookup extends MessageLookupByLibrary { "Gruppiere Fotos, die innerhalb des Radius eines bestimmten Fotos aufgenommen wurden"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index cd7cefc67d..e0b453fe8d 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -31,6 +31,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 79cda6fb51..50c3acbaf2 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -1390,6 +1390,8 @@ class MessageLookup extends MessageLookupByLibrary { "Group photos that are taken within some radius of a photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invite people, and you\'ll see all photos shared by them here"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Security"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index e095c5777c..4722d1b979 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -1440,6 +1440,8 @@ class MessageLookup extends MessageLookupByLibrary { "Agrupar las fotos que se tomaron cerca de la localización de una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita a gente y verás todas las fotos compartidas aquí"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index e2cf2affdc..2e63ce3c96 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -211,6 +211,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Turvalisus"), "selectAll": MessageLookupByLibrary.simpleMessage("Vali kõik"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Vali keel"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index 5eb7669028..1971bbb14f 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -330,6 +330,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("امنیت"), "selectAll": MessageLookupByLibrary.simpleMessage("انتخاب همه"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 41941d6b79..8ee6ddb2fc 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -1464,6 +1464,8 @@ class MessageLookup extends MessageLookupByLibrary { "Grouper les photos qui sont prises dans un certain angle d\'une photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invitez des gens, et vous verrez ici toutes les photos qu\'ils partagent"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index c87e295b8a..bc1223bae1 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index 68bb9df9b6..0bf3a2cd5e 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -748,6 +748,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("אבטחה"), "selectAlbum": MessageLookupByLibrary.simpleMessage("בחר אלבום"), "selectAll": MessageLookupByLibrary.simpleMessage("בחר הכל"), diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index a5cc80662b..9b895a3bce 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -93,6 +93,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectReason": MessageLookupByLibrary.simpleMessage("कारण चुनें"), "sendEmail": MessageLookupByLibrary.simpleMessage("ईमेल भेजें"), "somethingWentWrongPleaseTryAgain": diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 4bb33304fd..16cc01c400 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -1193,6 +1193,8 @@ class MessageLookup extends MessageLookupByLibrary { "Segera tiba: Penelusuran wajah & ajaib ✨"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Keamanan"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 2ea988ce06..fba3207714 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -1446,6 +1446,8 @@ class MessageLookup extends MessageLookupByLibrary { "Raggruppa foto scattate entro un certo raggio da una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita persone e vedrai qui tutte le foto condivise da loro"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index c72ea6645f..aca65c20cd 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -1220,6 +1220,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("当時の直近で撮影された写真をグループ化"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("友達を招待すると、共有される写真はここから閲覧できます"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("セキュリティ"), "selectALocation": MessageLookupByLibrary.simpleMessage("場所を選択"), diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index 100cf69418..2c2c8454a6 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index e4286ee7a6..f04fded67c 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -48,6 +48,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index da787568e6..5976a2645f 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -833,6 +833,8 @@ class MessageLookup extends MessageLookupByLibrary { "Grupės nuotraukos, kurios padarytos tam tikru spinduliu nuo nuotraukos"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "selectALocation": MessageLookupByLibrary.simpleMessage("Pasirinkite vietovę"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index fce47ff806..9024f6817f 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -1430,6 +1430,8 @@ class MessageLookup extends MessageLookupByLibrary { "Foto\'s groeperen die in een bepaalde straal van een foto worden genomen"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 250c61eb0b..f4fc74d775 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -356,6 +356,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "security": MessageLookupByLibrary.simpleMessage("Sikkerhet"), "selectAll": MessageLookupByLibrary.simpleMessage("Velg alle"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 5778f31676..d4cf46daee 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -1446,6 +1446,8 @@ class MessageLookup extends MessageLookupByLibrary { "Grupuj zdjęcia zrobione w promieniu zdjęcia"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 0e6b7b1a70..e4859e76ff 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -1440,6 +1440,8 @@ class MessageLookup extends MessageLookupByLibrary { "Fotos de grupo que estão sendo tiradas em algum raio da foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Convide pessoas e você verá todas as fotos compartilhadas por elas aqui"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Segurança"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_ro.dart b/mobile/lib/generated/intl/messages_ro.dart index 09609b3400..a170cb9d76 100644 --- a/mobile/lib/generated/intl/messages_ro.dart +++ b/mobile/lib/generated/intl/messages_ro.dart @@ -1182,6 +1182,8 @@ class MessageLookup extends MessageLookupByLibrary { "Grupare fotografii realizate în raza unei fotografii"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invitați persoane și veți vedea aici toate fotografiile distribuite de acestea"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Securitate"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 6b9cf9f933..a1eff0f9c7 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -1372,6 +1372,8 @@ class MessageLookup extends MessageLookupByLibrary { "Групповые фотографии, сделанные в некотором радиусе от фотографии"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Пригласите людей, и вы увидите все фотографии, которыми они поделились здесь"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Безопасность"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_sl.dart b/mobile/lib/generated/intl/messages_sl.dart index 72e3aba9a4..81b60bd891 100644 --- a/mobile/lib/generated/intl/messages_sl.dart +++ b/mobile/lib/generated/intl/messages_sl.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index be17ec8ab8..0e26a61abe 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -463,6 +463,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Filtyper och namn"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "selectAlbum": MessageLookupByLibrary.simpleMessage("Välj album"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Välj språk"), diff --git a/mobile/lib/generated/intl/messages_ta.dart b/mobile/lib/generated/intl/messages_ta.dart index 296e3ad91b..9141faf514 100644 --- a/mobile/lib/generated/intl/messages_ta.dart +++ b/mobile/lib/generated/intl/messages_ta.dart @@ -56,6 +56,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "verify": MessageLookupByLibrary.simpleMessage("சரிபார்க்கவும்") }; } diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart index 9fd08625dd..055e89f535 100644 --- a/mobile/lib/generated/intl/messages_te.dart +++ b/mobile/lib/generated/intl/messages_te.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index 1b23328542..1aa1e4bf69 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -292,6 +292,8 @@ class MessageLookup extends MessageLookupByLibrary { "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "selectAll": MessageLookupByLibrary.simpleMessage("เลือกทั้งหมด"), "selectReason": MessageLookupByLibrary.simpleMessage("เลือกเหตุผล"), "sendEmail": MessageLookupByLibrary.simpleMessage("ส่งอีเมล"), diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart index ae38369d50..7761d43d9b 100644 --- a/mobile/lib/generated/intl/messages_ti.dart +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -29,6 +29,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( "Images will be shown here once processing is complete"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete") }; } diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 1b858247da..0f27c79538 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -1184,6 +1184,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bir fotoğrafın belli bir yarıçapında çekilen fotoğrafları gruplandırın"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "İnsanları davet ettiğinizde onların paylaştığı tüm fotoğrafları burada göreceksiniz"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Güvenlik"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_uk.dart b/mobile/lib/generated/intl/messages_uk.dart index f9f2c56f98..78a875268c 100644 --- a/mobile/lib/generated/intl/messages_uk.dart +++ b/mobile/lib/generated/intl/messages_uk.dart @@ -1449,6 +1449,8 @@ class MessageLookup extends MessageLookupByLibrary { "Групові фотографії, які зроблені в певному радіусі від фотографії"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Запросіть людей, і ви побачите всі фотографії, якими вони поділилися, тут"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("Безпека"), "selectALocation": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 005751d400..1f8f49fc33 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -1152,6 +1152,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("在照片的一定半径内拍摄的几组照片"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("邀请他人,您将在此看到他们分享的所有照片"), + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "People will be shown here once processing is complete"), "searchResultCount": m53, "security": MessageLookupByLibrary.simpleMessage("安全"), "selectALocation": MessageLookupByLibrary.simpleMessage("选择一个位置"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 072fe8472a..a76cc59628 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9935,6 +9935,16 @@ class S { args: [], ); } + + /// `People will be shown here once processing is complete` + String get searchPersonsEmptySection { + return Intl.message( + 'People will be shown here once processing is complete', + name: 'searchPersonsEmptySection', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index 3ea9676ec0..66351279a9 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -27,5 +27,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_be.arb b/mobile/lib/l10n/intl_be.arb index 04ee0bec6f..5f02ccbf30 100644 --- a/mobile/lib/l10n/intl_be.arb +++ b/mobile/lib/l10n/intl_be.arb @@ -203,5 +203,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index f687466154..2ec71b9385 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -6,5 +6,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index af05ff2bb5..44ea6e4f79 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -88,5 +88,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 8da762b17a..2fbb19fb3c 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1362,5 +1362,6 @@ "onlyThem": "Nur diese", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index 3cbebecbf7..9529a9c126 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -4,5 +4,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index f7c5a6e75e..2c7b8701fd 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1362,5 +1362,6 @@ "onlyThem": "Only them", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index a0b348e5c4..0201a97f91 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1346,5 +1346,6 @@ "processingImport": "Procesando {folderName}...", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index ac2aefa042..1b373f56c1 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -222,5 +222,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index 8065416cfe..e930a3fea9 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -311,5 +311,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index b183bc144f..c51e658e2b 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1350,5 +1350,6 @@ "yesResetPerson": "Oui, réinitialiser la personne", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index 936d19f8aa..d7a8caa57a 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -820,5 +820,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 7c5dc9799d..0442f70ccf 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -52,5 +52,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index f5eaa5ad55..e69ab4d375 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1147,5 +1147,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 6ea1a49d3f..e93524afa8 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1362,5 +1362,6 @@ "onlyThem": "Solo loro", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index 22e28e63d5..f888cb4bec 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1346,5 +1346,6 @@ "processingImport": "{folderName} を処理中...", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 0ad9164f8b..5233d7e229 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -16,5 +16,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index a60b13547c..509760dd15 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -804,5 +804,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index b2ca04afdd..ec4edad3da 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1346,5 +1346,6 @@ "processingImport": "Verwerken van {folderName}...", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 6fc83d3bf9..6867ae4f9d 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -375,5 +375,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 98abaf3d92..cbdd2d0dc5 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Tak, zresetuj osobę", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index cf336a9ef8..fde2f7dd88 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1362,5 +1362,6 @@ "onlyThem": "Apenas eles", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ro.arb b/mobile/lib/l10n/intl_ro.arb index be4b48f576..cce7c58181 100644 --- a/mobile/lib/l10n/intl_ro.arb +++ b/mobile/lib/l10n/intl_ro.arb @@ -1095,5 +1095,6 @@ "moreDetails": "Mai multe detalii", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index eb447765d9..d6cd0c285d 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1303,5 +1303,6 @@ "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sl.arb b/mobile/lib/l10n/intl_sl.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_sl.arb +++ b/mobile/lib/l10n/intl_sl.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 6d981953d9..df8c5f9a85 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -459,5 +459,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb index a3e14d5201..801f744453 100644 --- a/mobile/lib/l10n/intl_ta.arb +++ b/mobile/lib/l10n/intl_ta.arb @@ -19,5 +19,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index 260d1e76be..ee8d6bc635 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -299,5 +299,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index d2e533e382..d97e7c81c2 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -3,5 +3,6 @@ "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index c40483e539..67e586bea6 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1172,5 +1172,6 @@ "customEndpoint": "{endpoint}'e bağlanıldı", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index b7229aac6b..55e7bb0b23 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -1361,5 +1361,6 @@ "yesResetPerson": "Так, скинути особу", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 3596891e3e..9d8adfff12 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1346,5 +1346,6 @@ "processingImport": "正在处理 {folderName}...", "checkingModels": "Checking models...", "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete" + "searchDiscoverEmptySection": "Images will be shown here once processing is complete", + "searchPersonsEmptySection": "People will be shown here once processing is complete" } \ No newline at end of file diff --git a/mobile/lib/models/search/search_types.dart b/mobile/lib/models/search/search_types.dart index 5b21dc4e86..749d5e5dbc 100644 --- a/mobile/lib/models/search/search_types.dart +++ b/mobile/lib/models/search/search_types.dart @@ -77,7 +77,7 @@ extension SectionTypeExtensions on SectionType { String getEmptyStateText(BuildContext context) { switch (this) { case SectionType.face: - return S.of(context).searchPeopleEmptySection; + return S.of(context).searchPersonsEmptySection; case SectionType.magic: return S.of(context).searchDiscoverEmptySection; case SectionType.moment: From 102929a5d63b32a1b0b315287593098a8d11188c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 15 Nov 2024 17:43:32 +0530 Subject: [PATCH 23/75] [mob][photos] Decrease the chances of hero animation not working between faces in 'All' screen of People and People section when going back to search section from 'All' screen --- mobile/lib/ui/viewer/search_tab/people_section.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 7ec0686ed2..043f2c4439 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -198,8 +198,9 @@ class PersonSearchExample extends StatelessWidget { Widget build(BuildContext context) { final bool isCluster = (searchResult.type() == ResultType.faces && int.tryParse(searchResult.name()) != null); - final heroTag = - searchResult.heroTag() + (searchResult.previewThumbnail()?.tag ?? ""); + final heroTag = searchResult.heroTag() + + (searchResult.previewThumbnail()?.tag ?? "") + + searchResult.resultFiles().length.toString(); return GestureDetector( onTap: () { RecentSearches().add(searchResult.name()); From 392ec34f2551de35251f47f988d441ead96ca828 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 15 Nov 2024 20:57:15 +0530 Subject: [PATCH 24/75] [mob][photos] Remove hero animation from People section because when it's enabled, there is a UI glitch because of an issue in flutter https://github.com/flutter/flutter/issues/47991 --- .../ui/viewer/search_tab/people_section.dart | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 043f2c4439..b6e3618491 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -198,9 +198,7 @@ class PersonSearchExample extends StatelessWidget { Widget build(BuildContext context) { final bool isCluster = (searchResult.type() == ResultType.faces && int.tryParse(searchResult.name()) != null); - final heroTag = searchResult.heroTag() + - (searchResult.previewThumbnail()?.tag ?? "") + - searchResult.resultFiles().length.toString(); + return GestureDetector( onTap: () { RecentSearches().add(searchResult.name()); @@ -238,21 +236,18 @@ class PersonSearchExample extends StatelessWidget { width: size - 2, height: size - 2, child: searchResult.previewThumbnail() != null - ? Hero( - tag: heroTag, - child: ClipPath( - clipper: ShapeBorderClipper( - shape: ContinuousRectangleBorder( - borderRadius: BorderRadius.circular(80), - ), + ? ClipPath( + clipper: ShapeBorderClipper( + shape: ContinuousRectangleBorder( + borderRadius: BorderRadius.circular(80), ), - child: searchResult.type() != ResultType.faces - ? ThumbnailWidget( - searchResult.previewThumbnail()!, - shouldShowSyncStatus: false, - ) - : FaceSearchResult(searchResult, heroTag), ), + child: searchResult.type() != ResultType.faces + ? ThumbnailWidget( + searchResult.previewThumbnail()!, + shouldShowSyncStatus: false, + ) + : FaceSearchResult(searchResult), ) : ClipPath( clipper: ShapeBorderClipper( @@ -324,8 +319,8 @@ class PersonSearchExample extends StatelessWidget { class FaceSearchResult extends StatelessWidget { final SearchResult searchResult; - final String heroTagPrefix; - const FaceSearchResult(this.searchResult, this.heroTagPrefix, {super.key}); + + const FaceSearchResult(this.searchResult, {super.key}); @override Widget build(BuildContext context) { From ddd13a88be69b0cff1d130da0ba9e781b01139cd Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 12:11:18 +0530 Subject: [PATCH 25/75] Types --- web/packages/new/photos/services/ml/people.ts | 7 ++++++- web/packages/new/photos/services/user-entity/index.ts | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 227101fdf4..48d6edb56e 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -58,12 +58,17 @@ export interface CGroupUserEntityData { */ name?: string | undefined; /** - * An unordered set ofe clusters that have been assigned to this group. + * An unordered set of clusters that have been assigned to this group. * * For ease of transportation and persistence this is an array, but it * should conceptually be thought of as a set. */ assigned: FaceCluster[]; + /** + * An unordered set of faces (IDs) that the user has manually marked as not + * belonging to this group. + */ + rejectedFaceIDs: string[]; /** * True if this cluster group should be hidden. * diff --git a/web/packages/new/photos/services/user-entity/index.ts b/web/packages/new/photos/services/user-entity/index.ts index 0dcf4fe777..813a1859d2 100644 --- a/web/packages/new/photos/services/user-entity/index.ts +++ b/web/packages/new/photos/services/user-entity/index.ts @@ -85,8 +85,7 @@ const RemoteFaceCluster = z.object({ const RemoteCGroupData = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array(RemoteFaceCluster), - // The remote cgroup also has a "rejected" property, but that is not - // currently used by any of the clients. + rejectedFaceIDs: z.array(z.string()).nullish().transform(nullToUndefined), isHidden: z.boolean(), avatarFaceID: z.string().nullish().transform(nullToUndefined), }); From c577ccd7e41bff416ceff141099324579c099ec1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 12:41:10 +0530 Subject: [PATCH 26/75] Filter out rejected face IDs when using remote cgroups --- web/packages/new/photos/services/ml/people.ts | 18 +++++++++++++++--- .../new/photos/services/user-details.ts | 10 ++++++---- .../new/photos/services/user-entity/index.ts | 4 ++-- web/packages/utils/transform.ts | 5 +++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 48d6edb56e..349336336d 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -67,6 +67,9 @@ export interface CGroupUserEntityData { /** * An unordered set of faces (IDs) that the user has manually marked as not * belonging to this group. + * + * For ease of transportation and persistence this is an array, but it + * should conceptually be thought of as a set. */ rejectedFaceIDs: string[]; /** @@ -265,11 +268,20 @@ export const reconstructPeopleState = async (): Promise => { // their name to an empty string. if (!name) isHidden = true; + let assignedFaceIDs: string[][]; + if (data.rejectedFaceIDs.length == 0) { + // Fast path for when there are no rejected faces. + assignedFaceIDs = assigned.map(({ faces }) => faces); + } else { + const rejectedFaceIDs = new Set(data.rejectedFaceIDs); + assignedFaceIDs = assigned.map(({ faces }) => + faces.filter((id) => !rejectedFaceIDs.has(id)), + ); + } + // Person faces from all the clusters assigned to this cgroup, sorted by // recency (then score). - const faces = personFacesSortedNewestFirst( - assigned.map(({ faces }) => faces).flat(), - ); + const faces = personFacesSortedNewestFirst(assignedFaceIDs.flat()); // Ignore this cgroup if we don't have visible faces left in it. const mostRecentFace = faces[0]; diff --git a/web/packages/new/photos/services/user-details.ts b/web/packages/new/photos/services/user-details.ts index 995e3a3dc9..f3d9dfc13f 100644 --- a/web/packages/new/photos/services/user-details.ts +++ b/web/packages/new/photos/services/user-details.ts @@ -2,7 +2,11 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKV, setKV } from "@/base/kv"; import { apiURL, familyAppOrigin, paymentsAppOrigin } from "@/base/origins"; import { ensure } from "@/utils/ensure"; -import { nullishToZero, nullToUndefined } from "@/utils/transform"; +import { + nullishToEmpty, + nullishToZero, + nullToUndefined, +} from "@/utils/transform"; import { getData, LS_KEYS, setLSUser } from "@ente/shared/storage/localStorage"; import isElectron from "is-electron"; import { z } from "zod"; @@ -112,9 +116,7 @@ const BonusData = z.object({ /** * List of bonuses applied for the user. */ - storageBonuses: Bonus.array() - .nullish() - .transform((v) => v ?? []), + storageBonuses: Bonus.array().nullish().transform(nullishToEmpty), }); /** diff --git a/web/packages/new/photos/services/user-entity/index.ts b/web/packages/new/photos/services/user-entity/index.ts index 813a1859d2..ad7fb76eb9 100644 --- a/web/packages/new/photos/services/user-entity/index.ts +++ b/web/packages/new/photos/services/user-entity/index.ts @@ -4,7 +4,7 @@ import { encryptBoxB64, generateNewBlobOrStreamKey, } from "@/base/crypto"; -import { nullToUndefined } from "@/utils/transform"; +import { nullishToEmpty, nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip, gzip } from "../../utils/gzip"; import type { CGroupUserEntityData } from "../ml/people"; @@ -85,7 +85,7 @@ const RemoteFaceCluster = z.object({ const RemoteCGroupData = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array(RemoteFaceCluster), - rejectedFaceIDs: z.array(z.string()).nullish().transform(nullToUndefined), + rejectedFaceIDs: z.array(z.string()).nullish().transform(nullishToEmpty), isHidden: z.boolean(), avatarFaceID: z.string().nullish().transform(nullToUndefined), }); diff --git a/web/packages/utils/transform.ts b/web/packages/utils/transform.ts index 16e1c1c4e0..60053b0fae 100644 --- a/web/packages/utils/transform.ts +++ b/web/packages/utils/transform.ts @@ -8,3 +8,8 @@ export const nullToUndefined = (v: T | null | undefined): T | undefined => * Convert `null` and `undefined` to `0`, passthrough everything else unchanged. */ export const nullishToZero = (v: number | null | undefined) => v ?? 0; + +/** + * Convert `null` and `undefined` to `[]`, passthrough everything else unchanged. + */ +export const nullishToEmpty = (v: T[] | null | undefined) => v ?? []; From f6eeb6abcec4fb61b930fe520b3f9848ce30c903 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 14:04:10 +0530 Subject: [PATCH 27/75] Apply rejections to suggestion base clusters --- web/packages/new/photos/services/ml/people.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 349336336d..a531f9d09a 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -446,7 +446,12 @@ export const _suggestionsAndChoicesForPerson = async ( ): Promise => { const startTime = Date.now(); - const personClusters = person.cgroup.data.assigned; + const rejectedFaceIDs = new Set(person.cgroup.data.rejectedFaceIDs); + const personClusters = person.cgroup.data.assigned.map((cluster) => ({ + ...cluster, + faces: cluster.faces.filter((id) => !rejectedFaceIDs.has(id)), + })); + const rejectedClusterIDs = new Set( await savedRejectedClustersForCGroup(person.cgroup.id), ); From fb3c845759a8a9c9e80d6a34774038705a6d142a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 14:45:50 +0530 Subject: [PATCH 28/75] Add cluster --- web/packages/new/photos/services/ml/index.ts | 27 ++++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index f28496349f..5aea3e396b 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -709,6 +709,10 @@ export const addCGroup = async (name: string, cluster: FaceCluster) => { /** * Add a new cluster to an existing named person. * + * If this cluster contains any faces that had previously been marked as not + * belonging to the person, then they will be removed from the rejected list and + * will get reassociated to the person. + * * @param cgroup The existing cgroup underlying the person. This is the (remote) * user entity that will get updated. * @@ -717,28 +721,17 @@ export const addCGroup = async (name: string, cluster: FaceCluster) => { export const addClusterToCGroup = async ( cgroup: CGroup, cluster: FaceCluster, -) => - updateAssignedClustersForCGroup( - cgroup, - cgroup.data.assigned.concat([cluster]), +) => { + const clusterFaceIDs = new Set(cluster.faces); + const assigned = cgroup.data.assigned.concat([cluster]); + const rejectedFaceIDs = cgroup.data.rejectedFaceIDs.filter( + (id) => !clusterFaceIDs.has(id), ); -/** - * Update the clusters assigned to an existing named person. - * - * @param cgroup The existing cgroup underlying the person. This is the (remote) - * user entity that will get updated. - * - * @param cluster The new value of the face clusters assigned to this person. - */ -export const updateAssignedClustersForCGroup = async ( - cgroup: CGroup, - assigned: FaceCluster[], -) => { const masterKey = await masterKeyFromSession(); await updateOrCreateUserEntities( "cgroup", - [{ ...cgroup, data: { ...cgroup.data, assigned } }], + [{ ...cgroup, data: { ...cgroup.data, assigned, rejectedFaceIDs } }], masterKey, ); return mlSync(); From 5abd6468c71fda49f2eb4ac0055af269c44a69f2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 17:02:39 +0530 Subject: [PATCH 29/75] Prune on positive suggestion accept --- web/packages/new/photos/services/ml/people.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index a531f9d09a..6e7275564e 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -650,6 +650,7 @@ export const _applyPersonSuggestionUpdates = async ( const localClusters = await savedFaceClusters(); let assignedClusters = [...cgroup.data.assigned]; + const newlyAssignedFaceIDs = new Set(); let rejectedClusterIDs = await savedRejectedClustersForCGroup(cgroup.id); let assignUpdateCount = 0; @@ -657,8 +658,9 @@ export const _applyPersonSuggestionUpdates = async ( // Add cluster with `clusterID` to the list of assigned clusters. const assign = (clusterID: string) => { - const cluster = localClusters.find((c) => c.id == clusterID); - assignedClusters.push(ensure(cluster)); + const cluster = ensure(localClusters.find((c) => c.id == clusterID)); + assignedClusters.push(cluster); + cluster.faces.forEach((id) => newlyAssignedFaceIDs.add(id)); assignUpdateCount += 1; }; @@ -724,9 +726,17 @@ export const _applyPersonSuggestionUpdates = async ( if (assignUpdateCount > 0) { const assigned = assignedClusters; + const rejectedFaceIDs = cgroup.data.rejectedFaceIDs.filter( + (id) => !newlyAssignedFaceIDs.has(id), + ); await updateOrCreateUserEntities( "cgroup", - [{ ...cgroup, data: { ...cgroup.data, assigned } }], + [ + { + ...cgroup, + data: { ...cgroup.data, assigned, rejectedFaceIDs }, + }, + ], masterKey, ); await saveFaceClusters(localClusters); From f9fb65db41b930791a16f30bb2841d7c9354dd0d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 17:08:44 +0530 Subject: [PATCH 30/75] Reject on unassign --- web/packages/new/photos/services/ml/people.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 6e7275564e..1955118be5 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -652,13 +652,17 @@ export const _applyPersonSuggestionUpdates = async ( let assignedClusters = [...cgroup.data.assigned]; const newlyAssignedFaceIDs = new Set(); let rejectedClusterIDs = await savedRejectedClustersForCGroup(cgroup.id); + let newlyRejectedFaceIDs: string[] = []; let assignUpdateCount = 0; let rejectUpdateCount = 0; + const clusterWithID = (clusterID: string) => + ensure(localClusters.find((c) => c.id == clusterID)); + // Add cluster with `clusterID` to the list of assigned clusters. const assign = (clusterID: string) => { - const cluster = ensure(localClusters.find((c) => c.id == clusterID)); + const cluster = clusterWithID(clusterID); assignedClusters.push(cluster); cluster.faces.forEach((id) => newlyAssignedFaceIDs.add(id)); assignUpdateCount += 1; @@ -691,7 +695,9 @@ export const _applyPersonSuggestionUpdates = async ( // Add `clusterID` to the list of rejected clusters. const reject = (clusterID: string) => { + const cluster = clusterWithID(clusterID); rejectedClusterIDs.push(clusterID); + newlyRejectedFaceIDs = newlyRejectedFaceIDs.concat(cluster.faces); rejectUpdateCount += 1; }; @@ -724,11 +730,11 @@ export const _applyPersonSuggestionUpdates = async ( } } - if (assignUpdateCount > 0) { + if (assignUpdateCount > 0 || newlyRejectedFaceIDs.length > 0) { const assigned = assignedClusters; - const rejectedFaceIDs = cgroup.data.rejectedFaceIDs.filter( - (id) => !newlyAssignedFaceIDs.has(id), - ); + const rejectedFaceIDs = cgroup.data.rejectedFaceIDs + .concat(newlyRejectedFaceIDs) + .filter((id) => !newlyAssignedFaceIDs.has(id)); await updateOrCreateUserEntities( "cgroup", [ From f1ba5cfc43beb7e80761c921618094cf5bed4af8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 17:16:51 +0530 Subject: [PATCH 31/75] Distinguish between suggestion reject and saved choice reject --- web/packages/new/photos/services/ml/people.ts | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 1955118be5..60bc54da3d 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -619,15 +619,21 @@ const randomSample = (items: T[], n: number) => { * A map specifying the changes to make when the user presses the save button on * the people suggestions dialog. * - * Each entry is a (clusterID, assigned) pair. + * Each entry is a (clusterID, update) pair. * - * * Entries with assigned `true` should be assigned to the cgroup, - * * Entries with assigned `false` should be rejected from the cgroup. - * * Entries with assigned `undefined` should be reset - i.e. they should be - * removed from both the assigned and rejected choices associated with the - * cgroup (if needed). + * * Entries with "assign" should be assigned to the cgroup, + * * Entries with "reject-local" should be rejected from the cgroup locally. + * These correspond to suggestions which the user did not accept. + * * Entries with "reject-remote" should be rejected from the cgroup both + * locally and on remote. These correspond to saved choices which the user + * went on to explicitly reject. + * * Entries with "reset" should be reset - i.e. should be removed from both the + * assigned and rejected choices associated with the cgroup (if needed). */ -export type PersonSuggestionUpdates = Map; +export type PersonSuggestionUpdates = Map< + string, + "assign" | "reject-local" | "reject-remote" | "reset" +>; /** * Implementation for the "save" action on the SuggestionsDialog. @@ -693,8 +699,15 @@ export const _applyPersonSuggestionUpdates = async ( } }; - // Add `clusterID` to the list of rejected clusters. - const reject = (clusterID: string) => { + // Add `clusterID` to the list of rejected clusters locally. + const rejectLocal = (clusterID: string) => { + rejectedClusterIDs.push(clusterID); + rejectUpdateCount += 1; + }; + + // Add `clusterID` to the list of rejected clusters locally, and mark the + // faces in that cluster as rejected on remote. + const rejectRemote = (clusterID: string) => { const cluster = clusterWithID(clusterID); rejectedClusterIDs.push(clusterID); newlyRejectedFaceIDs = newlyRejectedFaceIDs.concat(cluster.faces); @@ -713,17 +726,22 @@ export const _applyPersonSuggestionUpdates = async ( for (const [clusterID, assigned] of updates.entries()) { switch (assigned) { - case true /* assign */: + case "assign": assign(clusterID); unrejectIfNeeded(clusterID); break; - case false /* reject */: + case "reject-local": unassignIfNeeded(clusterID); - reject(clusterID); + rejectLocal(clusterID); break; - case undefined /* reset */: + case "reject-remote": + unassignIfNeeded(clusterID); + rejectRemote(clusterID); + break; + + case "reset": unassignIfNeeded(clusterID); unrejectIfNeeded(clusterID); break; From 8cf87acb7bac5e315097e14e868069dcae0fae1a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 17:27:26 +0530 Subject: [PATCH 32/75] Rework --- .../components/gallery/PeopleHeader.tsx | 41 ++++++++++++++++--- web/packages/new/photos/services/ml/people.ts | 32 +++++++-------- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/web/packages/new/photos/components/gallery/PeopleHeader.tsx b/web/packages/new/photos/components/gallery/PeopleHeader.tsx index bda66fa1fb..37e1fe0cae 100644 --- a/web/packages/new/photos/components/gallery/PeopleHeader.tsx +++ b/web/packages/new/photos/components/gallery/PeopleHeader.tsx @@ -528,7 +528,23 @@ const suggestionsDialogReducer: React.Reducer< // original assigned state. updates.delete(item.id); } else { - updates.set(item.id, value); + const update = (() => { + switch (value) { + case true: + // true corresponds to update "assign". + return "assign"; + case false: + // false maps to different updates for suggestions + // vs choices. + return item.assigned === undefined + ? "rejectSuggestion" + : "rejectSavedChoice"; + case undefined: + // undefined means reset. + return "reset"; + } + })(); + updates.set(item.id, update); } return { ...state, updates }; } @@ -764,7 +780,7 @@ const SuggestionOrChoiceList: React.FC = ({ {!item.fixed && ( onUpdateItem(item, toItemValue(v))} > @@ -781,12 +797,25 @@ const SuggestionOrChoiceList: React.FC = ({ ); -const fromItemValue = (item: SCItem, updates: PersonSuggestionUpdates) => { +const itemValueFromUpdate = ( + item: SCItem, + updates: PersonSuggestionUpdates, +) => { // Use the in-memory state if available. For choices, fallback to their // original state. - const resolved = updates.has(item.id) - ? updates.get(item.id) - : item.assigned; + const resolveUpdate = () => { + switch (updates.get(item.id)) { + case "assign": + return true; + case "rejectSavedChoice": + return false; + case "rejectSuggestion": + return false; + default: + return undefined; + } + }; + const resolved = updates.has(item.id) ? resolveUpdate() : item.assigned; return resolved ? "yes" : resolved === false ? "no" : undefined; }; diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 60bc54da3d..f06f633779 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -621,18 +621,18 @@ const randomSample = (items: T[], n: number) => { * * Each entry is a (clusterID, update) pair. * - * * Entries with "assign" should be assigned to the cgroup, - * * Entries with "reject-local" should be rejected from the cgroup locally. - * These correspond to suggestions which the user did not accept. - * * Entries with "reject-remote" should be rejected from the cgroup both + * * Clusters with "assign" should be assigned to the cgroup, + * * Clusters with "rejectSuggestion" should be rejected from the cgroup + * locally. These correspond to suggestions which the user did not accept. + * * Clusters with "rejectSavedChoice" should be rejected from the cgroup both * locally and on remote. These correspond to saved choices which the user * went on to explicitly reject. - * * Entries with "reset" should be reset - i.e. should be removed from both the - * assigned and rejected choices associated with the cgroup (if needed). + * * Clusters with "reset" should be reset - i.e. should be removed from both + * the assigned and rejected choices associated with the cgroup (if needed). */ export type PersonSuggestionUpdates = Map< string, - "assign" | "reject-local" | "reject-remote" | "reset" + "assign" | "rejectSuggestion" | "rejectSavedChoice" | "reset" >; /** @@ -700,18 +700,15 @@ export const _applyPersonSuggestionUpdates = async ( }; // Add `clusterID` to the list of rejected clusters locally. - const rejectLocal = (clusterID: string) => { + const rejectClusterLocal = (clusterID: string) => { rejectedClusterIDs.push(clusterID); rejectUpdateCount += 1; }; - // Add `clusterID` to the list of rejected clusters locally, and mark the - // faces in that cluster as rejected on remote. - const rejectRemote = (clusterID: string) => { + // Mark the faces in `clusterID` as rejected on remote. + const rejectFacesRemote = (clusterID: string) => { const cluster = clusterWithID(clusterID); - rejectedClusterIDs.push(clusterID); newlyRejectedFaceIDs = newlyRejectedFaceIDs.concat(cluster.faces); - rejectUpdateCount += 1; }; // Remove `clusterID` from the list of rejected clusters (if needed). @@ -731,14 +728,15 @@ export const _applyPersonSuggestionUpdates = async ( unrejectIfNeeded(clusterID); break; - case "reject-local": + case "rejectSuggestion": unassignIfNeeded(clusterID); - rejectLocal(clusterID); + rejectClusterLocal(clusterID); break; - case "reject-remote": + case "rejectSavedChoice": unassignIfNeeded(clusterID); - rejectRemote(clusterID); + rejectClusterLocal(clusterID); + rejectFacesRemote(clusterID); break; case "reset": From 0e6705f8e13c04c5b592ed1e2e929e1a3f23286f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 16 Nov 2024 09:27:20 +0530 Subject: [PATCH 33/75] Compute rejected clusters --- .../new/photos/services/ml/cluster.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index ffdb52d877..a2b73bca69 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -97,6 +97,26 @@ export const _clusterFaces = async ( const sortedCGroups = cgroups.sort((a, b) => b.updatedAt - a.updatedAt); + const rejectedClusterIDsForFaceID = new Map>(); + for (const cgroup of sortedCGroups) { + if (cgroup.data.rejectedFaceIDs.length == 0) { + clusters = clusters.concat(cgroup.data.assigned); + } else { + const rejectedFaceIDs = new Set(cgroup.data.rejectedFaceIDs); + clusters = clusters.concat( + cgroup.data.assigned.map((cluster) => ({ + ...cluster, + faces: cluster.faces.filter((f) => !rejectedFaceIDs.has(f)), + })), + ); + for (const faceID of rejectedFaceIDs) { + const s = rejectedClusterIDsForFaceID.get(faceID) ?? new Set(); + cgroup.data.assigned.forEach(({ id }) => s.add(id)); + rejectedClusterIDsForFaceID.set(faceID, s); + } + } + } + // Extract the remote clusters. clusters = clusters.concat( // See: [Note: strict mode migration] From 1aae178179a92cb03ca61f30cc8070b7563c2f4f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 16 Nov 2024 09:48:52 +0530 Subject: [PATCH 34/75] Use --- .../new/photos/services/ml/cluster.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index a2b73bca69..55f8ed9d5b 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -97,6 +97,7 @@ export const _clusterFaces = async ( const sortedCGroups = cgroups.sort((a, b) => b.updatedAt - a.updatedAt); + // Fill in clusters from remote cgroups, and also construct rejected lookup. const rejectedClusterIDsForFaceID = new Map>(); for (const cgroup of sortedCGroups) { if (cgroup.data.rejectedFaceIDs.length == 0) { @@ -117,15 +118,6 @@ export const _clusterFaces = async ( } } - // Extract the remote clusters. - clusters = clusters.concat( - // See: [Note: strict mode migration] - // - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - sortedCGroups.map((cg) => cg.data.assigned).flat(), - ); - // Add on the clusters we have available locally. clusters = clusters.concat(await savedFaceClusters()); @@ -167,6 +159,7 @@ export const _clusterFaces = async ( await clusterBatchLinear( faces.slice(offset, offset + batchSize), state, + rejectedClusterIDsForFaceID, ({ completed }) => onProgress({ completed: offset + completed, total }), ); @@ -260,6 +253,7 @@ interface ClusteringState { const clusterBatchLinear = async ( batch: ClusterFace[], state: ClusteringState, + rejectedClusterIDsForFaceID: Map>, onProgress: (progress: ClusteringProgress) => void, ) => { const [clusteredFaces, unclusteredFaces] = batch.reduce< @@ -294,6 +288,8 @@ const clusterBatchLinear = async ( // If the face is already part of a cluster, then skip it. if (state.faceIDToClusterID.has(fi.faceID)) continue; + const rejectedClusters = rejectedClusterIDsForFaceID.get(fi.faceID); + // Find the nearest neighbour among the previous faces in this batch. let nnIndex: number | undefined; let nnCosineSimilarity = 0; @@ -306,11 +302,24 @@ const clusterBatchLinear = async ( // The vectors are already normalized, so we can directly use their // dot product as their cosine similarity. const csim = dotProduct(fi.embedding, fj.embedding); + if (csim <= nnCosineSimilarity) continue; + const threshold = fj.isBadFace ? 0.84 : 0.76; - if (csim > nnCosineSimilarity && csim >= threshold) { - nnIndex = j; - nnCosineSimilarity = csim; + if (csim < threshold) continue; + + // Don't add the face back to a cluster it has been rejected from. + if (rejectedClusters) { + const cjx = state.faceIDToClusterIndex.get(fj.faceID); + if (cjx) { + const cj = ensure(state.clusters[cjx]); + if (rejectedClusters.has(cj.id)) { + continue; + } + } } + + nnIndex = j; + nnCosineSimilarity = csim; } if (nnIndex !== undefined) { From 95905a4187e6706c65011164c2d0daddae34cea5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 16 Nov 2024 12:50:47 +0530 Subject: [PATCH 35/75] Fix --- web/packages/new/photos/services/ml/cluster.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 55f8ed9d5b..1d6fb78383 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -310,7 +310,7 @@ const clusterBatchLinear = async ( // Don't add the face back to a cluster it has been rejected from. if (rejectedClusters) { const cjx = state.faceIDToClusterIndex.get(fj.faceID); - if (cjx) { + if (cjx !== undefined) { const cj = ensure(state.clusters[cjx]); if (rejectedClusters.has(cj.id)) { continue; From 73d71834b93422229e9cf7f78c01e9650e011518 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 16 Nov 2024 13:34:54 +0530 Subject: [PATCH 36/75] Don't rely on count to track changes since we can now have rejns --- .../new/photos/services/ml/cluster.ts | 19 ++++++++++++------- web/packages/new/photos/services/ml/worker.ts | 4 ++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 1d6fb78383..9085d96707 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -142,10 +142,15 @@ export const _clusterFaces = async ( } } + // IDs of the clusters which were modified. We use this information to + // determine which cgroups need to be updated on remote. + const modifiedClusterIDs = new Set(); + const state = { faceIDToClusterID, faceIDToClusterIndex, clusters, + modifiedClusterIDs, }; // Process the faces in batches, but keep an overlap between batches to @@ -168,7 +173,7 @@ export const _clusterFaces = async ( const t = `(${Date.now() - startTime} ms)`; log.info(`Refreshed ${clusters.length} clusters from ${total} faces ${t}`); - return clusters; + return { clusters, modifiedClusterIDs }; }; /** @@ -248,6 +253,7 @@ interface ClusteringState { faceIDToClusterID: Map; faceIDToClusterIndex: Map; clusters: FaceCluster[]; + modifiedClusterIDs: Set; } const clusterBatchLinear = async ( @@ -333,6 +339,7 @@ const clusterBatchLinear = async ( state.faceIDToClusterID.set(fi.faceID, nnCluster.id); state.faceIDToClusterIndex.set(fi.faceID, nnClusterIndex); nnCluster.faces.push(fi.faceID); + state.modifiedClusterIDs.add(nnCluster.id); } else { // No neighbour within the threshold. Create a new cluster. const clusterID = newClusterID(); @@ -342,6 +349,7 @@ const clusterBatchLinear = async ( state.faceIDToClusterID.set(fi.faceID, cluster.id); state.faceIDToClusterIndex.set(fi.faceID, clusterIndex); state.clusters.push(cluster); + state.modifiedClusterIDs.add(cluster.id); } } }; @@ -355,6 +363,7 @@ const clusterBatchLinear = async ( */ export const reconcileClusters = async ( clusters: FaceCluster[], + modifiedClusterIDs: Set, masterKey: Uint8Array, ) => { // Index clusters by their ID for fast lookup. @@ -366,12 +375,8 @@ export const reconcileClusters = async ( // Find the cgroups that have changed since we started. const changedCGroups = cgroups .map((cgroup) => { - for (const oldCluster of cgroup.data.assigned) { - // The clustering algorithm does not remove any existing faces, it - // can only add new ones to the cluster. So we can use the count as - // an indication if something changed. - const newCluster = ensure(clusterByID.get(oldCluster.id)); - if (oldCluster.faces.length != newCluster.faces.length) { + for (const cluster of cgroup.data.assigned) { + if (modifiedClusterIDs.has(cluster.id)) { return { ...cgroup, data: { diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index d8ebea44c0..d9270ce911 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -326,12 +326,12 @@ export class MLWorker { * cgroups if needed. */ async clusterFaces(masterKey: Uint8Array) { - const clusters = await _clusterFaces( + const { clusters, modifiedClusterIDs } = await _clusterFaces( await savedFaceIndexes(), await getAllLocalFiles(), (progress) => this.updateClusteringProgress(progress), ); - await reconcileClusters(clusters, masterKey); + await reconcileClusters(clusters, modifiedClusterIDs, masterKey); this.updateClusteringProgress(undefined); } From b5843cdf6090dab6952d37963583433387ccd82b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 16 Nov 2024 14:49:47 +0530 Subject: [PATCH 37/75] Update people after file upload --- web/packages/new/photos/services/ml/cluster.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 9085d96707..cfd2e6dcd5 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -4,7 +4,11 @@ import log from "@/base/log"; import type { EnteFile } from "@/media/file"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; -import { savedCGroups, updateOrCreateUserEntities } from "../user-entity"; +import { + pullUserEntities, + savedCGroups, + updateOrCreateUserEntities, +} from "../user-entity"; import { savedFaceClusters, saveFaceClusters } from "./db"; import { faceDirection, @@ -409,4 +413,7 @@ export const reconcileClusters = async ( await saveFaceClusters( clusters.filter(({ id }) => !isRemoteClusterID.has(id)), ); + + // Refresh our local state if we'd updated remote. + if (changedCGroups.length) await pullUserEntities("cgroup", masterKey); }; From b69b6fc6a79a00f6df12e6925fb8bc4dcb7fa00c Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 16 Nov 2024 20:49:02 +0530 Subject: [PATCH 38/75] [auth] added edit icon to reorder codes --- auth/lib/ui/home_page.dart | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index 98ee15cfc1..5ba318e2f6 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -28,6 +28,7 @@ import 'package:ente_auth/ui/components/models/button_type.dart'; import 'package:ente_auth/ui/home/coach_mark_widget.dart'; import 'package:ente_auth/ui/home/home_empty_state.dart'; import 'package:ente_auth/ui/home/speed_dial_label_widget.dart'; +import 'package:ente_auth/ui/reorder_codes_page.dart'; import 'package:ente_auth/ui/scanner_page.dart'; import 'package:ente_auth/ui/settings_page.dart'; import 'package:ente_auth/ui/tools/app_lock.dart'; @@ -186,6 +187,10 @@ class _HomePageState extends State { .toList() ?? []; } + + _filteredCodes + .sort((a, b) => a.display.position.compareTo(b.display.position)); + if (mounted) { setState(() {}); } @@ -255,6 +260,18 @@ class _HomePageState extends State { } } + Future navigateToReorderPage(List allCodes) async { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return ReorderCodesPage(codes: _filteredCodes); + }, + ), + ).then((value) { + setState(() {}); + }); + } + @override Widget build(BuildContext context) { final l10n = context.l10n; @@ -310,6 +327,13 @@ class _HomePageState extends State { ), centerTitle: PlatformUtil.isDesktop() ? false : true, actions: [ + IconButton( + icon: const Icon(Icons.edit), + tooltip: l10n.edit, + onPressed: () { + navigateToReorderPage(_allCodes!); + }, + ), PlatformUtil.isDesktop() ? IconButton( icon: const Icon(Icons.lock), From 2bc1ce9f9249d58ebea1a7ddd1f263c893391108 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 16 Nov 2024 21:17:47 +0530 Subject: [PATCH 39/75] [auth] added reorder code screen --- auth/lib/ui/reorder_codes_page.dart | 171 ++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 auth/lib/ui/reorder_codes_page.dart diff --git a/auth/lib/ui/reorder_codes_page.dart b/auth/lib/ui/reorder_codes_page.dart new file mode 100644 index 0000000000..3ba6160a23 --- /dev/null +++ b/auth/lib/ui/reorder_codes_page.dart @@ -0,0 +1,171 @@ +import 'dart:ui'; +import 'package:ente_auth/models/code.dart'; +import 'package:ente_auth/services/preference_service.dart'; +import 'package:ente_auth/store/code_store.dart'; +import 'package:ente_auth/ui/code_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; + +class ReorderCodesPage extends StatefulWidget { + const ReorderCodesPage({super.key, required this.codes}); + final List codes; + + @override + State createState() => _ReorderCodesPageState(); +} + +class _ReorderCodesPageState extends State { + int selectedSortOption = 2; + final logger = Logger('ReorderCodesPage'); + + @override + Widget build(BuildContext context) { + final bool isCompactMode = PreferenceService.instance.isCompactMode(); + + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) async { + if (!didPop) { + final hasSaved = await saveUpadedIndexes(); + if (hasSaved) { + Navigator.of(context).pop(); + } + } + }, + child: Scaffold( + appBar: AppBar( + title: const Text("Edit Codes"), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () async { + final hasSaved = await saveUpadedIndexes(); + if (hasSaved) { + Navigator.of(context).pop(); + } + }, + ), + actions: [ + PopupMenuButton( + icon: const Icon(Icons.sort), + onSelected: (int value) { + selectedSortOption = value; + switch (value) { + case 0: + sortByIssuer(); + break; + case 1: + sortByAccount(); + break; + case 2: + setState(() {}); + break; + } + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: 0, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + selectedSortOption == 0 + ? const Icon(Icons.check) + : const SizedBox.square(dimension: 24), + const SizedBox(width: 10), + const Text("Issuer"), + ], + ), + ), + PopupMenuItem( + value: 1, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + selectedSortOption == 1 + ? const Icon(Icons.check) + : const SizedBox.square(dimension: 24), + const SizedBox(width: 10), + const Text("Account"), + ], + ), + ), + PopupMenuItem( + value: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + selectedSortOption == 2 + ? const Icon(Icons.check) + : const SizedBox.square(dimension: 24), + const SizedBox(width: 10), + const Text("Manual"), + ], + ), + ), + ], + ), + ], + ), + body: ReorderableListView( + buildDefaultDragHandles: false, + proxyDecorator: + (Widget child, int index, Animation animation) { + return AnimatedBuilder( + animation: animation, + builder: (BuildContext context, _) { + final animValue = Curves.easeInOut.transform(animation.value); + final scale = lerpDouble(1, 1.05, animValue)!; + return Transform.scale(scale: scale, child: child); + }, + ); + }, + children: [ + for (final code in widget.codes) + selectedSortOption == 2 + ? ReorderableDragStartListener( + key: ValueKey('${code.hashCode}_${code.generatedID}'), + index: widget.codes.indexOf(code), + child: CodeWidget( + key: ValueKey(code.generatedID), + code, + isCompactMode: isCompactMode, + ), + ) + : CodeWidget( + key: ValueKey('${code.hashCode}_${code.generatedID}'), + code, + isCompactMode: isCompactMode, + ), + ], + onReorder: (oldIndex, newIndex) { + if (selectedSortOption == 2) updateCodeIndex(oldIndex, newIndex); + }, + ), + ), + ); + } + + Future saveUpadedIndexes() async { + final result = await CodeStore.instance.saveUpadedIndexes(widget.codes); + return result; + } + + void updateCodeIndex(int oldIndex, int newIndex) { + setState(() { + // Adjust index when moving down the list + // oldIndex = 2, newIndex = 0 + if (oldIndex < newIndex) newIndex -= 1; + final Code code = widget.codes.removeAt(oldIndex); + widget.codes.insert(newIndex, code); + }); + } + + void sortByIssuer() { + widget.codes.sort((a, b) => a.issuer.compareTo(b.issuer)); + setState(() {}); + } + + void sortByAccount() { + widget.codes.sort((a, b) => a.account.compareTo(b.account)); + setState(() {}); + } +} From 20308e99e9ea0e16c625868eba6fde07e67b7575 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 16 Nov 2024 21:19:04 +0530 Subject: [PATCH 40/75] [auth] logic to cache codes and to save & update them --- auth/lib/store/code_store.dart | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/auth/lib/store/code_store.dart b/auth/lib/store/code_store.dart index 449bb93166..acbadacbd3 100644 --- a/auth/lib/store/code_store.dart +++ b/auth/lib/store/code_store.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:collection/collection.dart'; @@ -16,16 +17,54 @@ class CodeStore { CodeStore._privateConstructor(); late AuthenticatorService _authenticatorService; + final Map _cacheCodes = {}; final _logger = Logger("CodeStore"); Future init() async { _authenticatorService = AuthenticatorService.instance; } + Future saveUpadedIndexes(List codes) async { + for (final code in codes) { + if (code.hasError || code.isTrashed) { + continue; + } + Code? c = _cacheCodes[code.generatedID]; + if (c == null) { + continue; + } + int oldIndex = c.display.position; + int newIndex = codes.indexOf(code); + if (oldIndex != newIndex) { + Code updatedCode = + c.copyWith(display: c.display.copyWith(position: newIndex)); + await addCode(updatedCode); + } + } + return true; + } + + Future updateCodeIndex(Code code) async { + final key = code.generatedID!; + + _cacheCodes.remove(key); + int deletedIndex = code.display.position; + + _cacheCodes.forEach((key, c) async { + if (c.display.position > deletedIndex) { + Code updatedCode = c.copyWith( + display: c.display.copyWith(position: c.display.position - 1), + ); + await addCode(updatedCode); + } + }); + } + Future> getAllCodes({ AccountMode? accountMode, bool sortCodes = true, }) async { + _cacheCodes.clear(); final mode = accountMode ?? _authenticatorService.getAccountMode(); final List entities = await _authenticatorService.getEntities(mode); @@ -48,6 +87,7 @@ class CodeStore { code.generatedID = entity.generatedID; code.hasSynced = entity.hasSynced; codes.add(code); + _cacheCodes[code.generatedID!] = code; } if (sortCodes) { @@ -118,6 +158,7 @@ class CodeStore { Future removeCode(Code code, {AccountMode? accountMode}) async { final mode = accountMode ?? _authenticatorService.getAccountMode(); await _authenticatorService.deleteEntry(code.generatedID!, mode); + await updateCodeIndex(code); Bus.instance.fire(CodesUpdatedEvent()); } From 01d182a496f9f3036aa6764d3ac41b6dcd687a95 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 16 Nov 2024 21:20:46 +0530 Subject: [PATCH 41/75] [auth] added a new parameter to keep track of position of code --- auth/lib/models/code_display.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/auth/lib/models/code_display.dart b/auth/lib/models/code_display.dart index 50c4767eaf..71b74c68f5 100644 --- a/auth/lib/models/code_display.dart +++ b/auth/lib/models/code_display.dart @@ -11,6 +11,7 @@ class CodeDisplay { final int tapCount; String note; final List tags; + int position; CodeDisplay({ this.pinned = false, @@ -19,6 +20,7 @@ class CodeDisplay { this.tapCount = 0, this.tags = const [], this.note = '', + this.position = 0, }); // copyWith @@ -29,6 +31,7 @@ class CodeDisplay { int? tapCount, List? tags, String? note, + int? position, }) { final bool updatedPinned = pinned ?? this.pinned; final bool updatedTrashed = trashed ?? this.trashed; @@ -36,6 +39,7 @@ class CodeDisplay { final int updatedTapCount = tapCount ?? this.tapCount; final List updatedTags = tags ?? this.tags; final String updatedNote = note ?? this.note; + final int updatedPosition = position ?? this.position; return CodeDisplay( pinned: updatedPinned, @@ -44,6 +48,7 @@ class CodeDisplay { tapCount: updatedTapCount, tags: updatedTags, note: updatedNote, + position: updatedPosition, ); } @@ -58,6 +63,7 @@ class CodeDisplay { tapCount: json['tapCount'] ?? 0, tags: List.from(json['tags'] ?? []), note: json['note'] ?? '', + position: json['position'] ?? 0, ); } @@ -99,6 +105,7 @@ class CodeDisplay { 'tapCount': tapCount, 'tags': tags, 'note': note, + 'position': position, }; } From e719cde4e390164aa14befd82d98ff741d0b7318 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Sun, 17 Nov 2024 22:03:23 +0530 Subject: [PATCH 42/75] Update admin.md --- docs/docs/self-hosting/guides/admin.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/self-hosting/guides/admin.md b/docs/docs/self-hosting/guides/admin.md index 6377fe39c5..8337de7f78 100644 --- a/docs/docs/self-hosting/guides/admin.md +++ b/docs/docs/self-hosting/guides/admin.md @@ -40,8 +40,8 @@ explicit whitelist of admins. > [!NOTE] > -> The first user is only treated as the admin if there are the list of admins in -> the configuration is empty. +> The first user is only treated as the admin if the list of admins in the +> configuration is empty. > > Also, if at some point you delete the first user, then you will need to define > a whitelist to make some other user as the admin if you wish (since the first From 54d791e7239f9fa7d6b73cc4245467be157337f6 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 18 Nov 2024 00:36:55 +0000 Subject: [PATCH 43/75] New Crowdin translations by GitHub Action --- .../base/locales/fr-FR/translation.json | 66 +++++++++---------- .../base/locales/nl-NL/translation.json | 54 +++++++-------- .../base/locales/pt-BR/translation.json | 28 ++++---- .../base/locales/sv-SE/translation.json | 28 ++++---- 4 files changed, 88 insertions(+), 88 deletions(-) diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 8ab3fc8435..c795750814 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -45,9 +45,9 @@ "close_key": "Fermer (Échap)", "enter_file_name": "Nom du fichier", "close": "Fermer", - "yes": "", + "yes": "Oui", "no": "Non", - "nothing_here": "", + "nothing_here": "Aucun contenu disponible pour le moment", "upload": "Charger", "import": "Importer", "add_photos": "Ajouter des photos", @@ -91,8 +91,8 @@ "trash_file_title": "Supprimer le fichier ?", "delete_files_title": "Supprimer immédiatement?", "delete_files_message": "Les fichiers sélectionnés seront définitivement supprimés de votre compte Ente.", - "selected_count": "{{selected, number}} sélectionné", - "selected_and_yours_count": "{{selected, number}} sélectionné {{yours, number}} le vôtre", + "selected_count": "{{selected, number}} sélectionné(s)", + "selected_and_yours_count": "{{selected, number}} sélectionné(s) dont {{yours, number}} à vous", "delete": "Supprimer", "delete_key": "Supprimer (DEL)", "favorite": "Favori", @@ -176,7 +176,7 @@ "update_payment_method": "Mise à jour du moyen de paiement", "monthly": "Mensuel", "yearly": "Annuel", - "month_short": "", + "month_short": "mois", "year": "année", "update_subscription": "Changer de plan", "update_subscription_title": "Confirmer le changement d'abonnement", @@ -224,26 +224,26 @@ "indexing_fetching": "Récupération des index ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indexation des personnes dans {{nSyncedFiles, number}} photos...", "indexing_done": "Indexation des {{nSyncedFiles, number}} photos", - "syncing_wait": "", - "people_empty_too_few": "", - "unnamed_person": "", - "add_a_name": "", - "new_person": "", - "add_name": "", - "rename_person": "", - "reset_person_confirm": "", - "reset_person_confirm_message": "", - "ignore": "", - "ignore_person_confirm": "", - "ignore_person_confirm_message": "", - "ignored": "", - "show_person": "", - "review_suggestions": "", - "saved_choices": "", - "discard_changes": "", - "discard_changes_confirm_message": "", - "people_suggestions_finding": "", - "people_suggestions_empty": "", + "syncing_wait": "En cours de synchronisation...", + "people_empty_too_few": "Les personnes seront affichées ici lorsqu'il y aura suffisamment de photos d'elles", + "unnamed_person": "Personne sans nom", + "add_a_name": "Ajouter un nom", + "new_person": "Nouvelle personne", + "add_name": "Ajouter le nom", + "rename_person": "Renommer la personne", + "reset_person_confirm": "Réinitialiser la personne?", + "reset_person_confirm_message": "Le nom, les groupements de visage et les suggestions pour cette personne seront réinitialisés", + "ignore": "Ignorer", + "ignore_person_confirm": "Ignorer la personne?", + "ignore_person_confirm_message": "Ce groupement de visages ne sera pas affiché dans la liste des personnes", + "ignored": "Ignoré", + "show_person": "Montrer la personne", + "review_suggestions": "Consulter les suggestions", + "saved_choices": "Choix enregistrés", + "discard_changes": "Annuler les modifications", + "discard_changes_confirm_message": "Vous avez des modifications non enregistrées. Elles seront perdues si vous fermez sans enregistrer", + "people_suggestions_finding": "Recherche de visages similaires...", + "people_suggestions_empty": "Aucune suggestion pour le moment", "INFO": "Info ", "INFO_OPTION": "Info (I)", "file_name": "Nom de fichier", @@ -287,14 +287,14 @@ "select_zips": "Sélectionner les zips", "faq": "FAQ", "takeout_hint": "Décompresser tous les zips dans le même dossier et les charger. Ou bien télécharger les zips directement. Consulter la FAQ pour plus de détails.", - "destination": "", + "destination": "Destination", "start": "Démarrer", "last_export_time": "Horaire du dernier export", "export_again": "Resynchro", "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Votre navigateur ou un complément bloque Ente qui ne peut sauvegarder les données sur votre stockage local", "SEND_OTT": "Envoyer l'OTP", "email_already_taken": "Cet e-mail est déjà pris", - "ETAGS_BLOCKED": "", + "ETAGS_BLOCKED": "Votre navigateur ou un addon empêche Ente d'utiliser eTags pour charger des fichiers volumineux.", "LIVE_PHOTOS_DETECTED": "Les fichiers photos et vidéos depuis votre espace Live Photos ont été fusionnés en un seul fichier", "RETRY_FAILED": "Réessayer les chargements ayant échoués", "FAILED_UPLOADS": "Chargements échoués ", @@ -358,9 +358,9 @@ "fix_creation_time_completed": "Mise à jour effectuée pour tous les fichiers", "fix_creation_time_completed_with_errors": "L'heure du fichier n'a pas été mise à jour pour certains fichiers, veuillez réessayer", "fix_creation_time_options": "Sélectionnez l'option que vous souhaitez utiliser", - "exif_date_time_original": "", - "exif_date_time_digitized": "", - "exif_metadata_date": "", + "exif_date_time_original": "Exif:DateTimeOriginal", + "exif_date_time_digitized": "Exif:DateTimeDigitized", + "exif_metadata_date": "Exif:MetadataDate", "custom_time": "Heure personnalisée", "CAPTION_CHARACTER_LIMIT": "5000 caractères max", "sharing_details": "Détails du partage", @@ -388,14 +388,14 @@ "OWNER": "Propriétaire", "COLLABORATORS": "Collaborateurs", "ADD_MORE": "Ajouter plus", - "VIEWERS": "Visionneurs", + "VIEWERS": "Observateurs", "OR_ADD_EXISTING": "ou sélectionner un fichier existant", "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} sera supprimé de l'album

Toutes les photos ajoutées par cette personne seront également supprimées de l'album

", "NOT_FOUND": "404 - non trouvé", "link_expired": "Lien expiré", - "link_expired_message": "", + "link_expired_message": "Ce lien a soit expiré, soit été supprimé", "MANAGE_LINK": "Gérer le lien", - "LINK_TOO_MANY_REQUESTS": "", + "LINK_TOO_MANY_REQUESTS": "Cet album a été consulté sur trop d'appareils", "FILE_DOWNLOAD": "Autoriser les téléchargements", "PUBLIC_COLLECT": "Autoriser l'ajout de photos", "LINK_DEVICE_LIMIT": "Limite d'appareil", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index e6817a1702..13adbcc2a6 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -45,7 +45,7 @@ "close_key": "Sluiten (Esc)", "enter_file_name": "Bestandsnaam", "close": "Sluiten", - "yes": "", + "yes": "Ja", "no": "Nee", "nothing_here": "Hier is nog niets te zien", "upload": "Uploaden", @@ -176,7 +176,7 @@ "update_payment_method": "Betalingsmethode bijwerken", "monthly": "Maandelijks", "yearly": "Jaarlijks", - "month_short": "", + "month_short": "mo", "year": "jaar", "update_subscription": "Abonnement wijzigen", "update_subscription_title": "Bevestig verandering van abonnement", @@ -224,26 +224,26 @@ "indexing_fetching": "Indexen ophalen ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Mensen analyseren in {{nSyncedFiles, number}} photos...", "indexing_done": "{{nSyncedFiles, number}} foto's geanalyseerd", - "syncing_wait": "", - "people_empty_too_few": "", - "unnamed_person": "", - "add_a_name": "", - "new_person": "", - "add_name": "", - "rename_person": "", - "reset_person_confirm": "", - "reset_person_confirm_message": "", - "ignore": "", - "ignore_person_confirm": "", - "ignore_person_confirm_message": "", - "ignored": "", - "show_person": "", - "review_suggestions": "", - "saved_choices": "", - "discard_changes": "", - "discard_changes_confirm_message": "", - "people_suggestions_finding": "", - "people_suggestions_empty": "", + "syncing_wait": "Synchroniseren...", + "people_empty_too_few": "Mensen worden hier getoond wanneer er voldoende foto's van een persoon zijn", + "unnamed_person": "Naamloos persoon", + "add_a_name": "Naam toevoegen", + "new_person": "Nieuw persoon", + "add_name": "Naam toevoegen", + "rename_person": "Naam persoon wijzigen", + "reset_person_confirm": "Reset persoon?", + "reset_person_confirm_message": "De naam, gezichtsgroepen en suggesties voor deze persoon worden gereset", + "ignore": "Negeren", + "ignore_person_confirm": "Negeer persoon?", + "ignore_person_confirm_message": "Dit persoon wordt niet getoond in de lijst met personen", + "ignored": "Genegeerd", + "show_person": "Toon persoon", + "review_suggestions": "Suggesties beoordelen", + "saved_choices": "Opgeslagen keuzes", + "discard_changes": "Wijzigingen annuleren", + "discard_changes_confirm_message": "U hebt niet-opgeslagen wijzigingen. Deze zullen verloren gaan als u sluit zonder op te slaan", + "people_suggestions_finding": "Vinden van vergelijkbare gezichten...", + "people_suggestions_empty": "Geen suggesties meer voor nu", "INFO": "Info ", "INFO_OPTION": "Info (I)", "file_name": "Bestandsnaam", @@ -288,13 +288,13 @@ "faq": "Veelgestelde vragen", "takeout_hint": "Pak alle zips uit in dezelfde map en upload die. Of upload de zips direct als aparte mappen. Zie de FAQ voor meer informatie.", "destination": "Bestemming", - "start": "", + "start": "Start", "last_export_time": "Tijd laatste export", "export_again": "Opnieuw synchroniseren", "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Je browser of een extensie blokkeert Ente om gegevens op te slaan in de lokale opslag", "SEND_OTT": "Stuur OTP", "email_already_taken": "E-mail al in gebruik", - "ETAGS_BLOCKED": "", + "ETAGS_BLOCKED": "Uw browser of een addon verhindert Ente te gebruiken met eTags om grote bestanden te uploaden.", "LIVE_PHOTOS_DETECTED": "De foto en video bestanden van je Live Photos zijn samengevoegd tot één enkel bestand", "RETRY_FAILED": "Probeer mislukte uploads nogmaals", "FAILED_UPLOADS": "Mislukte uploads ", @@ -393,9 +393,9 @@ "REMOVE_PARTICIPANT_MESSAGE": "

{{selectedEmail}} zullen worden verwijderd uit het gedeelde album

Alle door hen toegevoegde foto's worden ook uit het album verwijderd

", "NOT_FOUND": "404 - niet gevonden", "link_expired": "Link verlopen", - "link_expired_message": "", + "link_expired_message": "Deze link is verlopen of gedeactiveerd", "MANAGE_LINK": "Link beheren", - "LINK_TOO_MANY_REQUESTS": "", + "LINK_TOO_MANY_REQUESTS": "Dit album is op te veel apparaten bekeken", "FILE_DOWNLOAD": "Downloads toestaan", "PUBLIC_COLLECT": "Foto's toevoegen toestaan", "LINK_DEVICE_LIMIT": "Apparaat limiet", @@ -442,7 +442,7 @@ "used": "gebruikt", "you": "Jij", "family": "Familie", - "free": "", + "free": "gratis", "of": "van", "WATCHED_FOLDERS": "Gemonitorde mappen", "NO_FOLDERS_ADDED": "Nog geen mappen toegevoegd!", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 0335a83018..76081de62f 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -30,15 +30,15 @@ "VERIFY_PASSPHRASE": "Entrar", "INCORRECT_PASSPHRASE": "Senha incorreta", "ENTER_ENC_PASSPHRASE": "Insira uma senha que podemos usar para criptografar seus dados", - "PASSPHRASE_DISCLAIMER": "Não armazenamos sua senha, portanto, se você esquecê-la, não poderemos ajudar na recuperação de seus dados sem uma chave de recuperação.", + "PASSPHRASE_DISCLAIMER": "Não armazenamos sua senha, portanto, caso se esqueça, não poderemos ajudar vocêa recuperar seus dados sem uma chave de recuperação.", "key_generation_in_progress": "Gerando chaves de criptografia...", "PASSPHRASE_HINT": "Senha", "CONFIRM_PASSPHRASE": "Confirmar senha", "REFERRAL_CODE_HINT": "Como você descobriu o Ente? (opcional)", "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", "PASSPHRASE_MATCH_ERROR": "As senhas não correspondem", - "welcome_to_ente_title": "Bem-vindo a ", - "welcome_to_ente_subtitle": "Armazenamento criptografado de ponta a ponta de fotos e compartilhamento", + "welcome_to_ente_title": "Bem-vindo à ", + "welcome_to_ente_subtitle": "Armazenamento de fotos e compartilhamento criptografado de ponta a ponta", "new_album": "Novo álbum", "create_albums": "Criar álbuns", "enter_album_name": "Nome do álbum", @@ -52,20 +52,20 @@ "import": "Importar", "add_photos": "Adicionar fotos", "add_more_photos": "Adicionar mais fotos", - "add_photos_count_one": "Adicionar item", + "add_photos_count_one": "Adicionar um item", "add_photos_count": "Adicionar {{count, number}} itens", "select_photos": "Selecionar fotos", - "FILE_UPLOAD": "Envio de Arquivo", + "FILE_UPLOAD": "Envio de arquivos", "UPLOAD_STAGE_MESSAGE": { "0": "Preparando para enviar", - "1": "Lendo arquivos de metadados do google", + "1": "Lendo arquivos de metadados da Google", "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} arquivos processados", "4": "Cancelando envios restantes", - "5": "Backup concluído" + "5": "Cópia de segurança concluído" }, "FILE_NOT_UPLOADED_LIST": "Os seguintes arquivos não foram enviados", - "INITIAL_LOAD_DELAY_WARNING": "Primeiro carregamento pode levar algum tempo", - "USER_DOES_NOT_EXIST": "Desculpe, não foi possível encontrar um usuário com este e-mail", + "INITIAL_LOAD_DELAY_WARNING": "O primeiro carregamento pode levar algum tempo", + "USER_DOES_NOT_EXIST": "Não foi possível encontrar usuários com este e-mail", "NO_ACCOUNT": "Não possui uma conta", "ACCOUNT_EXISTS": "Já possui uma conta", "CREATE": "Criar", @@ -76,11 +76,11 @@ "download_hidden_items": "Baixar itens ocultos", "download_key": "Baixar (D)", "copy_key": "Copiar como PNG (Ctrl/Cmd - C)", - "toggle_fullscreen_key": "Mudar para tela cheia (F)", - "zoom_in_out_key": "Ampliar/Reduzir", + "toggle_fullscreen_key": "Alternar para tela cheia (F)", + "zoom_in_out_key": "Ampliar/reduzir", "previous_key": "Anterior (←)", "next_key": "Próximo (→)", - "title_photos": "Ente Fotos", + "title_photos": "Ente Photos", "title_auth": "Ente Auth", "title_accounts": "Contas Ente", "UPLOAD_FIRST_PHOTO": "Envie sua primeira foto", @@ -176,8 +176,8 @@ "update_payment_method": "Atualizar método de pagamento", "monthly": "Mensal", "yearly": "Anual", - "month_short": "mês(es)", - "year": "ano(s)", + "month_short": "mês", + "year": "ano", "update_subscription": "Alterar plano", "update_subscription_title": "Confirmar mudança de plano", "update_subscription_message": "Deseja alterar seu plano?", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index b04f1c0459..914885cabe 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -17,7 +17,7 @@ "ENTER_OTT": "Verifieringskod", "RESEND_MAIL": "Skicka kod igen", "VERIFY": "Bekräfta", - "generic_error": "", + "generic_error": "Något gick fel", "generic_error_retry": "Något gick fel, försök igen", "INVALID_CODE": "Ogiltig verifieringskod", "EXPIRED_CODE": "Din verifieringskod har upphört", @@ -47,7 +47,7 @@ "close": "Stäng", "yes": "Ja", "no": "Nej", - "nothing_here": "", + "nothing_here": "Ingenting här ännu", "upload": "Ladda upp", "import": "Importera", "add_photos": "Lägg till foton", @@ -65,7 +65,7 @@ }, "FILE_NOT_UPLOADED_LIST": "Följande filer laddades ej upp", "INITIAL_LOAD_DELAY_WARNING": "", - "USER_DOES_NOT_EXIST": "", + "USER_DOES_NOT_EXIST": "Tyvärr, kunde inte hitta en användare med den e-postadressen", "NO_ACCOUNT": "", "ACCOUNT_EXISTS": "", "CREATE": "Skapa", @@ -74,9 +74,9 @@ "download_favorites": "Ladda ner favoriter", "download_uncategorized": "", "download_hidden_items": "Ladda ner dolda objekt", - "download_key": "", - "copy_key": "", - "toggle_fullscreen_key": "", + "download_key": "Ladda ner (D)", + "copy_key": "Kopiera som PNG (Ctrl/Cmd - C)", + "toggle_fullscreen_key": "Växla fullskärm (F)", "zoom_in_out_key": "Zooma in/ut", "previous_key": "Föregående (←)", "next_key": "Nästa (→)", @@ -85,24 +85,24 @@ "title_accounts": "", "UPLOAD_FIRST_PHOTO": "Ladda upp ditt första foto", "IMPORT_YOUR_FOLDERS": "Importera dina mappar", - "UPLOAD_DROPZONE_MESSAGE": "", + "UPLOAD_DROPZONE_MESSAGE": "Släpp för att säkerhetskopiera dina filer", "WATCH_FOLDER_DROPZONE_MESSAGE": "", "trash_files_title": "Radera filer?", "trash_file_title": "Radera fil?", - "delete_files_title": "", + "delete_files_title": "Radera omedelbart?", "delete_files_message": "", "selected_count": "", "selected_and_yours_count": "", "delete": "Radera", - "delete_key": "", - "favorite": "", + "delete_key": "Radera (DEL)", + "favorite": "Favorit", "favorite_key": "", "unfavorite_key": "", "multi_folder_upload": "", "upload_to_choice": "", "upload_to_single_album": "", "upload_to_album_per_folder": "Separata album", - "session_expired": "", + "session_expired": "Sessionen har gått ut", "session_expired_message": "Din session har upphört, logga in igen för att fortsätta", "PASSWORD_GENERATION_FAILED": "", "CHANGE_PASSWORD": "Ändra lösenord", @@ -110,7 +110,7 @@ "password_changed_elsewhere_message": "", "GO_BACK": "Gå tillbaka", "recovery_key": "Återställningsnyckel", - "do_this_later": "", + "do_this_later": "Gör detta senare", "save_key": "Spara nyckel", "recovery_key_description": "", "key_not_stored_note": "", @@ -134,7 +134,7 @@ "delete_account_manually_message": "", "CHANGE_EMAIL": "Ändra e-postadress", "ok": "OK", - "success": "", + "success": "Lyckades", "error": "Fel", "OFFLINE_MSG": "", "install": "Installera", @@ -153,7 +153,7 @@ "manage_plan": "Hantera din prenumeration", "current_usage": "", "two_months_free": "", - "POPULAR": "", + "POPULAR": "Populär", "free_plan_option": "", "free_plan_description": "", "active": "Aktiv", From 60f5d91f45d3d445008ddb15402e54725b20cae9 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 18 Nov 2024 01:05:19 +0000 Subject: [PATCH 44/75] New Crowdin translations by GitHub Action --- .../metadata/android/ca/short_description.txt | 1 + mobile/fastlane/metadata/android/ca/title.txt | 1 + mobile/fastlane/metadata/ios/ca/keywords.txt | 1 + mobile/fastlane/metadata/ios/ca/name.txt | 1 + mobile/fastlane/metadata/ios/ca/subtitle.txt | 1 + .../playstore/ca/short_description.txt | 1 + .../fastlane/metadata/playstore/ca/title.txt | 1 + .../playstore/fr/full_description.txt | 2 +- mobile/lib/l10n/intl_ar.arb | 7 +--- mobile/lib/l10n/intl_be.arb | 7 +--- mobile/lib/l10n/intl_bg.arb | 7 +--- mobile/lib/l10n/intl_ca.arb | 7 +--- mobile/lib/l10n/intl_cs.arb | 7 +--- mobile/lib/l10n/intl_da.arb | 7 +--- mobile/lib/l10n/intl_de.arb | 8 ++--- mobile/lib/l10n/intl_el.arb | 7 +--- mobile/lib/l10n/intl_es.arb | 6 +--- mobile/lib/l10n/intl_et.arb | 7 +--- mobile/lib/l10n/intl_fa.arb | 7 +--- mobile/lib/l10n/intl_fr.arb | 32 +++++++++++++------ mobile/lib/l10n/intl_gu.arb | 7 +--- mobile/lib/l10n/intl_he.arb | 7 +--- mobile/lib/l10n/intl_hi.arb | 7 +--- mobile/lib/l10n/intl_id.arb | 7 +--- mobile/lib/l10n/intl_it.arb | 7 ++-- mobile/lib/l10n/intl_ja.arb | 6 +--- mobile/lib/l10n/intl_km.arb | 7 +--- mobile/lib/l10n/intl_ko.arb | 7 +--- mobile/lib/l10n/intl_lt.arb | 7 ++-- mobile/lib/l10n/intl_nl.arb | 21 +++++++++--- mobile/lib/l10n/intl_no.arb | 7 +--- mobile/lib/l10n/intl_pl.arb | 5 +-- mobile/lib/l10n/intl_pt.arb | 8 ++--- mobile/lib/l10n/intl_ro.arb | 6 +--- mobile/lib/l10n/intl_ru.arb | 6 +--- mobile/lib/l10n/intl_sl.arb | 7 +--- mobile/lib/l10n/intl_sv.arb | 7 +--- mobile/lib/l10n/intl_ta.arb | 7 +--- mobile/lib/l10n/intl_te.arb | 7 +--- mobile/lib/l10n/intl_th.arb | 7 +--- mobile/lib/l10n/intl_ti.arb | 7 +--- mobile/lib/l10n/intl_tr.arb | 6 +--- mobile/lib/l10n/intl_uk.arb | 9 +++--- mobile/lib/l10n/intl_zh.arb | 6 +--- 44 files changed, 93 insertions(+), 203 deletions(-) create mode 100644 mobile/fastlane/metadata/android/ca/short_description.txt create mode 100644 mobile/fastlane/metadata/android/ca/title.txt create mode 100644 mobile/fastlane/metadata/ios/ca/keywords.txt create mode 100644 mobile/fastlane/metadata/ios/ca/name.txt create mode 100644 mobile/fastlane/metadata/ios/ca/subtitle.txt create mode 100644 mobile/fastlane/metadata/playstore/ca/short_description.txt create mode 100644 mobile/fastlane/metadata/playstore/ca/title.txt diff --git a/mobile/fastlane/metadata/android/ca/short_description.txt b/mobile/fastlane/metadata/android/ca/short_description.txt new file mode 100644 index 0000000000..a176c53a28 --- /dev/null +++ b/mobile/fastlane/metadata/android/ca/short_description.txt @@ -0,0 +1 @@ +ente és una aplicació d'emmagatzematge de fotos xifrada d'extrem a extrem \ No newline at end of file diff --git a/mobile/fastlane/metadata/android/ca/title.txt b/mobile/fastlane/metadata/android/ca/title.txt new file mode 100644 index 0000000000..0c4db489fc --- /dev/null +++ b/mobile/fastlane/metadata/android/ca/title.txt @@ -0,0 +1 @@ +ente - emmagatzematge de fotos xifrat \ No newline at end of file diff --git a/mobile/fastlane/metadata/ios/ca/keywords.txt b/mobile/fastlane/metadata/ios/ca/keywords.txt new file mode 100644 index 0000000000..9876c9aae7 --- /dev/null +++ b/mobile/fastlane/metadata/ios/ca/keywords.txt @@ -0,0 +1 @@ +fotos,fotografia,família,privadesa,núvol,backup,vídeos,foto,xifratge,emmagatzematge,àlbum,alternativa diff --git a/mobile/fastlane/metadata/ios/ca/name.txt b/mobile/fastlane/metadata/ios/ca/name.txt new file mode 100644 index 0000000000..40a1cc3114 --- /dev/null +++ b/mobile/fastlane/metadata/ios/ca/name.txt @@ -0,0 +1 @@ +Ente Fotos diff --git a/mobile/fastlane/metadata/ios/ca/subtitle.txt b/mobile/fastlane/metadata/ios/ca/subtitle.txt new file mode 100644 index 0000000000..06bc9f9493 --- /dev/null +++ b/mobile/fastlane/metadata/ios/ca/subtitle.txt @@ -0,0 +1 @@ +Emmagatzematge de fotos xifrat diff --git a/mobile/fastlane/metadata/playstore/ca/short_description.txt b/mobile/fastlane/metadata/playstore/ca/short_description.txt new file mode 100644 index 0000000000..7ce2b336d2 --- /dev/null +++ b/mobile/fastlane/metadata/playstore/ca/short_description.txt @@ -0,0 +1 @@ +Emmagatzematge de fotos encriptat: fes una còpia de seguretat, organitza i comparteix les teves fotos i vídeos \ No newline at end of file diff --git a/mobile/fastlane/metadata/playstore/ca/title.txt b/mobile/fastlane/metadata/playstore/ca/title.txt new file mode 100644 index 0000000000..536837e6bb --- /dev/null +++ b/mobile/fastlane/metadata/playstore/ca/title.txt @@ -0,0 +1 @@ +Ente Fotos \ No newline at end of file diff --git a/mobile/fastlane/metadata/playstore/fr/full_description.txt b/mobile/fastlane/metadata/playstore/fr/full_description.txt index 07ff21f85f..a9348fd9c1 100644 --- a/mobile/fastlane/metadata/playstore/fr/full_description.txt +++ b/mobile/fastlane/metadata/playstore/fr/full_description.txt @@ -1,4 +1,4 @@ -Entre est une application simple qui sauvegarde et organise vos photos et vidéos. +Ente est une application simple qui sauvegarde et organise vos photos et vidéos. Si vous recherchez une alternative respectueuse de votre vie privée pour préserver vos souvenirs, vous êtes au bon endroit. Avec Ente, ils sont stockés chiffrés de bout-en-bout (e2ee). Cela signifie que vous-seul pouvez les voir. diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index 66351279a9..86273581a6 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -23,10 +23,5 @@ "noRecoveryKeyNoDecryption": "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية", "verifyEmail": "التحقق من البريد الإلكتروني", "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", - "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية.", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_be.arb b/mobile/lib/l10n/intl_be.arb index 5f02ccbf30..d6b7f03339 100644 --- a/mobile/lib/l10n/intl_be.arb +++ b/mobile/lib/l10n/intl_be.arb @@ -199,10 +199,5 @@ "darkTheme": "Цёмная", "systemTheme": "Сістэма", "freeTrial": "Бясплатная пробная версія", - "faqs": "Частыя пытанні", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "faqs": "Частыя пытанні" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 2ec71b9385..2bd9d2da70 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -2,10 +2,5 @@ "@@locale ": "en", "askDeleteReason": "Jaký je váš hlavní důvod, proč mažete svůj účet?", "incorrectRecoveryKeyBody": "", - "checkInboxAndSpamFolder": "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "checkInboxAndSpamFolder": "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index 44ea6e4f79..e4b2cc656b 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -84,10 +84,5 @@ "longPressAnEmailToVerifyEndToEndEncryption": "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen.", "developerSettingsWarning": "Er du sikker på, at du vil ændre udviklerindstillingerne?", "next": "Næste", - "enterPin": "Indtast PIN", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "enterPin": "Indtast PIN" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 2fbb19fb3c..6be803fe06 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1360,8 +1360,8 @@ "allPersonGroupingWillReset": "Alle Gruppierungen für diese Person werden zurückgesetzt und du wirst alle Vorschläge für diese Person verlieren", "yesResetPerson": "Ja, Person zurücksetzen", "onlyThem": "Nur diese", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "checkingModels": "Prüfe Modelle...", + "enableMachineLearningBanner": "Aktiviere maschinelles Lernen für die magische Suche und Gesichtserkennung", + "searchDiscoverEmptySection": "Bilder werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist", + "searchPersonsEmptySection": "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index 9529a9c126..ce8b1a1a54 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -1,9 +1,4 @@ { "@@locale ": "en", - "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 0201a97f91..482714f70c 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1343,9 +1343,5 @@ "mostRecent": "Más reciente", "mostRelevant": "Más relevante", "loadingYourPhotos": "Cargando tus fotos...", - "processingImport": "Procesando {folderName}...", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "processingImport": "Procesando {folderName}..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index 1b373f56c1..dfe1fba1a4 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -218,10 +218,5 @@ "storageBreakupYou": "Sina", "@storageBreakupYou": { "description": "Label to indicate how much storage you are using when you are part of a family plan" - }, - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + } } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index e930a3fea9..8d957cf574 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -307,10 +307,5 @@ "developerSettings": "تنظیمات توسعه‌دهنده", "search": "جستجو", "whatsNew": "تغییرات جدید", - "reviewSuggestions": "مرور پیشنهادها", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "reviewSuggestions": "مرور پیشنهادها" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index c51e658e2b..c5e521c516 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -155,7 +155,7 @@ "addViewer": "Ajouter un observateur", "addCollaborator": "Ajouter un collaborateur", "addANewEmail": "Ajouter un nouvel email", - "orPickAnExistingOne": "Sélectionner un fichier existant", + "orPickAnExistingOne": "Ou sélectionner un email existant", "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Les collaborateurs peuvent ajouter des photos et des vidéos à l'album partagé.", "enterEmail": "Entrer e-mail", "albumOwner": "Propriétaire", @@ -226,7 +226,7 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Créez un lien pour permettre aux gens d'ajouter et de voir des photos dans votre album partagé sans avoir besoin d'une application ente ou d'un compte. Idéal pour récupérer des photos d'événement.", + "collabLinkSectionDescription": "Créez un lien pour permettre aux personnes d'ajouter et de voir des photos dans votre album partagé sans avoir besoin d'une application Ente ou d'un compte. Idéal pour récupérer des photos d'événement.", "collectPhotos": "Récupérer les photos", "collaborativeLink": "Lien collaboratif", "shareWithNonenteUsers": "Partager avec des utilisateurs non-Ente", @@ -237,7 +237,7 @@ "publicLinkEnabled": "Lien public activé", "shareALink": "Partager le lien", "sharedAlbumSectionDescription": "Créez des albums partagés et collaboratifs avec d'autres utilisateurs de Ente, y compris des utilisateurs ayant des plans gratuits.", - "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Partagez avec des personnes spécifiques} =1 {Partagé avec 1 personne} other {Partagé avec {numberOfPeople} des gens}}", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Partagez avec des personnes spécifiques} =1 {Partagé avec 1 personne} other {Partagé avec {numberOfPeople} personnes}}", "@shareWithPeopleSectionTitle": { "placeholders": { "numberOfPeople": { @@ -1028,7 +1028,7 @@ "searchFaceEmptySection": "Les personnes seront affichées ici une fois l'indexation terminée", "searchDatesEmptySection": "Recherche par date, mois ou année", "searchLocationEmptySection": "Grouper les photos qui sont prises dans un certain angle d'une photo", - "searchPeopleEmptySection": "Invitez des gens, et vous verrez ici toutes les photos qu'ils partagent", + "searchPeopleEmptySection": "Invitez des personnes, et vous verrez ici toutes les photos qu'elles partagent", "searchAlbumsEmptySection": "Albums", "searchFileTypesAndNamesEmptySection": "Types et noms de fichiers", "searchCaptionEmptySection": "Ajoutez des descriptions comme \"#trip\" dans les infos photo pour les retrouver ici plus rapidement", @@ -1247,8 +1247,8 @@ "descriptions": "Descriptions", "addAName": "Ajouter un nom", "findPeopleByName": "Trouver des personnes rapidement par leur nom", - "addViewers": "{count, plural, zero {Ajouter un lecteur} one {Ajouter un lecteur} other {Ajouter des lecteurs}}", - "addCollaborators": "{count, plural, zero {Ajouter un coauteur} one {Ajouter un coauteur} other {Ajouter des coauteurs}}", + "addViewers": "{count, plural, zero {Ajouter un observateur} one {Ajouter un observateur} other {Ajouter des observateurs}}", + "addCollaborators": "{count, plural, zero {Ajouter un collaborateur} one {Ajouter un collaborateur} other {Ajouter des collaborateurs}}", "longPressAnEmailToVerifyEndToEndEncryption": "Appuyez longuement sur un e-mail pour vérifier le chiffrement de bout en bout.", "developerSettingsWarning": "Êtes-vous sûr de vouloir modifier les paramètres du développeur ?", "developerSettings": "Paramètres du développeur", @@ -1344,12 +1344,24 @@ "mostRelevant": "Les plus pertinents", "loadingYourPhotos": "Chargement de vos photos...", "processingImport": "Traitement de {folderName}...", + "personName": "Nom de la personne", + "addNewPerson": "Ajouter une nouvelle personne", + "addNameOrMerge": "Ajouter un nom ou fusionner", + "mergeWithExisting": "Fusionner avec existant", + "newPerson": "Nouvelle personne", + "addName": "Ajouter un nom", + "add": "Ajouter", + "extraPhotosFoundFor": "Photos supplémentaires trouvées pour $text", + "extraPhotosFound": "Photos supplémentaires trouvées", + "configuration": "Paramètres", + "localIndexing": "Indexation locale", "resetPerson": "Réinitialiser la personne", "areYouSureYouWantToResetThisPerson": "Êtes-vous certain de vouloir réinitialiser cette personne ?", "allPersonGroupingWillReset": "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne", "yesResetPerson": "Oui, réinitialiser la personne", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "onlyThem": "Seulement eux", + "checkingModels": "Vérification des modèles...", + "enableMachineLearningBanner": "Activer l'apprentissage automatique pour la recherche magique et la reconnaissance faciale", + "searchDiscoverEmptySection": "Les images seront affichées ici une fois le traitement terminé", + "searchPersonsEmptySection": "Les personnes seront affichées ici une fois le traitement terminé" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index d7a8caa57a..961b9f38d6 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -816,10 +816,5 @@ "addPhotos": "הוסף תמונות", "create": "צור", "viewAll": "הצג הכל", - "hiding": "מחביא...", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "hiding": "מחביא..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 0442f70ccf..b79d9682f2 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -48,10 +48,5 @@ "sorry": "क्षमा करें!", "noRecoveryKeyNoDecryption": "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है", "verifyEmail": "ईमेल सत्यापित करें", - "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index e69ab4d375..8a72ca4da5 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1143,10 +1143,5 @@ "rotate": "Putar", "left": "Kiri", "right": "Kanan", - "whatsNew": "Hal yang baru", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "whatsNew": "Hal yang baru" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index e93524afa8..04cf09c0ec 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1187,7 +1187,7 @@ "addOns": "Componenti aggiuntivi", "addOnPageSubtitle": "Dettagli dei componenti aggiuntivi", "yourMap": "La tua mappa", - "modifyYourQueryOrTrySearchingFor": "Modifica la tua interrogazione o prova a cercare", + "modifyYourQueryOrTrySearchingFor": "Modifica la tua ricerca o prova con", "blackFridaySale": "Offerta del Black Friday", "upto50OffUntil4thDec": "Sconto del 50%, fino al 4 dicembre.", "photos": "Foto", @@ -1360,8 +1360,5 @@ "allPersonGroupingWillReset": "Tutti i raggruppamenti per questa persona saranno resettati e perderai tutti i suggerimenti fatti per questa persona", "yesResetPerson": "Sì, resetta persona", "onlyThem": "Solo loro", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "checkingModels": "Verifica dei modelli..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index f888cb4bec..97a7e21359 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1343,9 +1343,5 @@ "mostRecent": "新しい順", "mostRelevant": "関連度順", "loadingYourPhotos": "写真を読み込んでいます...", - "processingImport": "{folderName} を処理中...", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "processingImport": "{folderName} を処理中..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 5233d7e229..06c81195f7 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -12,10 +12,5 @@ "feedback": "피드백", "confirmAccountDeletion": "계정 삭제 확인", "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", - "yourAccountHasBeenDeleted": "계정이 삭제되었습니다.", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "yourAccountHasBeenDeleted": "계정이 삭제되었습니다." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index 509760dd15..1e08a97e7f 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -336,6 +336,7 @@ "discover_sunset": "Saulėlydis", "discover_hills": "Kalvos", "discover_greenery": "Žaluma", + "loadingModel": "Atsisiunčiami modeliai...", "status": "Būsena", "indexedItems": "Indeksuoti elementai", "pendingItems": "Laukiami elementai", @@ -801,9 +802,5 @@ "allPersonGroupingWillReset": "Visi šio asmens grupavimai bus iš naujo nustatyti, o jūs neteksite visų šiam asmeniui pateiktų pasiūlymų", "yesResetPerson": "Taip, nustatyti asmenį iš naujo", "onlyThem": "Tik jiems", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "checkingModels": "Tikrinami modeliai..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index ec4edad3da..53e38db5c2 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1344,8 +1344,21 @@ "mostRelevant": "Meest relevant", "loadingYourPhotos": "Je foto's worden geladen...", "processingImport": "Verwerken van {folderName}...", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "personName": "Naam van persoon", + "addNewPerson": "Nieuw persoon toevoegen", + "addNameOrMerge": "Naam toevoegen of samenvoegen", + "mergeWithExisting": "Samenvoegen met bestaand", + "newPerson": "Nieuw persoon", + "addName": "Naam toevoegen", + "add": "Toevoegen", + "extraPhotosFoundFor": "Extra foto's gevonden voor $text", + "extraPhotosFound": "Extra foto's gevonden", + "configuration": "Configuratie", + "localIndexing": "Lokaal indexeren", + "resetPerson": "Reset persoon", + "areYouSureYouWantToResetThisPerson": "Weet u zeker dat u deze persoon wilt resetten?", + "allPersonGroupingWillReset": "Alle groepen voor deze persoon worden gereset, en je verliest alle suggesties die voor deze persoon zijn gedaan", + "yesResetPerson": "Ja, reset persoon", + "onlyThem": "Alleen hen", + "checkingModels": "Modellen controleren..." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 6867ae4f9d..a42eec2d70 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -371,10 +371,5 @@ "advanced": "Avansert", "general": "Generelt", "security": "Sikkerhet", - "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index cbdd2d0dc5..ab62d77bda 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1359,8 +1359,5 @@ "areYouSureYouWantToResetThisPerson": "Czy na pewno chcesz zresetować tę osobę?", "allPersonGroupingWillReset": "Wszystkie grupy dla tej osoby zostaną zresetowane i stracisz wszystkie sugestie dla tej osoby", "yesResetPerson": "Tak, zresetuj osobę", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "onlyThem": "Tylko te" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index fde2f7dd88..63c07b2ea7 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1360,8 +1360,8 @@ "allPersonGroupingWillReset": "Todos os agrupamentos dessa pessoa serão redefinidos, e você perderá todas as sugestões feitas por essa pessoa.", "yesResetPerson": "Sim, redefinir pessoa", "onlyThem": "Apenas eles", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "checkingModels": "Verificando modelos...", + "enableMachineLearningBanner": "Ativar aprendizagem de máquina para busca mágica e reconhecimento facial", + "searchDiscoverEmptySection": "As imagens serão exibidas aqui quando o processamento for concluído", + "searchPersonsEmptySection": "As pessoas serão exibidas aqui quando o processamento for concluído" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ro.arb b/mobile/lib/l10n/intl_ro.arb index cce7c58181..0cb2aa87b4 100644 --- a/mobile/lib/l10n/intl_ro.arb +++ b/mobile/lib/l10n/intl_ro.arb @@ -1092,9 +1092,5 @@ }, "enable": "Activare", "enabled": "Activat", - "moreDetails": "Mai multe detalii", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "moreDetails": "Mai multe detalii" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index d6cd0c285d..28fb8ea904 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1300,9 +1300,5 @@ "removePublicLinks": "Удалить публичные ссылки", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Это удалит публичные ссылки на все выбранные быстрые ссылки.", "guestView": "Гостевой вид", - "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sl.arb b/mobile/lib/l10n/intl_sl.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_sl.arb +++ b/mobile/lib/l10n/intl_sl.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index df8c5f9a85..b5f9c92e65 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -455,10 +455,5 @@ "sort": "Sortera", "newPerson": "Ny person", "addName": "Lägg till namn", - "add": "Lägg till", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "add": "Lägg till" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb index 801f744453..d3d26e203c 100644 --- a/mobile/lib/l10n/intl_ta.arb +++ b/mobile/lib/l10n/intl_ta.arb @@ -15,10 +15,5 @@ "confirmDeletePrompt": "ஆம், எல்லா செயலிகளிலும் இந்தக் கணக்கையும் அதன் தரவையும் நிரந்தரமாக நீக்க விரும்புகிறேன்.", "confirmAccountDeletion": "கணக்கு நீக்குதலை உறுதிப்படுத்தவும்", "deleteAccountPermanentlyButton": "கணக்கை நிரந்தரமாக நீக்கவும்", - "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index ee8d6bc635..375d1cc22d 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -295,10 +295,5 @@ "description": "Label for the map view" }, "maps": "แผนที่", - "enableMaps": "เปิดใช้งานแผนที่", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "enableMaps": "เปิดใช้งานแผนที่" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index d97e7c81c2..c8494661c6 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -1,8 +1,3 @@ { - "@@locale ": "en", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchPeopleEmptySection": "People will be shown here once processing is complete", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 67e586bea6..dbf015f443 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1169,9 +1169,5 @@ "invalidEndpoint": "Geçersiz uç nokta", "invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.", "endpointUpdatedMessage": "Fatura başarıyla güncellendi", - "customEndpoint": "{endpoint}'e bağlanıldı", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "customEndpoint": "{endpoint}'e bağlanıldı" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index 55e7bb0b23..93c99975b0 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -1359,8 +1359,9 @@ "areYouSureYouWantToResetThisPerson": "Ви впевнені, що хочете скинути цю особу?", "allPersonGroupingWillReset": "Усі групи для цієї особи будуть скинуті, і ви втратите всі пропозиції, зроблені для неї", "yesResetPerson": "Так, скинути особу", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "onlyThem": "Тільки вони", + "checkingModels": "Перевірка моделей...", + "enableMachineLearningBanner": "Увімкніть машинне навчання для магічного пошуку та розпізнавання облич", + "searchDiscoverEmptySection": "Зображення будуть показані тут після завершення обробки", + "searchPersonsEmptySection": "Люди будуть показані тут після завершення обробки" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 9d8adfff12..a445996f40 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1343,9 +1343,5 @@ "mostRecent": "最近", "mostRelevant": "最相关", "loadingYourPhotos": "正在加载您的照片...", - "processingImport": "正在处理 {folderName}...", - "checkingModels": "Checking models...", - "enableMachineLearningBanner": "Enable machine learning for magic search and face recognition", - "searchDiscoverEmptySection": "Images will be shown here once processing is complete", - "searchPersonsEmptySection": "People will be shown here once processing is complete" + "processingImport": "正在处理 {folderName}..." } \ No newline at end of file From 665609d2b3daeb5078aab1e714e5f76135a25e88 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 18 Nov 2024 01:17:41 +0000 Subject: [PATCH 45/75] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_be.arb | 34 ++++++++++++++++++++ auth/lib/l10n/arb/app_id.arb | 61 ++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/auth/lib/l10n/arb/app_be.arb b/auth/lib/l10n/arb/app_be.arb index 8c41363377..a91f5bbce8 100644 --- a/auth/lib/l10n/arb/app_be.arb +++ b/auth/lib/l10n/arb/app_be.arb @@ -6,11 +6,34 @@ "@counterAppBarTitle": { "description": "Text shown in the AppBar of the Counter Page" }, + "onBoardingBody": "Бяспечна зрабіць рэзервовую копію кодаў 2ФА", "onBoardingGetStarted": "Пачаць", + "setupFirstAccount": "Наладзіць ваш першы ўліковы запіс", + "importScanQrCode": "Сканіраваць код QR-код", + "qrCode": "QR-код", + "importEnterSetupKey": "Увесці ключ наладжвання", + "importAccountPageTitle": "Увесці падрабязнасці ўліковага запісу", + "secretCanNotBeEmpty": "Сакрэт не можа быць пустым", + "bothIssuerAndAccountCanNotBeEmpty": "І выдавец, і ўліковы запіс не могуць быць пустымі", + "incorrectDetails": "Няправільныя падрабязнасці", + "pleaseVerifyDetails": "Праверце падрабязнасці і паспрабуйце яшчэ раз", "codeIssuerHint": "Выдавец", "codeSecretKeyHint": "Сакрэтны ключ", "secret": "Сакрэт", + "all": "Усе", "notes": "Нататкі", + "notesLengthLimit": "Максімальная колькасць сімвалаў у нататках не больш за {count}", + "@notesLengthLimit": { + "description": "Text to indicate the maximum number of characters allowed for notes", + "placeholders": { + "count": { + "description": "The maximum number of characters allowed for notes", + "type": "int", + "example": "100" + } + } + }, + "codeAccountHint": "Уліковы запіс (vy@damen.com)", "codeTagHint": "Тэг", "accountKeyType": "Тып ключа", "sessionExpired": "Сеанс завяршыўся", @@ -18,8 +41,19 @@ "description": "Title of the dialog when the users current session is invalid/expired" }, "pleaseLoginAgain": "Аўтарызуйцеся яшчэ раз", + "loggingOut": "Выхад...", + "timeBasedKeyType": "Заснаваныя на часе (TOTP)", + "counterBasedKeyType": "Заснаваныя на лічыльніку (HOTP)", "saveAction": "Захаваць", + "nextTotpTitle": "наступны", + "deleteCodeTitle": "Выдаліць код?", + "deleteCodeMessage": "Вы сапраўды хочаце выдаліць гэты код? Гэта дзеянне з'яўляецца незваротным.", + "trashCode": "Выдаліць код?", + "trashCodeMessage": "Вы сапраўды хочаце выдаліць код для {account}?", "trash": "Сметніца", + "viewLogsAction": "Паглядзець журнал", + "preparingLogsTitle": "Падрыхтоўка журнала...", + "emailLogsTitle": "Адправіць журнал па электроннай пошце", "blog": "Блог", "changePassword": "Змяніць пароль", "data": "Даныя", diff --git a/auth/lib/l10n/arb/app_id.arb b/auth/lib/l10n/arb/app_id.arb index bac8750715..602dd019da 100644 --- a/auth/lib/l10n/arb/app_id.arb +++ b/auth/lib/l10n/arb/app_id.arb @@ -99,32 +99,84 @@ "passwordForDecryptingExport": "Kata sandi untuk mendekripsi ekspor", "passwordEmptyError": "Kata sandi tidak boleh kosong", "importFromApp": "Impor kode dari {appName}", + "importGoogleAuthGuide": "Ekspor semua akunmu dari Google Authenticator ke kode QR menggunakan pilihan \"Transfer Akun\". Lalu, pindai kode QR tersebut menggunakan perangkat lain.\n\nKiat: Kamu juga dapat menggunakan webcam laptop untuk memindai kode QR.", "importSelectJsonFile": "Pilih File JSON", "importSelectAppExport": "Pilih file ekspor dari {appName}", "importEnteEncGuide": "Pilih file enkripsi JSON yang telah diekspor dari Ente", "importRaivoGuide": "Gunakan opsi \"Export OTPs to Zip archive\" pada pengaturan Raivo.\n\nEkstrak file zip dan impor file JSON tersebut.", "importBitwardenGuide": "Gunakan opsi \"Export vault\" didalam fitur Bitwarden Tools dan impor file JSON yang tidak terenkripsi.", "importAegisGuide": "Gunakan opsi \"Export vault\" didalam fitur Bitwarden Tools dan impor file JSON yang tidak terenkripsi.", + "exportCodes": "Ekspor kode", + "importLabel": "Impor", "selectFile": "Pilih file", "emailVerificationToggle": "Verifikasi email", "emailVerificationEnableWarning": "Untuk menghindari akun kamu terkunci, pastikan untuk menyimpan salinan 2FA email kamu di luar Ente Auth sebelum mengaktifkan verifikasi email.", + "authToChangeEmailVerificationSetting": "Harap autentikasikan untuk mengubah verifikasi email", + "authenticateGeneric": "Harap autentikasikan", + "authToViewYourRecoveryKey": "Harap autentikasikan untuk melihat kunci pemulihan", + "authToChangeYourEmail": "Harap autentikasikan untuk mengubah surel", + "authToChangeYourPassword": "Harap autentikasikan untuk mengubah kata sandi", + "authToViewSecrets": "Harap autentikasikan untuk melihat rahasia", + "authToInitiateSignIn": "Harap autentikasikan untuk memulai proses pencadangan.", "ok": "Oke", "cancel": "Batal", + "yes": "Ya", + "no": "Tidak", "email": "Email", "support": "Dukungan", "general": "Umum", "settings": "Pengaturan", + "copied": "Disalin", + "pleaseTryAgain": "Harap coba lagi", + "existingUser": "Pengguna yang Sudah Ada", "newUser": "Baru di Ente", "delete": "Hapus", "enterYourPasswordHint": "Masukkan sandi kamu", + "forgotPassword": "Lupa kata sandi", + "oops": "Aduh", "suggestFeatures": "Sarankan fitur", "faq": "Tanya Jawab Umum", + "somethingWentWrongMessage": "Terjadi kesalahan, silakan coba lagi", + "leaveFamily": "Tinggalkan keluarga", + "leaveFamilyMessage": "Apakah kamu yakin ingin meninggalkan paket keluarga ini?", + "inFamilyPlanMessage": "Kamu menggunakan paket keluarga!", + "hintForMobile": "Tekan lama kode untuk menyunting atau menghapus.", + "hintForDesktop": "Klik kanan kode untuk menyunting atau menghapus.", "scan": "Pindai", "scanACode": "Pindai kode", "verify": "Verifikasi", "verifyEmail": "Verifikasi email", "enterCodeHint": "Masukkan kode 6 angka dari\napp autentikator kamu", + "lostDeviceTitle": "Perangkat hilang?", + "twoFactorAuthTitle": "Autentikasi dua langkah", + "passkeyAuthTitle": "Verifikasi passkey", + "verifyPasskey": "Verifikasi passkey", + "recoverAccount": "Pulihkan akun", + "enterRecoveryKeyHint": "Masukkan kunci pemulihanmu", + "recover": "Pulihkan", + "contactSupportViaEmailMessage": "Silakan kirimkan surel ke {email} dari alamat surelmu yang terdaftar", + "@contactSupportViaEmailMessage": { + "placeholders": { + "email": { + "type": "String" + } + } + }, + "invalidQRCode": "Kode QR tidak sah", + "noRecoveryKeyTitle": "Tidak punya kunci pemulihan?", + "enterEmailHint": "Masukkan alamat surelmu", + "invalidEmailTitle": "Alamat surel tidak sah", + "invalidEmailMessage": "Harap masukkan alamat surel yang sah.", + "deleteAccount": "Hapus akun", + "deleteAccountQuery": "Maaf kamu harus pergi. Apakah kamu mengalami masalah?", + "yesSendFeedbackAction": "Ya, kirim umpan balik", + "noDeleteAccountAction": "Tidak, hapus akun", + "initiateAccountDeleteTitle": "Harap autentikasi untuk memulai penghapusan akun", + "sendEmail": "Kirim surel", "createNewAccount": "Buat akun baru", + "weakStrength": "Lemah", + "strongStrength": "Kuat", + "moderateStrength": "Sedang", "confirmPassword": "Konfirmasi sandi", "selectLanguage": "Pilih bahasa", "language": "Bahasa", @@ -135,8 +187,17 @@ "createAccount": "Buat akun", "password": "Sandi", "signUpTerms": "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Maaf, kami tidak dapat menghasilkan kunci yang aman di perangkat ini.\n\nHarap mendaftar dengan perangkat lain.", + "howItWorks": "Cara kerjanya", "ackPasswordLostWarning": "Saya mengerti bahwa jika saya lupa sandi saya, data saya bisa hilang karena dienkripsi secara end-to-end.", "loginTerms": "Dengan mengklik masuk akun, saya menyetujui ketentuan layanan dan kebijakan privasi Ente", + "logInLabel": "Masuk akun", + "logout": "Keluar akun", + "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar akun?", + "yesLogout": "Ya, keluar", + "exit": "Keluar", + "verifyingRecoveryKey": "Memverifikasi kunci pemulihan...", + "recoveryKeyVerified": "Kunci pemulihan terverifikasi", "warning": "Peringatan", "androidCancelButton": "Batal", "@androidCancelButton": { From 8ba65c599a9f626cdd0a9f17d03fbd60005eef2e Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 10:00:01 +0530 Subject: [PATCH 46/75] [mob][photos] Fix SafeArea widget breaking the item size logic on 'all' screen of people section --- .../result/people_section_all_page.dart | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 6a5528fea3..95603dda06 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -57,48 +57,49 @@ class _PeopleSectionAllPageState extends State { appBar: AppBar( title: Text(S.of(context).people), ), - body: SafeArea( - child: FutureBuilder>( - future: sectionData, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); - } else if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Center(child: Text('No results found.')); - } else { - final results = snapshot.data!; - final screenWidth = MediaQuery.of(context).size.width; - final crossAxisCount = (screenWidth / 100).floor(); + body: FutureBuilder>( + future: sectionData, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Center(child: Text('No results found.')); + } else { + final results = snapshot.data!; + final screenWidth = MediaQuery.of(context).size.width; + final crossAxisCount = (screenWidth / 100).floor(); - final itemSize = (screenWidth - - ((horizontalEdgePadding * 2) + - ((crossAxisCount - 1) * gridPadding))) / - crossAxisCount; + final itemSize = (screenWidth - + ((horizontalEdgePadding * 2) + + ((crossAxisCount - 1) * gridPadding))) / + crossAxisCount; - return GridView.builder( - padding: const EdgeInsets.symmetric( - horizontal: horizontalEdgePadding, - ), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - mainAxisSpacing: gridPadding, - crossAxisSpacing: gridPadding, - crossAxisCount: crossAxisCount, - childAspectRatio: - itemSize / (itemSize + (24 * textScaleFactor)), - ), - itemCount: results.length, - itemBuilder: (context, index) { - return PersonSearchExample( - searchResult: results[index], - size: itemSize, - ); - }, - ); - } - }, - ), + return GridView.builder( + padding: const EdgeInsets.fromLTRB( + horizontalEdgePadding, + 0, + horizontalEdgePadding, + 96, + ), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + mainAxisSpacing: gridPadding, + crossAxisSpacing: gridPadding, + crossAxisCount: crossAxisCount, + childAspectRatio: + itemSize / (itemSize + (24 * textScaleFactor)), + ), + itemCount: results.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: results[index], + size: itemSize, + ); + }, + ); + } + }, ), ); } From ad4b5832cadd8187b4568add64b68f6226206c38 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 10:23:18 +0530 Subject: [PATCH 47/75] [mob][photos] Fix appBar color change on scroll --- mobile/lib/ente_theme_data.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/ente_theme_data.dart b/mobile/lib/ente_theme_data.dart index 8e8ed61523..6ee3384ac4 100644 --- a/mobile/lib/ente_theme_data.dart +++ b/mobile/lib/ente_theme_data.dart @@ -16,6 +16,7 @@ final lightThemeData = ThemeData( primary: Colors.black, secondary: Color.fromARGB(255, 163, 163, 163), background: Colors.white, + surfaceTint: Colors.transparent, ), outlinedButtonTheme: buildOutlinedButtonThemeData( bgDisabled: const Color.fromRGBO(158, 158, 158, 1), @@ -94,6 +95,7 @@ final darkThemeData = ThemeData( primary: Colors.white, background: Color.fromRGBO(0, 0, 0, 1), secondary: Color.fromARGB(255, 163, 163, 163), + surfaceTint: Colors.transparent, ), buttonTheme: const ButtonThemeData().copyWith( buttonColor: const Color.fromRGBO(45, 194, 98, 1.0), From 58887ce0449c79b1bbd8aa247403f5e794c93dce Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 10:25:07 +0530 Subject: [PATCH 48/75] [mob][photos] Make 'all' screen of people section more similar to 'all' screen of other sections --- .../result/people_section_all_page.dart | 144 +++++++++++++----- 1 file changed, 102 insertions(+), 42 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 95603dda06..26af6d0382 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -1,11 +1,12 @@ import "dart:async"; import 'package:flutter/material.dart'; +import "package:flutter_animate/flutter_animate.dart"; import "package:photos/events/event.dart"; -import "package:photos/generated/l10n.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/search/search_types.dart"; import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/viewer/search_tab/people_section.dart"; class PeopleSectionAllPage extends StatefulWidget { @@ -54,52 +55,111 @@ class _PeopleSectionAllPageState extends State { const horizontalEdgePadding = 20.0; const gridPadding = 16.0; return Scaffold( + // appBar: AppBar( + // title: Text(S.of(context).people), + // centerTitle: false, + // ), appBar: AppBar( - title: Text(S.of(context).people), + toolbarHeight: 48, + leadingWidth: 48, + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: const Icon( + Icons.arrow_back_outlined, + ), + ), ), - body: FutureBuilder>( - future: sectionData, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); - } else if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Center(child: Text('No results found.')); - } else { - final results = snapshot.data!; - final screenWidth = MediaQuery.of(context).size.width; - final crossAxisCount = (screenWidth / 100).floor(); + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TitleBarTitleWidget( + title: SectionType.face.sectionTitle(context), + ), + FutureBuilder( + future: sectionData, + builder: (context, snapshot) { + if (snapshot.hasData) { + final sectionResults = snapshot.data!; + return Text(sectionResults.length.toString()) + .animate() + .fadeIn( + duration: const Duration(milliseconds: 150), + curve: Curves.easeIn, + ); + } else { + return const SizedBox.shrink(); + } + }, + ), + ], + ), + ), + Expanded( + child: FutureBuilder>( + future: sectionData, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Center(child: Text('No results found.')); + } else { + final results = snapshot.data!; + final screenWidth = MediaQuery.of(context).size.width; + final crossAxisCount = (screenWidth / 100).floor(); - final itemSize = (screenWidth - - ((horizontalEdgePadding * 2) + - ((crossAxisCount - 1) * gridPadding))) / - crossAxisCount; + final itemSize = (screenWidth - + ((horizontalEdgePadding * 2) + + ((crossAxisCount - 1) * gridPadding))) / + crossAxisCount; - return GridView.builder( - padding: const EdgeInsets.fromLTRB( - horizontalEdgePadding, - 0, - horizontalEdgePadding, - 96, - ), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - mainAxisSpacing: gridPadding, - crossAxisSpacing: gridPadding, - crossAxisCount: crossAxisCount, - childAspectRatio: - itemSize / (itemSize + (24 * textScaleFactor)), - ), - itemCount: results.length, - itemBuilder: (context, index) { - return PersonSearchExample( - searchResult: results[index], - size: itemSize, - ); + return GridView.builder( + padding: const EdgeInsets.fromLTRB( + horizontalEdgePadding, + 16, + horizontalEdgePadding, + 96, + ), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + mainAxisSpacing: gridPadding, + crossAxisSpacing: gridPadding, + crossAxisCount: crossAxisCount, + childAspectRatio: + itemSize / (itemSize + (24 * textScaleFactor)), + ), + itemCount: results.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: results[index], + size: itemSize, + ) + .animate(delay: Duration(milliseconds: index * 12)) + .fadeIn( + duration: const Duration(milliseconds: 225), + curve: Curves.easeIn, + ) + .slide( + begin: const Offset(0, -0.05), + curve: Curves.easeInOut, + duration: const Duration( + milliseconds: 225, + ), + ); + }, + ); + } }, - ); - } - }, + ), + ), + ], ), ); } From 9de634ab8b8b49af8fa1cf336b855b3d0c16846e Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 10:31:05 +0530 Subject: [PATCH 49/75] [mob][photos] Use an app bar that occupies less space on UI in 'all' section of people section compared to the app bar used in 'all' screen of other sections --- .../result/people_section_all_page.dart | 155 ++++++------------ 1 file changed, 54 insertions(+), 101 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 26af6d0382..5c0d677989 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -6,7 +6,6 @@ import "package:photos/events/event.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/search/search_types.dart"; import "package:photos/theme/ente_theme.dart"; -import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/viewer/search_tab/people_section.dart"; class PeopleSectionAllPage extends StatefulWidget { @@ -55,111 +54,65 @@ class _PeopleSectionAllPageState extends State { const horizontalEdgePadding = 20.0; const gridPadding = 16.0; return Scaffold( - // appBar: AppBar( - // title: Text(S.of(context).people), - // centerTitle: false, - // ), appBar: AppBar( - toolbarHeight: 48, - leadingWidth: 48, - leading: GestureDetector( - onTap: () { - Navigator.pop(context); - }, - child: const Icon( - Icons.arrow_back_outlined, - ), - ), + title: Text(SectionType.face.sectionTitle(context)), + centerTitle: false, ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TitleBarTitleWidget( - title: SectionType.face.sectionTitle(context), - ), - FutureBuilder( - future: sectionData, - builder: (context, snapshot) { - if (snapshot.hasData) { - final sectionResults = snapshot.data!; - return Text(sectionResults.length.toString()) - .animate() - .fadeIn( - duration: const Duration(milliseconds: 150), - curve: Curves.easeIn, - ); - } else { - return const SizedBox.shrink(); - } - }, - ), - ], - ), - ), - Expanded( - child: FutureBuilder>( - future: sectionData, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); - } else if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Center(child: Text('No results found.')); - } else { - final results = snapshot.data!; - final screenWidth = MediaQuery.of(context).size.width; - final crossAxisCount = (screenWidth / 100).floor(); + body: FutureBuilder>( + future: sectionData, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Center(child: Text('No results found.')); + } else { + final results = snapshot.data!; + final screenWidth = MediaQuery.of(context).size.width; + final crossAxisCount = (screenWidth / 100).floor(); - final itemSize = (screenWidth - - ((horizontalEdgePadding * 2) + - ((crossAxisCount - 1) * gridPadding))) / - crossAxisCount; + final itemSize = (screenWidth - + ((horizontalEdgePadding * 2) + + ((crossAxisCount - 1) * gridPadding))) / + crossAxisCount; - return GridView.builder( - padding: const EdgeInsets.fromLTRB( - horizontalEdgePadding, - 16, - horizontalEdgePadding, - 96, - ), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - mainAxisSpacing: gridPadding, - crossAxisSpacing: gridPadding, - crossAxisCount: crossAxisCount, - childAspectRatio: - itemSize / (itemSize + (24 * textScaleFactor)), - ), - itemCount: results.length, - itemBuilder: (context, index) { - return PersonSearchExample( - searchResult: results[index], - size: itemSize, - ) - .animate(delay: Duration(milliseconds: index * 12)) - .fadeIn( - duration: const Duration(milliseconds: 225), - curve: Curves.easeIn, - ) - .slide( - begin: const Offset(0, -0.05), - curve: Curves.easeInOut, - duration: const Duration( - milliseconds: 225, - ), - ); - }, - ); - } + return GridView.builder( + padding: const EdgeInsets.fromLTRB( + horizontalEdgePadding, + 16, + horizontalEdgePadding, + 96, + ), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + mainAxisSpacing: gridPadding, + crossAxisSpacing: gridPadding, + crossAxisCount: crossAxisCount, + childAspectRatio: + itemSize / (itemSize + (24 * textScaleFactor)), + ), + itemCount: results.length, + itemBuilder: (context, index) { + return PersonSearchExample( + searchResult: results[index], + size: itemSize, + ) + .animate(delay: Duration(milliseconds: index * 12)) + .fadeIn( + duration: const Duration(milliseconds: 225), + curve: Curves.easeIn, + ) + .slide( + begin: const Offset(0, -0.05), + curve: Curves.easeInOut, + duration: const Duration( + milliseconds: 225, + ), + ); }, - ), - ), - ], + ); + } + }, ), ); } From 47b668a82ae96cc06768233f0fdbd39ebc2d1fbf Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 10:48:46 +0530 Subject: [PATCH 50/75] [mob][photos] Minor animation tweaks: --- .../lib/ui/viewer/search/result/people_section_all_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 5c0d677989..414600a63b 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -97,13 +97,13 @@ class _PeopleSectionAllPageState extends State { searchResult: results[index], size: itemSize, ) - .animate(delay: Duration(milliseconds: index * 12)) + .animate(delay: Duration(milliseconds: index * 13)) .fadeIn( duration: const Duration(milliseconds: 225), curve: Curves.easeIn, ) .slide( - begin: const Offset(0, -0.05), + begin: const Offset(0, -0.06), curve: Curves.easeInOut, duration: const Duration( milliseconds: 225, From f42ae367dcf5bccd604dc9846d85fea7c03727a4 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 18 Nov 2024 11:01:11 +0530 Subject: [PATCH 51/75] [mob][photos] Fix loading and error state of 'all' screen of people section --- .../lib/ui/viewer/search/result/people_section_all_page.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart index 414600a63b..4f8d3b3eb0 100644 --- a/mobile/lib/ui/viewer/search/result/people_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/people_section_all_page.dart @@ -6,6 +6,7 @@ import "package:photos/events/event.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/search/search_types.dart"; import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/viewer/search_tab/people_section.dart"; class PeopleSectionAllPage extends StatefulWidget { @@ -62,9 +63,9 @@ class _PeopleSectionAllPageState extends State { future: sectionData, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); + return const Center(child: EnteLoadingWidget()); } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); + return const Center(child: Icon(Icons.error_outline_rounded)); } else if (!snapshot.hasData || snapshot.data!.isEmpty) { return const Center(child: Text('No results found.')); } else { From c37f6d2904e1525f1ad219b9aaa31f7f31f0da01 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 13:47:51 +0530 Subject: [PATCH 52/75] [desktop] Dependency updates --- desktop/package.json | 26 +-- desktop/src/main/log.ts | 1 + desktop/yarn.lock | 399 ++++++++++++++++++++-------------------- 3 files changed, 212 insertions(+), 214 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 675262d52c..933879d4f3 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -28,35 +28,35 @@ "auto-launch": "^5.0.6", "chokidar": "^3.6.0", "clip-bpe-js": "^0.0.6", - "comlink": "^4.4.1", + "comlink": "^4.4.2", "compare-versions": "^6.1.1", - "electron-log": "^5.1.7", + "electron-log": "^5.2.2", "electron-store": "^8.2.0", - "electron-updater": "^6.3.4", + "electron-updater": "^6.3.9", "ffmpeg-static": "^5.2.0", - "lru-cache": "^11.0.0", + "lru-cache": "^11.0.2", "next-electron-server": "^1.0.0", "node-stream-zip": "^1.15.0", - "onnxruntime-node": "^1.19.2" + "onnxruntime-node": "^1.20.0" }, "devDependencies": { - "@eslint/js": "^9.9.1", + "@eslint/js": "^9.15.0", "@tsconfig/node20": "^20.1.4", "@types/auto-launch": "^5.0.5", "@types/eslint__js": "^8.42.3", "@types/ffmpeg-static": "^3.0.3", "ajv": "^8.17.1", - "concurrently": "^8.2.2", + "concurrently": "^9.1.0", "cross-env": "^7.0.3", - "electron": "^33.0.2", - "electron-builder": "^25.0.5", + "electron": "^33.2.0", + "electron-builder": "^25.1.8", "eslint": "^9", "prettier": "^3.3.3", - "prettier-plugin-organize-imports": "^4.0.0", - "prettier-plugin-packagejson": "^2.5.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-packagejson": "^2.5.3", "shx": "^0.3.4", - "typescript": "^5.5.4", - "typescript-eslint": "^8.4.0" + "typescript": "^5.6.3", + "typescript-eslint": "^8.14.0" }, "packageManager": "yarn@1.22.22", "productName": "ente" diff --git a/desktop/src/main/log.ts b/desktop/src/main/log.ts index 9718dfea56..479b3c1666 100644 --- a/desktop/src/main/log.ts +++ b/desktop/src/main/log.ts @@ -48,6 +48,7 @@ const messageWithError = (message: string, e?: unknown) => { es = [`${e.name}: ${e.message}`, e.stack].filter((x) => x).join("\n"); } else { // For the rest rare cases, use the default string serialization of e. + // eslint-disable-next-line @typescript-eslint/no-base-to-string es = String(e); } diff --git a/desktop/yarn.lock b/desktop/yarn.lock index ec40989c38..b684f1cb82 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -7,13 +7,6 @@ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== -"@babel/runtime@^7.21.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" - integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== - dependencies: - regenerator-runtime "^0.14.0" - "@derhuerst/http-basic@^8.2.0": version "8.2.4" resolved "https://registry.yarnpkg.com/@derhuerst/http-basic/-/http-basic-8.2.4.tgz#d021ebb8f65d54bea681ae6f4a8733ce89e7f59b" @@ -56,10 +49,10 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.3.2.tgz#20a52a961747be8542a35003380988a0d3fe15e6" - integrity sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg== +"@electron/notarize@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.5.0.tgz#d4d25356adfa29df4a76bd64a8bd347237cd251e" + integrity sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A== dependencies: debug "^4.1.1" fs-extra "^9.0.1" @@ -77,10 +70,10 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/rebuild@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.0.tgz#60211375a5f8541a71eb07dd2f97354ad0b2b96f" - integrity sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw== +"@electron/rebuild@3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.1.tgz#59e8e36c3f6e6b94a699425dfb61f0394c3dd4df" + integrity sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w== dependencies: "@malept/cross-spawn-promise" "^2.0.0" chalk "^4.0.0" @@ -146,11 +139,16 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.9.1", "@eslint/js@^9.9.1": +"@eslint/js@9.9.1": version "9.9.1" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06" integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ== +"@eslint/js@^9.15.0": + version "9.15.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.15.0.tgz#df0e24fe869143b59731942128c19938fdbadfb5" + integrity sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg== + "@eslint/object-schema@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" @@ -386,62 +384,62 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz#188c65610ef875a086404b5bfe105df936b035da" - integrity sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw== +"@typescript-eslint/eslint-plugin@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz#7dc0e419c87beadc8f554bf5a42e5009ed3748dc" + integrity sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.4.0" - "@typescript-eslint/type-utils" "8.4.0" - "@typescript-eslint/utils" "8.4.0" - "@typescript-eslint/visitor-keys" "8.4.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/type-utils" "8.14.0" + "@typescript-eslint/utils" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.4.0.tgz#36b7cd7643a1c190d49dc0278192b2450f615a6f" - integrity sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA== +"@typescript-eslint/parser@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.14.0.tgz#0a7e9dbc11bc07716ab2d7b1226217e9f6b51fc8" + integrity sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA== dependencies: - "@typescript-eslint/scope-manager" "8.4.0" - "@typescript-eslint/types" "8.4.0" - "@typescript-eslint/typescript-estree" "8.4.0" - "@typescript-eslint/visitor-keys" "8.4.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz#8a13d3c0044513d7960348db6f4789d2a06fa4b4" - integrity sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A== +"@typescript-eslint/scope-manager@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz#01f37c147a735cd78f0ff355e033b9457da1f373" + integrity sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw== dependencies: - "@typescript-eslint/types" "8.4.0" - "@typescript-eslint/visitor-keys" "8.4.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" -"@typescript-eslint/type-utils@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz#4a91b5789f41946adb56d73e2fb4639fdcf37af7" - integrity sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A== +"@typescript-eslint/type-utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz#455c6af30c336b24a1af28bc4f81b8dd5d74d94d" + integrity sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ== dependencies: - "@typescript-eslint/typescript-estree" "8.4.0" - "@typescript-eslint/utils" "8.4.0" + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/utils" "8.14.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.4.0.tgz#b44d6a90a317a6d97a3e5fabda5196089eec6171" - integrity sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw== +"@typescript-eslint/types@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.14.0.tgz#0d33d8d0b08479c424e7d654855fddf2c71e4021" + integrity sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g== -"@typescript-eslint/typescript-estree@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz#00ed79ae049e124db37315cde1531a900a048482" - integrity sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A== +"@typescript-eslint/typescript-estree@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz#a7a3a5a53a6c09313e12fb4531d4ff582ee3c312" + integrity sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ== dependencies: - "@typescript-eslint/types" "8.4.0" - "@typescript-eslint/visitor-keys" "8.4.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -449,22 +447,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.4.0.tgz#35c552a404858c853a1f62ba6df2214f1988afc3" - integrity sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ== +"@typescript-eslint/utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.14.0.tgz#ac2506875e03aba24e602364e43b2dfa45529dbd" + integrity sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.4.0" - "@typescript-eslint/types" "8.4.0" - "@typescript-eslint/typescript-estree" "8.4.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" -"@typescript-eslint/visitor-keys@8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz#1e8a8b8fd3647db1e42361fdd8de3e1679dec9d2" - integrity sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A== +"@typescript-eslint/visitor-keys@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz#2418d5a54669af9658986ade4e6cfb7767d815ad" + integrity sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ== dependencies: - "@typescript-eslint/types" "8.4.0" + "@typescript-eslint/types" "8.14.0" eslint-visitor-keys "^3.4.3" "@xmldom/xmldom@^0.8.8": @@ -494,6 +492,13 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -566,40 +571,43 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@5.0.0-alpha.7: - version "5.0.0-alpha.7" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.7.tgz#8c835ad083b18fb5d434bc4e4d99cca1fb46c19f" - integrity sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g== +app-builder-bin@5.0.0-alpha.10: + version "5.0.0-alpha.10" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz#cf12e593b6b847fb9d04027fa755c6c6610d778b" + integrity sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw== -app-builder-lib@25.0.5: - version "25.0.5" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.0.5.tgz#4886ee77030576cbd36fab92633347d3cc554f87" - integrity sha512-rxgxMx1f7I4ZAP0jA5+5iB7X6x6MJvGF7GauRzQBnIVihwXX2HOiAE7yenyY9Ry5YAiH47MnCxdq413Wq6XOcQ== +app-builder-lib@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.8.tgz#ae376039c5f269c7d562af494a087e5bc6310f1b" + integrity sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg== dependencies: "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.3.2" + "@electron/notarize" "2.5.0" "@electron/osx-sign" "1.3.1" - "@electron/rebuild" "3.6.0" + "@electron/rebuild" "3.6.1" "@electron/universal" "2.0.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "25.0.3" - builder-util-runtime "9.2.5" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chromium-pickle-js "^0.2.0" + config-file-ts "0.2.8-rc1" debug "^4.3.4" + dotenv "^16.4.5" + dotenv-expand "^11.0.6" ejs "^3.1.8" - electron-publish "25.0.3" + electron-publish "25.1.7" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" is-ci "^3.0.0" isbinaryfile "^5.0.0" js-yaml "^4.1.0" + json5 "^2.2.3" lazy-val "^1.0.5" minimatch "^10.0.0" - read-config-file "6.4.0" resedit "^1.7.0" sanitize-filename "^1.6.3" semver "^7.3.8" @@ -756,30 +764,30 @@ buffer@^5.1.0, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.2.5: - version "9.2.5" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz#0afdffa0adb5c84c14926c7dd2cf3c6e96e9be83" - integrity sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg== +builder-util-runtime@9.2.10: + version "9.2.10" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz#a0f7d9e214158402e78b74a745c8d9f870c604bc" + integrity sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@25.0.3: - version "25.0.3" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.0.3.tgz#bd00d8e8abbe6ea56974a2adbbc39578eab0134b" - integrity sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw== +builder-util@25.1.7: + version "25.1.7" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.1.7.tgz#a07b404f0cb1a635aa165902be65297d58932ff8" + integrity sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" - app-builder-bin "5.0.0-alpha.7" + app-builder-bin "5.0.0-alpha.10" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.5" + builder-util-runtime "9.2.10" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" fs-extra "^10.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" is-ci "^3.0.0" js-yaml "^4.1.0" source-map-support "^0.5.19" @@ -956,10 +964,10 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -comlink@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.1.tgz#e568b8e86410b809e8600eb2cf40c189371ef981" - integrity sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q== +comlink@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.2.tgz#cbbcd82742fbebc06489c28a183eedc5c60a2bca" + integrity sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g== commander@^5.0.0: version "5.1.0" @@ -991,17 +999,15 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concurrently@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== +concurrently@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.0.tgz#8da6d609f4321752912dab9be8710232ac496aa0" + integrity sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg== dependencies: chalk "^4.1.2" - date-fns "^2.30.0" lodash "^4.17.21" rxjs "^7.8.1" shell-quote "^1.8.1" - spawn-command "0.0.2" supports-color "^8.1.1" tree-kill "^1.2.2" yargs "^17.7.2" @@ -1063,13 +1069,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - debounce-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" @@ -1171,14 +1170,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@25.0.5: - version "25.0.5" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.0.5.tgz#e7e2731b65cf1ed43c14f2ca672e7d9a2e0234f0" - integrity sha512-ocnZV44ZqInoSFaY54fF7BlCtw+WtbrjyPrkBhaB+Ztn7GPKjmFgRbIKytifJ8h9Cib8jdFRMgjCUtkU45Y6DA== +dmg-builder@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.8.tgz#41f3b725edd896156e891016a44129e1bd580430" + integrity sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ== dependencies: - app-builder-lib "25.0.5" - builder-util "25.0.3" - builder-util-runtime "9.2.5" + app-builder-lib "25.1.8" + builder-util "25.1.7" + builder-util-runtime "9.2.10" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -1225,36 +1224,35 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^25.0.5: - version "25.0.5" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.0.5.tgz#fed2432016618fd5ff81dc9dad7ec47889ffe0f1" - integrity sha512-Uj5LFRbUqNiVajsgqcwlKe+CHtwubK3hcoJsW5C2YiWodej2mmxM+LrTqga0rrWWHVMNmrcmGcS/WHpKwy6KEw== +electron-builder@^25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.8.tgz#b0e310f1600787610bb84c3f39bc7aadb2548486" + integrity sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig== dependencies: - app-builder-lib "25.0.5" - builder-util "25.0.3" - builder-util-runtime "9.2.5" + app-builder-lib "25.1.8" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chalk "^4.1.2" - dmg-builder "25.0.5" + dmg-builder "25.1.8" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" - read-config-file "6.4.0" simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-log@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.7.tgz#73c7ddc1602b3a9ee355bc09d1dc490864add0eb" - integrity sha512-/PjrS9zGkrZCDTHt6IgNE3FeciBbi4wd7U76NG9jAoNXF99E9IJdvBkqvaUJ1NjLojYDKs0kTvn9YhKy1/Zi+Q== +electron-log@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.2.tgz#cdb0a6dc48178a7cbacb434a268ab097ad5198dc" + integrity sha512-fgvx6srjIHDowJD8WAAjoAXmiTyOz6JnGQoxOtk1mXw7o4S+HutuPHLCsk24xTXqWZgy4uO63NbedG+oEvldLw== -electron-publish@25.0.3: - version "25.0.3" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.0.3.tgz#63509992a5ae31bb2b0d8863b26a2f7c35e303cc" - integrity sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg== +electron-publish@25.1.7: + version "25.1.7" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.1.7.tgz#14e50c2a3fafdc1c454eadbbc47ead89a48bb554" + integrity sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "25.0.3" - builder-util-runtime "9.2.5" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" @@ -1268,12 +1266,12 @@ electron-store@^8.2.0: conf "^10.2.0" type-fest "^2.17.0" -electron-updater@^6.3.4: - version "6.3.4" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.4.tgz#3934bc89875bb524c2cbbd11041114e97c0c2496" - integrity sha512-uZUo7p1Y53G4tl6Cgw07X1yF8Jlz6zhaL7CQJDZ1fVVkOaBfE2cWtx80avwDVi8jHp+I/FWawrMgTAeCCNIfAg== +electron-updater@^6.3.9: + version "6.3.9" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.9.tgz#e1e7f155624c58e6f3760f376c3a584028165ec4" + integrity sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw== dependencies: - builder-util-runtime "9.2.5" + builder-util-runtime "9.2.10" fs-extra "^10.1.0" js-yaml "^4.1.0" lazy-val "^1.0.5" @@ -1282,10 +1280,10 @@ electron-updater@^6.3.4: semver "^7.6.3" tiny-typed-emitter "^2.1.0" -electron@^33.0.2: - version "33.0.2" - resolved "https://registry.yarnpkg.com/electron/-/electron-33.0.2.tgz#db31b105bf0edd7c8600dfb70c2dfc214e3789f1" - integrity sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw== +electron@^33.2.0: + version "33.2.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-33.2.0.tgz#2a7098653eaf1a53c7311a01d5636783019f2354" + integrity sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA== dependencies: "@electron/get" "^2.0.0" "@types/node" "^20.9.0" @@ -1860,6 +1858,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-response-object@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" @@ -1875,7 +1881,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -1883,6 +1889,14 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -2207,10 +2221,10 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.0.tgz#15d93a196f189034d7166caf9fe55e7384c98a21" - integrity sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA== +lru-cache@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== lru-cache@^6.0.0: version "6.0.0" @@ -2537,17 +2551,17 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onnxruntime-common@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.19.2.tgz#39447d703aef6499f71487cb8970f58752234523" - integrity sha512-a4R7wYEVFbZBlp0BfhpbFWqe4opCor3KM+5Wm22Az3NGDcQMiU2hfG/0MfnBs+1ZrlSGmlgWeMcXQkDk1UFb8Q== +onnxruntime-common@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.20.0.tgz#e1774cf76ede788838ff7bd4debc8df6feca91f1" + integrity sha512-9ehS4ul5fBszIcHhfxuDgk45lO+Fqrxmrgwk1Pxb1JRvbQiCB/v9Royv95SRCWHktLMviqNjBsEd/biJhd39cg== -onnxruntime-node@^1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.19.2.tgz#2f2e1c9286c97291030770c085fb403647538ad7" - integrity sha512-9eHMP/HKbbeUcqte1JYzaaRC8JPn7ojWeCeoyShO86TOR97OCyIyAIOGX3V95ErjslVhJRXY8Em/caIUc0hm1Q== +onnxruntime-node@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.20.0.tgz#16dcbe06e7683eee37ccbd3f39ad2beac36c1a24" + integrity sha512-mjLge++8WHfyCZ4IqZ1FbUbtFAfGht7BLCkOeBL1L9PFV27YHwluXkNt7m0Pgf6TR2P5pqVZsD3zqFbFP6QTMw== dependencies: - onnxruntime-common "1.19.2" + onnxruntime-common "1.20.0" tar "^7.0.1" optionator@^0.9.3: @@ -2713,18 +2727,18 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-organize-imports@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.0.0.tgz#a69acf024ea3c8eb650c81f664693826ca853534" - integrity sha512-vnKSdgv9aOlqKeEFGhf9SCBsTyzDSyScy1k7E0R1Uo4L0cTcOV7c1XQaT7jfXIOc/p08WLBfN2QUQA9zDSZMxA== +prettier-plugin-organize-imports@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f" + integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== -prettier-plugin-packagejson@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.2.tgz#25e8531e15b04e1f68ee7ee4a4b111bd5bea6fcc" - integrity sha512-w+TmoLv2pIa+siplW1cCj2ujEXQQS6z7wmWLOiLQK/2QVl7Wy6xh/ZUpqQw8tbKMXDodmSW4GONxlA33xpdNOg== +prettier-plugin-packagejson@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz#a3f9eb02ece197db6b7696be5df43ddc2397ad81" + integrity sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg== dependencies: sort-package-json "2.10.1" - synckit "0.9.1" + synckit "0.9.2" prettier@^3.3.3: version "3.3.3" @@ -2779,18 +2793,6 @@ read-binary-file-arch@^1.0.6: dependencies: debug "^4.3.4" -read-config-file@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.4.0.tgz#970542833216cccff6b1d83320495003dcf85a45" - integrity sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q== - dependencies: - config-file-ts "0.2.8-rc1" - dotenv "^16.4.5" - dotenv-expand "^11.0.6" - js-yaml "^4.1.0" - json5 "^2.2.3" - lazy-val "^1.0.5" - readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -2814,11 +2816,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3088,11 +3085,6 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - sprintf-js@^1.1.2, sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" @@ -3164,10 +3156,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" - integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== +synckit@0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -3277,20 +3269,25 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript-eslint@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.4.0.tgz#3fa38bd279994cdb40ba9264ef5262a17cf4cfa0" - integrity sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw== +typescript-eslint@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.14.0.tgz#2435c0628e90303544fdd63ae311e9bf6d149a5d" + integrity sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w== dependencies: - "@typescript-eslint/eslint-plugin" "8.4.0" - "@typescript-eslint/parser" "8.4.0" - "@typescript-eslint/utils" "8.4.0" + "@typescript-eslint/eslint-plugin" "8.14.0" + "@typescript-eslint/parser" "8.14.0" + "@typescript-eslint/utils" "8.14.0" -typescript@^5.4.3, typescript@^5.5.4: +typescript@^5.4.3: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" From 78871e2843fbd1dd9d2278bbfe6c20a311930703 Mon Sep 17 00:00:00 2001 From: Nikunj Kumar Nakum <40589688+nikunjkumarnakum@users.noreply.github.com> Date: Mon, 18 Nov 2024 14:11:26 +0530 Subject: [PATCH 53/75] Added Bluesky logo (#4061) ## Description added bluesky logo ## Tests --- auth/assets/custom-icons/_data/custom-icons.json | 3 +++ auth/assets/custom-icons/icons/Bluesky.svg | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 auth/assets/custom-icons/icons/Bluesky.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index b921aeccd4..4d38e72d80 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -159,6 +159,9 @@ "Bloom Host Billing" ] }, + { + "title": "Bluesky" + }, { "title": "Bohemia" }, diff --git a/auth/assets/custom-icons/icons/Bluesky.svg b/auth/assets/custom-icons/icons/Bluesky.svg new file mode 100644 index 0000000000..f8dc60c934 --- /dev/null +++ b/auth/assets/custom-icons/icons/Bluesky.svg @@ -0,0 +1,3 @@ + + + From 34bce7c1d32313031f63a748838968bb0457e41a Mon Sep 17 00:00:00 2001 From: Aaron Date: Mon, 18 Nov 2024 09:44:08 +0100 Subject: [PATCH 54/75] [auth][l10n]: Add Catalan translation (#4052) --- auth/lib/locale.dart | 1 + auth/lib/ui/settings/language_picker.dart | 2 ++ 2 files changed, 3 insertions(+) diff --git a/auth/lib/locale.dart b/auth/lib/locale.dart index 7b0a34d02a..2fd3d5f0b6 100644 --- a/auth/lib/locale.dart +++ b/auth/lib/locale.dart @@ -7,6 +7,7 @@ import 'package:shared_preferences/shared_preferences.dart'; const List appSupportedLocales = [ Locale('ar'), Locale('bg'), + Locale('ca'), Locale('de'), Locale('el'), Locale('en'), diff --git a/auth/lib/ui/settings/language_picker.dart b/auth/lib/ui/settings/language_picker.dart index bdcdc30101..c82ab788ab 100644 --- a/auth/lib/ui/settings/language_picker.dart +++ b/auth/lib/ui/settings/language_picker.dart @@ -126,6 +126,8 @@ class _ItemsWidgetState extends State { switch (locale.languageCode) { case 'ar': return 'العربية'; + case 'ca': + return 'Català'; case 'en': return 'English'; case 'bg': From 05b88bb8312fbd777f55798c33505625bb9f9a48 Mon Sep 17 00:00:00 2001 From: Nugraha Yoga <41882333+nugrahayoga@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:44:18 +0700 Subject: [PATCH 55/75] [mob] Fix market URI on mobile (#4054) ## Description This PR fix typos in the market URI that resulted in 404 page on android market. ![image](https://github.com/user-attachments/assets/f91669f0-cace-4f93-8a55-202adda4c164) --- auth/lib/services/update_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/lib/services/update_service.dart b/auth/lib/services/update_service.dart index e102a5a940..c943d4f595 100644 --- a/auth/lib/services/update_service.dart +++ b/auth/lib/services/update_service.dart @@ -99,7 +99,7 @@ class UpdateService { if (flavor == "playstore") { return const Tuple2( "Play Store", - "market://details??id=io.ente.auth", + "market://details?id=io.ente.auth", ); } return const Tuple2( From 9401c9f0e13ca3c4182f3e99b2277cbdb496d6a9 Mon Sep 17 00:00:00 2001 From: rippleFCL Date: Mon, 18 Nov 2024 08:45:43 +0000 Subject: [PATCH 56/75] [cli] Update Ente CLI ENTE_CLI_SECRETS_PATH docs (#4047) Co-authored-by: seeg --- docs/docs/self-hosting/troubleshooting/keyring.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/docs/self-hosting/troubleshooting/keyring.md b/docs/docs/self-hosting/troubleshooting/keyring.md index 066c2574d1..6aa1fefc89 100644 --- a/docs/docs/self-hosting/troubleshooting/keyring.md +++ b/docs/docs/self-hosting/troubleshooting/keyring.md @@ -11,7 +11,7 @@ box might give you some errors related to keyrings in some case. Follow the below steps to run Ente CLI and also avoid keyrings errors. -- Create a secrets.txt file and save your user password inside it. +Run: ```sh # export the secrets path @@ -20,12 +20,15 @@ export ENTE_CLI_SECRETS_PATH=./ ./ente-cli ``` +You can also add the above line to your shell's rc file, to prevent the need to export manually every time. + +Then one of the following: + +1. If the file doesn't exist, Ente CLI will create it and fill it with a random 32 character encryption key. +2. If you do create the file, please fill it with a cryptographically generated 32 byte string. And you are good to go. -- You can also add the above line to your shell's rc file, to not -having to export it manually every time. - ## Ref - [Ente CLI Secrets Path](https://www.reddit.com/r/selfhosted/comments/1gc09il/comment/lu2hox2/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button) From 77844f802cf16fbcf1eecd46f5c33f9de601ea25 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 14:19:25 +0530 Subject: [PATCH 57/75] [web] Add workaround for black grid lines when zooming onto images in Chrome Fixes https://github.com/ente-io/ente/issues/4067 --- web/apps/photos/src/styles/global.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/apps/photos/src/styles/global.css b/web/apps/photos/src/styles/global.css index c30221d644..e60b1944f4 100644 --- a/web/apps/photos/src/styles/global.css +++ b/web/apps/photos/src/styles/global.css @@ -90,6 +90,15 @@ body { .pswp__img { object-fit: contain; + /* For reasons I don't understand, Chrome shows black grid lines on images + when we zoom into them, unless we set a background color. + https://github.com/ente-io/ente/issues/4067 + + Even after setting the background color, the black lines are visible for + a split second when an image is zoomed on to for the first time (this can + be used as a test to see when this workaround is no longer required). + */ + background-color: black; } .pswp__button--arrow--left, From c120ab0596b109584441660bbe324fddd2a95c2f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 15:47:41 +0530 Subject: [PATCH 58/75] assigned and rejected should not intersect --- web/packages/new/photos/services/ml/people.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index f06f633779..30f24e390b 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -656,7 +656,6 @@ export const _applyPersonSuggestionUpdates = async ( const localClusters = await savedFaceClusters(); let assignedClusters = [...cgroup.data.assigned]; - const newlyAssignedFaceIDs = new Set(); let rejectedClusterIDs = await savedRejectedClustersForCGroup(cgroup.id); let newlyRejectedFaceIDs: string[] = []; @@ -670,7 +669,6 @@ export const _applyPersonSuggestionUpdates = async ( const assign = (clusterID: string) => { const cluster = clusterWithID(clusterID); assignedClusters.push(cluster); - cluster.faces.forEach((id) => newlyAssignedFaceIDs.add(id)); assignUpdateCount += 1; }; @@ -748,9 +746,8 @@ export const _applyPersonSuggestionUpdates = async ( if (assignUpdateCount > 0 || newlyRejectedFaceIDs.length > 0) { const assigned = assignedClusters; - const rejectedFaceIDs = cgroup.data.rejectedFaceIDs - .concat(newlyRejectedFaceIDs) - .filter((id) => !newlyAssignedFaceIDs.has(id)); + const rejectedFaceIDs = + cgroup.data.rejectedFaceIDs.concat(newlyRejectedFaceIDs); await updateOrCreateUserEntities( "cgroup", [ From daee8fb4f648cee96612851631ec6975af24bd4f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 16:48:03 +0530 Subject: [PATCH 59/75] Update deps --- web/apps/payments/package.json | 2 +- web/package.json | 4 +- web/packages/build-config/package.json | 4 +- web/yarn.lock | 66 ++++++++++---------------- 4 files changed, 31 insertions(+), 45 deletions(-) diff --git a/web/apps/payments/package.json b/web/apps/payments/package.json index ead1e9cca9..412da2d265 100644 --- a/web/apps/payments/package.json +++ b/web/apps/payments/package.json @@ -18,6 +18,6 @@ "@types/react": "^18", "@types/react-dom": "^18", "@vitejs/plugin-react": "^4.3", - "vite": "^5.3" + "vite": "^5.4" } } diff --git a/web/package.json b/web/package.json index 0641a36e44..86d4d2e215 100644 --- a/web/package.json +++ b/web/package.json @@ -35,10 +35,10 @@ "@emotion/styled": "^11.13.0" }, "devDependencies": { - "concurrently": "^8.2.2", + "concurrently": "^9.1.0", "eslint": "^8", "prettier": "^3.3.3", - "typescript": "^5" + "typescript": "^5.6.3" }, "packageManager": "yarn@1.22.22" } diff --git a/web/packages/build-config/package.json b/web/packages/build-config/package.json index 6c5315b5d2..81c5c84b15 100644 --- a/web/packages/build-config/package.json +++ b/web/packages/build-config/package.json @@ -8,7 +8,7 @@ "eslint-plugin-react": "^7.34", "eslint-plugin-react-hooks": "^4.6", "eslint-plugin-react-refresh": "^0.4.7", - "prettier-plugin-organize-imports": "^4.0.0", - "prettier-plugin-packagejson": "^2.5.2" + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-packagejson": "^2.5.3" } } diff --git a/web/yarn.lock b/web/yarn.lock index ab0c8a1aa9..9fde4309ff 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -150,7 +150,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== @@ -1610,17 +1610,15 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concurrently@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== +concurrently@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.0.tgz#8da6d609f4321752912dab9be8710232ac496aa0" + integrity sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg== dependencies: chalk "^4.1.2" - date-fns "^2.30.0" lodash "^4.17.21" rxjs "^7.8.1" shell-quote "^1.8.1" - spawn-command "0.0.2" supports-color "^8.1.1" tree-kill "^1.2.2" yargs "^17.7.2" @@ -1697,13 +1695,6 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - dayjs@^1.10.0, dayjs@^1.11.13: version "1.11.13" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" @@ -3635,18 +3626,18 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-organize-imports@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.0.0.tgz#a69acf024ea3c8eb650c81f664693826ca853534" - integrity sha512-vnKSdgv9aOlqKeEFGhf9SCBsTyzDSyScy1k7E0R1Uo4L0cTcOV7c1XQaT7jfXIOc/p08WLBfN2QUQA9zDSZMxA== +prettier-plugin-organize-imports@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f" + integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== -prettier-plugin-packagejson@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.2.tgz#25e8531e15b04e1f68ee7ee4a4b111bd5bea6fcc" - integrity sha512-w+TmoLv2pIa+siplW1cCj2ujEXQQS6z7wmWLOiLQK/2QVl7Wy6xh/ZUpqQw8tbKMXDodmSW4GONxlA33xpdNOg== +prettier-plugin-packagejson@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz#a3f9eb02ece197db6b7696be5df43ddc2397ad81" + integrity sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg== dependencies: sort-package-json "2.10.1" - synckit "0.9.1" + synckit "0.9.2" prettier@^3.3.3: version "3.3.3" @@ -4114,11 +4105,6 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -4311,10 +4297,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" - integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== +synckit@0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -4467,10 +4453,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5: - version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== +typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== unbox-primitive@^1.0.2: version "1.0.2" @@ -4522,10 +4508,10 @@ uuid@^9.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -vite@^5.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.3.tgz#771c470e808cb6732f204e1ee96c2ed65b97a0eb" - integrity sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q== +vite@^5.4: + version "5.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From ed2ad06515e8e462a7bc430de6aa3d502aa9995b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 16:12:46 +0530 Subject: [PATCH 60/75] Fix comlink init (after dep update) --- web/packages/base/log.ts | 4 +++- web/packages/base/package.json | 2 +- web/packages/base/worker/worker-bridge.ts | 5 ++++- web/packages/new/photos/utils/file.ts | 3 ++- web/yarn.lock | 8 ++++---- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/web/packages/base/log.ts b/web/packages/base/log.ts index 01c28c6c99..0be2b24512 100644 --- a/web/packages/base/log.ts +++ b/web/packages/base/log.ts @@ -30,7 +30,9 @@ export const logToDisk = (message: string) => { }; const workerLogToDisk = (message: string) => { - workerBridge.logToDisk(message).catch((e: unknown) => { + // We checked that we're `inWorker` prior to calling this function. + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + workerBridge!.logToDisk(message).catch((e: unknown) => { console.error( "Failed to log a message from worker", e, diff --git a/web/packages/base/package.json b/web/packages/base/package.json index 8ef7720afc..81f65470b3 100644 --- a/web/packages/base/package.json +++ b/web/packages/base/package.json @@ -7,7 +7,7 @@ "@emotion/styled": "^11.13.0", "@mui/icons-material": "^5.16.6", "@mui/material": "^5.16.6", - "comlink": "^4.4.1", + "comlink": "^4.4.2", "get-user-locale": "^2.3.2", "i18next": "^23.15.1", "i18next-resources-to-backend": "^1.2.1", diff --git a/web/packages/base/worker/worker-bridge.ts b/web/packages/base/worker/worker-bridge.ts index ae0c6b02c2..eaf3028ea4 100644 --- a/web/packages/base/worker/worker-bridge.ts +++ b/web/packages/base/worker/worker-bridge.ts @@ -1,4 +1,5 @@ import { wrap } from "comlink"; +import { inWorker } from "../env"; import type { WorkerBridge } from "./comlink-worker"; /** @@ -9,4 +10,6 @@ import type { WorkerBridge } from "./comlink-worker"; * this object will be transparently (but asynchrorously) relayed to the * implementation of the {@link WorkerBridge} in `comlink-worker.ts`. */ -export const workerBridge = wrap(globalThis); +export const workerBridge = inWorker() + ? wrap(globalThis) + : undefined; diff --git a/web/packages/new/photos/utils/file.ts b/web/packages/new/photos/utils/file.ts index 26f3da2eba..d5948bf735 100644 --- a/web/packages/new/photos/utils/file.ts +++ b/web/packages/new/photos/utils/file.ts @@ -127,7 +127,8 @@ const nativeConvertToJPEG = async (imageBlob: Blob) => { // thus, to the `window.electron`) object. const jpegData = electron ? await electron.convertToJPEG(imageData) - : await workerBridge.convertToJPEG(imageData); + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await workerBridge!.convertToJPEG(imageData); log.debug(() => `Native JPEG conversion took ${Date.now() - startTime} ms`); return new Blob([jpegData], { type: "image/jpeg" }); }; diff --git a/web/yarn.lock b/web/yarn.lock index 9fde4309ff..b0a4d895cc 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1595,10 +1595,10 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -comlink@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.1.tgz#e568b8e86410b809e8600eb2cf40c189371ef981" - integrity sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q== +comlink@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.2.tgz#cbbcd82742fbebc06489c28a183eedc5c60a2bca" + integrity sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g== commander@^7.2.0: version "7.2.0" From 6304af0b319bf98cbdb038970e94fac5f640d15d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 17:35:26 +0530 Subject: [PATCH 61/75] Other updates --- web/packages/base/package.json | 6 +++--- web/yarn.lock | 35 ++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/web/packages/base/package.json b/web/packages/base/package.json index 81f65470b3..014006e6a8 100644 --- a/web/packages/base/package.json +++ b/web/packages/base/package.json @@ -9,15 +9,15 @@ "@mui/material": "^5.16.6", "comlink": "^4.4.2", "get-user-locale": "^2.3.2", - "i18next": "^23.15.1", + "i18next": "^23.16.5", "i18next-resources-to-backend": "^1.2.1", "is-electron": "^2.2.2", "libsodium-wrappers-sumo": "^0.7.15", - "nanoid": "^5.0.7", + "nanoid": "^5.0.8", "next": "^14.2.9", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^15.0.1" + "react-i18next": "^15.1.1" }, "devDependencies": { "@/build-config": "*", diff --git a/web/yarn.lock b/web/yarn.lock index b0a4d895cc..ebe44ccfda 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -150,13 +150,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.25.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.25.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" @@ -2696,10 +2703,10 @@ i18next-resources-to-backend@^1.2.1: dependencies: "@babel/runtime" "^7.23.2" -i18next@^23.15.1: - version "23.15.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.15.1.tgz#c50de337bf12ca5195e697cc0fbe5f32304871d9" - integrity sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA== +i18next@^23.16.5: + version "23.16.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.16.5.tgz#53d48ae9f985fd73fc1fcb96e6c7d90ababf0831" + integrity sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA== dependencies: "@babel/runtime" "^7.23.2" @@ -3350,10 +3357,10 @@ nanoid@^3.3.6, nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -nanoid@^5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.7.tgz#6452e8c5a816861fd9d2b898399f7e5fd6944cc6" - integrity sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ== +nanoid@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.8.tgz#7610003f6b3b761b5c244bb342c112c5312512bf" + integrity sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ== natural-compare@^1.4.0: version "1.4.0" @@ -3711,12 +3718,12 @@ react-fast-compare@^2.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react-i18next@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.0.1.tgz#fc662d93829ecb39683fe2757a47ebfbc5c912a0" - integrity sha512-NwxLqNM6CLbeGA9xPsjits0EnXdKgCRSS6cgkgOdNcPXqL+1fYNl8fBg1wmnnHvFy812Bt4IWTPE9zjoPmFj3w== +react-i18next@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.1.1.tgz#30bc76b39ded6ee37f1457677e46e6d6f11d9f64" + integrity sha512-R/Vg9wIli2P3FfeI8o1eNJUJue5LWpFsQePCHdQDmX0Co3zkr6kdT8gAseb/yGeWbNz1Txc4bKDQuZYsC0kQfw== dependencies: - "@babel/runtime" "^7.24.8" + "@babel/runtime" "^7.25.0" html-parse-stringify "^3.0.1" react-is@^16.13.1, react-is@^16.7.0: From 17bcf212166df799da2a47cac80e2f636f543356 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 17:54:24 +0530 Subject: [PATCH 62/75] Start deprecating ensure ensure: Error: Required value was undefined Built in undefined property access (note how the error message has more info): TypeError: Cannot read properties of undefined (reading 'length') --- web/apps/accounts/src/pages/passkeys/index.tsx | 2 +- web/packages/base/log.ts | 2 -- web/packages/build-config/eslintrc-base.js | 13 +++++++++++++ web/packages/new/photos/services/ml/cluster.ts | 1 - web/packages/new/photos/services/ml/face.ts | 9 --------- web/packages/new/photos/services/ml/image.ts | 3 --- web/packages/new/photos/services/ml/math.ts | 1 - web/packages/new/photos/services/ml/people.ts | 1 - web/packages/new/photos/utils/file.ts | 3 +-- 9 files changed, 15 insertions(+), 20 deletions(-) diff --git a/web/apps/accounts/src/pages/passkeys/index.tsx b/web/apps/accounts/src/pages/passkeys/index.tsx index ac741f06d7..4304d8975b 100644 --- a/web/apps/accounts/src/pages/passkeys/index.tsx +++ b/web/apps/accounts/src/pages/passkeys/index.tsx @@ -64,7 +64,7 @@ const Page: React.FC = () => { const refreshPasskeys = useCallback(async () => { try { - setPasskeys(await getPasskeys(ensure(token))); + setPasskeys(await getPasskeys(token!)); } catch (e) { log.error("Failed to fetch passkeys", e); showPasskeyFetchFailedErrorDialog(); diff --git a/web/packages/base/log.ts b/web/packages/base/log.ts index 0be2b24512..f79022fa6b 100644 --- a/web/packages/base/log.ts +++ b/web/packages/base/log.ts @@ -30,8 +30,6 @@ export const logToDisk = (message: string) => { }; const workerLogToDisk = (message: string) => { - // We checked that we're `inWorker` prior to calling this function. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion workerBridge!.logToDisk(message).catch((e: unknown) => { console.error( "Failed to log a message from worker", diff --git a/web/packages/build-config/eslintrc-base.js b/web/packages/build-config/eslintrc-base.js index 0b54770457..e5d43938b0 100644 --- a/web/packages/build-config/eslintrc-base.js +++ b/web/packages/build-config/eslintrc-base.js @@ -41,5 +41,18 @@ module.exports = { }, }, ], + /* Allow force unwrapping potentially optional values. + + It is best if these can be avoided by restructuring the code, but + there do arise legitimate scenarios where we know from code logic + that the value should be present. Of course, the surrounding code + might change causing that expectation to be falsified, but in certain + cases there isn't much we can do other than throwing an exception. + + Instead of rolling our own such exception (which we in fact used to + do at one point), rely on the JS's native undefined property access + exception since that conveys more information in the logs. + */ + "@typescript-eslint/no-non-null-assertion": "off", }, }; diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index cfd2e6dcd5..e0a2003218 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -306,7 +306,6 @@ const clusterBatchLinear = async ( for (let j = i - 1; j >= 0; j--) { // ! This is an O(n^2) loop, be careful when adding more code here. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const fj = faces[j]!; // The vectors are already normalized, so we can directly use their diff --git a/web/packages/new/photos/services/ml/face.ts b/web/packages/new/photos/services/ml/face.ts index c93241cb23..098c0ed4d4 100644 --- a/web/packages/new/photos/services/ml/face.ts +++ b/web/packages/new/photos/services/ml/face.ts @@ -1,12 +1,3 @@ -// [Note: Allowing non-null assertions selectively] -// -// The code in this file involves a lot of imperative array processing and -// indexing, and allowing non-null assertions ("!") is the easiest way to get -// TypeScript to accept it in the presence of noUncheckedIndexedAccess without -// obfuscating the original algorithms. -// -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - import { assertionFailed } from "@/base/assert"; import type { ElectronMLWorker } from "@/base/types/ipc"; import type { EnteFile } from "@/media/file"; diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index 8494eb961c..80f80f0c7f 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -1,6 +1,3 @@ -// See: [Note: Allowing non-null assertions selectively] -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - import { ensure } from "@/utils/ensure"; import { Matrix, inverse } from "ml-matrix"; import { clamp } from "./math"; diff --git a/web/packages/new/photos/services/ml/math.ts b/web/packages/new/photos/services/ml/math.ts index 9e78dcd822..afdb18b03a 100644 --- a/web/packages/new/photos/services/ml/math.ts +++ b/web/packages/new/photos/services/ml/math.ts @@ -61,7 +61,6 @@ export const dotProduct = (v1: Float32Array, v2: Float32Array) => { if (v1.length != v2.length) throw new Error(`Length mismatch ${v1.length} ${v2.length}`); let d = 0; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion for (let i = 0; i < v1.length; i++) d += v1[i]! * v2[i]!; return d; }; diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 30f24e390b..fae1c189ef 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -611,7 +611,6 @@ const randomSample = (items: T[], n: number) => { while (ix.size < n) { ix.add(Math.floor(Math.random() * items.length)); } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return [...ix].map((i) => items[i]!); }; diff --git a/web/packages/new/photos/utils/file.ts b/web/packages/new/photos/utils/file.ts index d5948bf735..6aab6e7017 100644 --- a/web/packages/new/photos/utils/file.ts +++ b/web/packages/new/photos/utils/file.ts @@ -127,8 +127,7 @@ const nativeConvertToJPEG = async (imageBlob: Blob) => { // thus, to the `window.electron`) object. const jpegData = electron ? await electron.convertToJPEG(imageData) - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await workerBridge!.convertToJPEG(imageData); + : await workerBridge!.convertToJPEG(imageData); log.debug(() => `Native JPEG conversion took ${Date.now() - startTime} ms`); return new Blob([jpegData], { type: "image/jpeg" }); }; From a261d1b3a225a184adcd6116857ff5422e76cc50 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 18:03:00 +0530 Subject: [PATCH 63/75] Continue 17bcf212166df799da2a47cac80e2f636f543356 --- .../accounts/src/pages/passkeys/index.tsx | 5 ++--- .../accounts/src/pages/passkeys/verify.tsx | 5 ++--- web/apps/accounts/src/services/passkey.ts | 3 +-- web/apps/accounts/src/types/context.ts | 3 +-- web/apps/auth/src/pages/_app.tsx | 3 +-- web/apps/auth/src/pages/auth.tsx | 12 +++++------- web/apps/auth/src/services/code.ts | 7 +++---- web/apps/cast/src/pages/slideshow.tsx | 3 +-- web/apps/cast/src/services/render.ts | 3 +-- web/packages/accounts/pages/credentials.tsx | 3 +-- web/packages/accounts/pages/generate.tsx | 3 +-- web/packages/accounts/pages/recover.tsx | 3 +-- .../accounts/pages/two-factor/recover.tsx | 5 ++--- .../accounts/pages/two-factor/setup.tsx | 3 +-- .../accounts/pages/two-factor/verify.tsx | 3 +-- web/packages/accounts/pages/verify.tsx | 3 +-- web/packages/media/file-metadata.ts | 3 +-- .../components/gallery/PeopleHeader.tsx | 3 +-- .../new/photos/services/ffmpeg/worker.ts | 3 +-- .../new/photos/services/ml/cluster.ts | 19 +++++++++---------- web/packages/new/photos/services/ml/crop.ts | 3 +-- web/packages/new/photos/services/ml/image.ts | 9 ++++----- web/packages/new/photos/services/ml/index.ts | 3 +-- web/packages/new/photos/services/ml/people.ts | 9 ++++----- web/packages/new/photos/services/ml/worker.ts | 13 +++++-------- .../new/photos/services/search/worker.ts | 4 +--- .../new/photos/services/user-entity/remote.ts | 3 +-- web/packages/new/photos/types/context.ts | 3 +-- web/packages/shared/utils/index.ts | 3 +-- web/packages/shared/utils/queueProcessor.ts | 4 +--- 30 files changed, 57 insertions(+), 92 deletions(-) diff --git a/web/apps/accounts/src/pages/passkeys/index.tsx b/web/apps/accounts/src/pages/passkeys/index.tsx index 4304d8975b..5e5b78dfff 100644 --- a/web/apps/accounts/src/pages/passkeys/index.tsx +++ b/web/apps/accounts/src/pages/passkeys/index.tsx @@ -4,7 +4,6 @@ import { SidebarDrawer } from "@/base/components/mui/SidebarDrawer"; import { Titlebar } from "@/base/components/Titlebar"; import { errorDialogAttributes } from "@/base/components/utils/dialog"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { CenteredFlex } from "@ente/shared/components/Container"; import { EnteMenuItem } from "@ente/shared/components/Menu/EnteMenuItem"; import SingleInputForm from "@ente/shared/components/SingleInputForm"; @@ -103,7 +102,7 @@ const Page: React.FC = () => { resetForm: () => void, ) => { try { - await registerPasskey(ensure(token), inputValue); + await registerPasskey(token!, inputValue); } catch (e) { log.error("Failed to register a new passkey", e); // If the user cancels the operation, then an error with name @@ -273,7 +272,7 @@ const ManagePasskeyDrawer: React.FC = ({ text: t("delete"), color: "critical", action: async () => { - await deletePasskey(ensure(token), ensure(passkey).id); + await deletePasskey(token!, passkey!.id); onUpdateOrDeletePasskey(); }, }, diff --git a/web/apps/accounts/src/pages/passkeys/verify.tsx b/web/apps/accounts/src/pages/passkeys/verify.tsx index 196682be28..06e0cdbc8d 100644 --- a/web/apps/accounts/src/pages/passkeys/verify.tsx +++ b/web/apps/accounts/src/pages/passkeys/verify.tsx @@ -2,7 +2,6 @@ import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { FocusVisibleButton } from "@/base/components/mui/FocusVisibleButton"; import log from "@/base/log"; import type { TwoFactorAuthorizationResponse } from "@/base/types/credentials"; -import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { VerticallyCentered } from "@ente/shared/components/Container"; import InfoIcon from "@mui/icons-material/Info"; @@ -212,7 +211,7 @@ const Page = () => { if (successRedirectURL) redirectToURL(successRedirectURL); }, [successRedirectURL]); - const handleVerify = () => void authenticateContinue(ensure(continuation)); + const handleVerify = () => void authenticateContinue(continuation!); const handleRetry = () => void authenticate(); @@ -232,7 +231,7 @@ const Page = () => { return () => redirectToPasskeyRecoverPage(new URL(recover)); })(); - const handleRedirectAgain = () => redirectToURL(ensure(successRedirectURL)); + const handleRedirectAgain = () => redirectToURL(successRedirectURL!); const components: Record = { loading: , diff --git a/web/apps/accounts/src/services/passkey.ts b/web/apps/accounts/src/services/passkey.ts index 3c12e31d79..632cd590cc 100644 --- a/web/apps/accounts/src/services/passkey.ts +++ b/web/apps/accounts/src/services/passkey.ts @@ -8,7 +8,6 @@ import { isDevBuild } from "@/base/env"; import { clientPackageHeader, ensureOk, HTTPError } from "@/base/http"; import { apiURL } from "@/base/origins"; import { TwoFactorAuthorizationResponse } from "@/base/types/credentials"; -import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; @@ -116,7 +115,7 @@ export const registerPasskey = async (token: string, name: string) => { const { sessionID, options } = await beginPasskeyRegistration(token); // Ask the browser to new (public key) credentials using these options. - const credential = ensure(await navigator.credentials.create(options)); + const credential = (await navigator.credentials.create(options))!; // Finish by letting the backend know about these credentials so that it can // save the public key for future authentication. diff --git a/web/apps/accounts/src/types/context.ts b/web/apps/accounts/src/types/context.ts index dece58358d..416ff1fcf1 100644 --- a/web/apps/accounts/src/types/context.ts +++ b/web/apps/accounts/src/types/context.ts @@ -1,5 +1,4 @@ import type { AccountsContextT } from "@/accounts/types/context"; -import { ensure } from "@/utils/ensure"; import { createContext, useContext } from "react"; /** @@ -16,4 +15,4 @@ export const AppContext = createContext(undefined); * Utility hook to get the {@link AppContextT}, throwing an exception if it is * not defined. */ -export const useAppContext = (): AppContextT => ensure(useContext(AppContext)); +export const useAppContext = (): AppContextT => useContext(AppContext)!; diff --git a/web/apps/auth/src/pages/_app.tsx b/web/apps/auth/src/pages/_app.tsx index 41e61d200c..e1bb9353f0 100644 --- a/web/apps/auth/src/pages/_app.tsx +++ b/web/apps/auth/src/pages/_app.tsx @@ -12,7 +12,6 @@ import { logStartupBanner, logUnhandledErrorsAndRejections, } from "@/base/log-web"; -import { ensure } from "@/utils/ensure"; import { MessageContainer } from "@ente/shared/components/MessageContainer"; import { useLocalState } from "@ente/shared/hooks/useLocalState"; import HTTPService from "@ente/shared/network/HTTPService"; @@ -51,7 +50,7 @@ type AppContextT = AccountsContextT & { export const AppContext = createContext(undefined); /** Utility hook to reduce amount of boilerplate in account related pages. */ -export const useAppContext = () => ensure(useContext(AppContext)); +export const useAppContext = () => useContext(AppContext)!; const App: React.FC = ({ Component, pageProps }) => { const router = useRouter(); diff --git a/web/apps/auth/src/pages/auth.tsx b/web/apps/auth/src/pages/auth.tsx index 6fb996cf3f..0032777ff9 100644 --- a/web/apps/auth/src/pages/auth.tsx +++ b/web/apps/auth/src/pages/auth.tsx @@ -3,7 +3,6 @@ import { stashRedirect } from "@/accounts/services/redirect"; import { EnteLogo } from "@/base/components/EnteLogo"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { NavbarBase } from "@/base/components/Navbar"; -import { ensure } from "@/utils/ensure"; import { HorizontalFlex, VerticallyCentered, @@ -17,15 +16,14 @@ import MoreHoriz from "@mui/icons-material/MoreHoriz"; import { Button, ButtonBase, Snackbar, TextField, styled } from "@mui/material"; import { t } from "i18next"; import { useRouter } from "next/router"; -import React, { useContext, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { generateOTPs, type Code } from "services/code"; import { getAuthCodes } from "services/remote"; -import { AppContext } from "./_app"; +import { useAppContext } from "./_app"; const Page: React.FC = () => { - const { logout, showNavBar, showMiniDialog } = ensure( - useContext(AppContext), - ); + const { logout, showNavBar, showMiniDialog } = useAppContext(); + const router = useRouter(); const [codes, setCodes] = useState([]); const [hasFetched, setHasFetched] = useState(false); @@ -141,7 +139,7 @@ const Page: React.FC = () => { export default Page; const AuthNavbar: React.FC = () => { - const { logout } = ensure(useContext(AppContext)); + const { logout } = useAppContext(); return ( diff --git a/web/apps/auth/src/services/code.ts b/web/apps/auth/src/services/code.ts index c604bae0ce..a7b1662b5d 100644 --- a/web/apps/auth/src/services/code.ts +++ b/web/apps/auth/src/services/code.ts @@ -1,4 +1,3 @@ -import { ensure } from "@/utils/ensure"; import { HOTP, TOTP } from "otpauth"; import { Steam } from "./steam"; @@ -168,8 +167,8 @@ const parseIssuer = (url: URL, path: string): string => { let p = decodeURIComponent(path); if (p.startsWith("/")) p = p.slice(1); - if (p.includes(":")) p = ensure(p.split(":")[0]); - else if (p.includes("-")) p = ensure(p.split("-")[0]); + if (p.includes(":")) p = p.split(":")[0]!; + else if (p.includes("-")) p = p.split("-")[0]!; return p; }; @@ -206,7 +205,7 @@ const parseCounter = (url: URL): number | undefined => { }; const parseSecret = (url: URL): string => - ensure(url.searchParams.get("secret")).replaceAll(" ", "").toUpperCase(); + url.searchParams.get("secret")!.replaceAll(" ", "").toUpperCase(); /** * Generate a pair of OTPs (one time passwords) from the given {@link code}. diff --git a/web/apps/cast/src/pages/slideshow.tsx b/web/apps/cast/src/pages/slideshow.tsx index 1d206867c4..8f17a38abb 100644 --- a/web/apps/cast/src/pages/slideshow.tsx +++ b/web/apps/cast/src/pages/slideshow.tsx @@ -1,5 +1,4 @@ import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { styled } from "@mui/material"; import { FilledCircleCheck } from "components/FilledCircleCheck"; import { useRouter } from "next/router"; @@ -22,7 +21,7 @@ export default function Slideshow() { const loop = async () => { try { - const urlGenerator = imageURLGenerator(ensure(readCastData())); + const urlGenerator = imageURLGenerator(readCastData()!); while (!stop) { const { value: url, done } = await urlGenerator.next(); if (done == true || !url) { diff --git a/web/apps/cast/src/services/render.ts b/web/apps/cast/src/services/render.ts index 0d9723511c..b9f9c589d0 100644 --- a/web/apps/cast/src/services/render.ts +++ b/web/apps/cast/src/services/render.ts @@ -21,7 +21,6 @@ import { isHEICExtension, needsJPEGConversion } from "@/media/formats"; import { heicToJPEG } from "@/media/heic-convert"; import { decodeLivePhoto } from "@/media/live-photo"; import { shuffled } from "@/utils/array"; -import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { ApiError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; @@ -134,7 +133,7 @@ export const imageURLGenerator = async function* (castData: CastData) { // The last to last element is the one that was shown prior to that, // and now can be safely revoked. if (previousURLs.length > 1) - URL.revokeObjectURL(ensure(previousURLs.shift())); + URL.revokeObjectURL(previousURLs.shift()!); previousURLs.push(url); diff --git a/web/packages/accounts/pages/credentials.tsx b/web/packages/accounts/pages/credentials.tsx index 188ae07f21..01f9174a0b 100644 --- a/web/packages/accounts/pages/credentials.tsx +++ b/web/packages/accounts/pages/credentials.tsx @@ -4,7 +4,6 @@ import { sharedCryptoWorker } from "@/base/crypto"; import type { B64EncryptionResult } from "@/base/crypto/libsodium"; import { clearLocalStorage } from "@/base/local-storage"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import VerifyMasterPasswordForm, { @@ -218,7 +217,7 @@ const Page: React.FC = ({ appContext }) => { id, twoFactorSessionID, passkeySessionID, - } = await loginViaSRP(ensure(srpAttributes), kek); + } = await loginViaSRP(srpAttributes!, kek); setIsFirstLogin(true); if (passkeySessionID) { const sessionKeyAttributes = diff --git a/web/packages/accounts/pages/generate.tsx b/web/packages/accounts/pages/generate.tsx index 42c01adb5c..02e4c5747a 100644 --- a/web/packages/accounts/pages/generate.tsx +++ b/web/packages/accounts/pages/generate.tsx @@ -13,7 +13,6 @@ import { } from "@/base/components/FormPaper"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import { @@ -80,7 +79,7 @@ const Page: React.FC = ({ appContext }) => { await generateKeyAndSRPAttributes(passphrase); // TODO: Refactor the code to not require this ensure - await putAttributes(ensure(token), keyAttributes); + await putAttributes(token!, keyAttributes); await configureSRP(srpSetupAttributes); await generateAndSaveIntermediateKeyAttributes( passphrase, diff --git a/web/packages/accounts/pages/recover.tsx b/web/packages/accounts/pages/recover.tsx index 38106a2980..411c76a7ce 100644 --- a/web/packages/accounts/pages/recover.tsx +++ b/web/packages/accounts/pages/recover.tsx @@ -7,7 +7,6 @@ import { } from "@/base/components/FormPaper"; import { sharedCryptoWorker } from "@/base/crypto"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { @@ -82,7 +81,7 @@ const Page: React.FC = ({ appContext }) => { recoveryKey = bip39.mnemonicToEntropy(recoveryKey); } const cryptoWorker = await sharedCryptoWorker(); - const keyAttr = ensure(keyAttributes); + const keyAttr = keyAttributes!; const masterKey = await cryptoWorker.decryptB64( keyAttr.masterKeyEncryptedWithRecoveryKey, keyAttr.masterKeyDecryptionNonce, diff --git a/web/packages/accounts/pages/two-factor/recover.tsx b/web/packages/accounts/pages/two-factor/recover.tsx index c8d5a08508..9718902ce1 100644 --- a/web/packages/accounts/pages/two-factor/recover.tsx +++ b/web/packages/accounts/pages/two-factor/recover.tsx @@ -14,7 +14,6 @@ import type { MiniDialogAttributes } from "@/base/components/MiniDialog"; import { sharedCryptoWorker } from "@/base/crypto"; import type { B64EncryptionResult } from "@/base/crypto/libsodium"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { @@ -114,14 +113,14 @@ const Page: React.FC = ({ appContext, twoFactorType }) => { recoveryKey = bip39.mnemonicToEntropy(recoveryKey); } const cryptoWorker = await sharedCryptoWorker(); - const { encryptedData, nonce } = ensure(encryptedTwoFactorSecret); + const { encryptedData, nonce } = encryptedTwoFactorSecret!; const twoFactorSecret = await cryptoWorker.decryptB64( encryptedData, nonce, await cryptoWorker.fromHex(recoveryKey), ); const resp = await removeTwoFactor( - ensure(sessionID), + sessionID!, twoFactorSecret, twoFactorType, ); diff --git a/web/packages/accounts/pages/two-factor/setup.tsx b/web/packages/accounts/pages/two-factor/setup.tsx index 2f1cc66bd4..794a2faebe 100644 --- a/web/packages/accounts/pages/two-factor/setup.tsx +++ b/web/packages/accounts/pages/two-factor/setup.tsx @@ -5,7 +5,6 @@ import VerifyTwoFactor, { import { TwoFactorSetup } from "@/accounts/components/two-factor/setup"; import type { TwoFactorSecret } from "@/accounts/types/user"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import { encryptWithRecoveryKey } from "@ente/shared/crypto/helpers"; @@ -50,7 +49,7 @@ const Page: React.FC = () => { markSuccessful, ) => { const recoveryEncryptedTwoFactorSecret = await encryptWithRecoveryKey( - ensure(twoFactorSecret).secretCode, + twoFactorSecret!.secretCode, ); await enableTwoFactor(otp, recoveryEncryptedTwoFactorSecret); await markSuccessful(); diff --git a/web/packages/accounts/pages/two-factor/verify.tsx b/web/packages/accounts/pages/two-factor/verify.tsx index 033d1e61dc..0db7eb9fee 100644 --- a/web/packages/accounts/pages/two-factor/verify.tsx +++ b/web/packages/accounts/pages/two-factor/verify.tsx @@ -8,7 +8,6 @@ import { FormPaperFooter, FormPaperTitle, } from "@/base/components/FormPaper"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import { ApiError } from "@ente/shared/error"; @@ -60,7 +59,7 @@ const Page: React.FC = ({ appContext }) => { encryptedToken, id, }); - setData(LS_KEYS.KEY_ATTRIBUTES, ensure(keyAttributes)); + setData(LS_KEYS.KEY_ATTRIBUTES, keyAttributes!); router.push(unstashRedirect() ?? PAGES.CREDENTIALS); } catch (e) { if ( diff --git a/web/packages/accounts/pages/verify.tsx b/web/packages/accounts/pages/verify.tsx index 6f0e410ccc..868d3e47b7 100644 --- a/web/packages/accounts/pages/verify.tsx +++ b/web/packages/accounts/pages/verify.tsx @@ -2,7 +2,6 @@ import type { UserVerificationResponse } from "@/accounts/types/user"; import { FormPaper, FormPaperTitle } from "@/base/components/FormPaper"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { @@ -124,7 +123,7 @@ const Page: React.FC = ({ appContext }) => { } else { if (getData(LS_KEYS.ORIGINAL_KEY_ATTRIBUTES)) { await putAttributes( - ensure(token), + token!, getData(LS_KEYS.ORIGINAL_KEY_ATTRIBUTES), ); } diff --git a/web/packages/media/file-metadata.ts b/web/packages/media/file-metadata.ts index 7ee4defb40..cd460f46a5 100644 --- a/web/packages/media/file-metadata.ts +++ b/web/packages/media/file-metadata.ts @@ -3,7 +3,6 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import { type Location } from "@/base/types"; import { type EnteFile, type FilePublicMagicMetadata } from "@/media/file"; -import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { mergeMetadata1 } from "./file"; @@ -374,7 +373,7 @@ export const updateRemotePublicMagicMetadata = async ( metadataVersion, ); - const updatedEnvelope = ensure(updateRequest.metadataList[0]).magicMetadata; + const updatedEnvelope = updateRequest.metadataList[0]!.magicMetadata; await putFilesPublicMagicMetadata(updateRequest); diff --git a/web/packages/new/photos/components/gallery/PeopleHeader.tsx b/web/packages/new/photos/components/gallery/PeopleHeader.tsx index 37e1fe0cae..8ef463d306 100644 --- a/web/packages/new/photos/components/gallery/PeopleHeader.tsx +++ b/web/packages/new/photos/components/gallery/PeopleHeader.tsx @@ -26,7 +26,6 @@ import { type PersonSuggestionUpdates, type PreviewableCluster, } from "@/new/photos/services/ml/people"; -import { ensure } from "@/utils/ensure"; import OverflowMenu from "@ente/shared/components/OverflowMenu/menu"; import { OverflowMenuOption } from "@ente/shared/components/OverflowMenu/option"; import AddIcon from "@mui/icons-material/Add"; @@ -329,7 +328,7 @@ const AddPersonDialog: React.FC = ({ const handleAddPersonBySelect = useWrapAsyncOperation( async (personID: string) => { onClose(); - const person = ensure(cgroupPeople.find((p) => p.id == personID)); + const person = cgroupPeople.find((p) => p.id == personID)!; await addClusterToCGroup(person.cgroup, cluster); onSelectPerson(personID); }, diff --git a/web/packages/new/photos/services/ffmpeg/worker.ts b/web/packages/new/photos/services/ffmpeg/worker.ts index c8bdabb7a0..64574b23c7 100644 --- a/web/packages/new/photos/services/ffmpeg/worker.ts +++ b/web/packages/new/photos/services/ffmpeg/worker.ts @@ -1,5 +1,4 @@ import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; import QueueProcessor from "@ente/shared/utils/queueProcessor"; import { expose } from "comlink"; import { @@ -107,7 +106,7 @@ const randomPrefix = () => { let result = ""; for (let i = 0; i < 10; i++) - result += ensure(alphabet[Math.floor(Math.random() * alphabet.length)]); + result += alphabet[Math.floor(Math.random() * alphabet.length)]!; return result; }; diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index e0a2003218..3d123286a8 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -2,7 +2,6 @@ import { assertionFailed } from "@/base/assert"; import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import type { EnteFile } from "@/media/file"; -import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { pullUserEntities, @@ -216,7 +215,7 @@ const sortFacesNewestOnesFirst = ( const fileForFaceID = new Map( faces.map(({ faceID }) => [ faceID, - localFileByID.get(ensure(fileIDFromFaceID(faceID))), + localFileByID.get(fileIDFromFaceID(faceID)!), ]), ); @@ -320,7 +319,7 @@ const clusterBatchLinear = async ( if (rejectedClusters) { const cjx = state.faceIDToClusterIndex.get(fj.faceID); if (cjx !== undefined) { - const cj = ensure(state.clusters[cjx]); + const cj = state.clusters[cjx]!; if (rejectedClusters.has(cj.id)) { continue; } @@ -333,11 +332,11 @@ const clusterBatchLinear = async ( if (nnIndex !== undefined) { // Found a neighbour close enough, add ourselves to its cluster. - const nnFace = ensure(faces[nnIndex]); - const nnClusterIndex = ensure( - state.faceIDToClusterIndex.get(nnFace.faceID), - ); - const nnCluster = ensure(state.clusters[nnClusterIndex]); + const nnFace = faces[nnIndex]!; + const nnClusterIndex = state.faceIDToClusterIndex.get( + nnFace.faceID, + )!; + const nnCluster = state.clusters[nnClusterIndex]!; state.faceIDToClusterID.set(fi.faceID, nnCluster.id); state.faceIDToClusterIndex.set(fi.faceID, nnClusterIndex); @@ -384,8 +383,8 @@ export const reconcileClusters = async ( ...cgroup, data: { ...cgroup.data, - assigned: cgroup.data.assigned.map(({ id }) => - ensure(clusterByID.get(id)), + assigned: cgroup.data.assigned.map( + ({ id }) => clusterByID.get(id)!, ), }, }; diff --git a/web/packages/new/photos/services/ml/crop.ts b/web/packages/new/photos/services/ml/crop.ts index 4c2def7002..a913baa81b 100644 --- a/web/packages/new/photos/services/ml/crop.ts +++ b/web/packages/new/photos/services/ml/crop.ts @@ -1,6 +1,5 @@ import { blobCache } from "@/base/blob-cache"; import type { EnteFile } from "@/media/file"; -import { ensure } from "@/utils/ensure"; import { fetchRenderableEnteFileBlob } from "./blob"; import { type Box, type FaceIndex } from "./face"; import { clamp } from "./math"; @@ -106,7 +105,7 @@ export const extractFaceCrop = (imageBitmap: ImageBitmap, faceBox: Box) => { const height = clamp(heightCrop, 0, imageHeight - y); const canvas = new OffscreenCanvas(width, height); - const ctx = ensure(canvas.getContext("2d")); + const ctx = canvas.getContext("2d")!; ctx.imageSmoothingQuality = "high"; ctx.drawImage(imageBitmap, x, y, width, height, 0, 0, width, height); diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index 80f80f0c7f..8d91842922 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -1,4 +1,3 @@ -import { ensure } from "@/utils/ensure"; import { Matrix, inverse } from "ml-matrix"; import { clamp } from "./math"; @@ -14,10 +13,10 @@ const pixelRGBA = ( } const index = (y * width + x) * 4; return { - r: ensure(imageData[index]), - g: ensure(imageData[index + 1]), - b: ensure(imageData[index + 2]), - a: ensure(imageData[index + 3]), + r: imageData[index]!, + g: imageData[index + 1]!, + b: imageData[index + 2]!, + a: imageData[index + 3]!, }; }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 5aea3e396b..f79c4eefff 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -11,7 +11,6 @@ import type { Electron } from "@/base/types/ipc"; import { ComlinkWorker } from "@/base/worker/comlink-worker"; import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; -import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; @@ -170,7 +169,7 @@ const createMLWorker = (electron: Electron): Promise => { // preload script. The data is the message that was posted. if (source == window && data == "createMLWorker/port") { window.removeEventListener("message", l); - resolve(ensure(ports[0])); + resolve(ports[0]!); } }; window.addEventListener("message", l); diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index fae1c189ef..f7592c4a52 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -2,7 +2,6 @@ import { assertionFailed } from "@/base/assert"; import log from "@/base/log"; import type { EnteFile } from "@/media/file"; import { shuffled } from "@/utils/array"; -import { ensure } from "@/utils/ensure"; import { getLocalFiles } from "../files"; import { savedCGroups, @@ -509,7 +508,7 @@ export const _suggestionsAndChoicesForPerson = async ( if (csims.length == 0) continue; - const medianSim = ensure(csims[Math.floor(csims.length / 2)]); + const medianSim = csims[Math.floor(csims.length / 2)]!; if (medianSim > 0.48) { candidateClustersAndSimilarity.push([cluster, medianSim]); } @@ -572,7 +571,7 @@ export const _suggestionsAndChoicesForPerson = async ( // Ensure that the first item in the choices is not an ignored one, even if // that is what we'd have ended up with if we sorted by size. - const firstChoice = { ...ensure(assignedChoices[0]), fixed: true }; + const firstChoice = { ...assignedChoices[0]!, fixed: true }; const restChoices = assignedChoices.slice(1).concat(rejectedChoices); sortBySize(restChoices); @@ -662,7 +661,7 @@ export const _applyPersonSuggestionUpdates = async ( let rejectUpdateCount = 0; const clusterWithID = (clusterID: string) => - ensure(localClusters.find((c) => c.id == clusterID)); + localClusters.find((c) => c.id == clusterID)!; // Add cluster with `clusterID` to the list of assigned clusters. const assign = (clusterID: string) => { @@ -692,7 +691,7 @@ export const _applyPersonSuggestionUpdates = async ( // part of the remote data. Since we're removing it from the remote // state, add it to the local state instead so that the user can see // it in their saved choices (local only). - localClusters.push(ensure(cluster)); + localClusters.push(cluster!); } }; diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index d9270ce911..1e91c974b6 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -6,7 +6,6 @@ import { ensureAuthToken } from "@/base/local-user"; import log from "@/base/log"; import type { ElectronMLWorker } from "@/base/types/ipc"; import { fileLogID, type EnteFile } from "@/media/file"; -import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { expose, wrap } from "comlink"; import downloadManager from "../download"; @@ -207,7 +206,7 @@ export class MLWorker { * Find {@link CLIPMatches} for a given normalized {@link searchPhrase}. */ async clipMatches(searchPhrase: string): Promise { - return _clipMatches(searchPhrase, ensure(this.electron)); + return _clipMatches(searchPhrase, this.electron!); } private async tick() { @@ -241,7 +240,7 @@ export class MLWorker { // Index them. const allSuccess = await indexNextBatch( items, - ensure(this.electron), + this.electron!, this.delegate, ); if (allSuccess) { @@ -284,7 +283,7 @@ export class MLWorker { /** Return the next batch of items to backfill (if any). */ private async backfillQ() { - const userID = ensure(await getKVN("userID")); + const userID = (await getKVN("userID"))!; // Find files that our local DB thinks need syncing. const fileByID = await syncWithLocalFilesAndGetFilesToIndex( userID, @@ -392,7 +391,7 @@ const indexNextBatch = async ( .catch(() => { allSuccess = false; tasks[j] = undefined; - }))(ensure(items[i++]), j); + }))(items[i++]!, j); } } @@ -450,9 +449,7 @@ const syncWithLocalFilesAndGetFilesToIndex = async ( ); const fileIDsToIndex = await getIndexableFileIDs(count); - return new Map( - fileIDsToIndex.map((id) => [id, ensure(localFileByID.get(id))]), - ); + return new Map(fileIDsToIndex.map((id) => [id, localFileByID.get(id)!])); }; /** diff --git a/web/packages/new/photos/services/search/worker.ts b/web/packages/new/photos/services/search/worker.ts index d4d4667062..323d50d33f 100644 --- a/web/packages/new/photos/services/search/worker.ts +++ b/web/packages/new/photos/services/search/worker.ts @@ -3,7 +3,6 @@ import type { Location } from "@/base/types"; import type { Collection } from "@/media/collection"; import type { EnteFile } from "@/media/file"; import { fileCreationPhotoDate, fileLocation } from "@/media/file-metadata"; -import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { getPublicMagicMetadataSync } from "@ente/shared/file-metadata"; import type { Component } from "chrono-node"; @@ -470,7 +469,6 @@ const sortMatchesIfNeeded = ( ) => { if (suggestion.type != "clip") return files; // Sort CLIP matches by their corresponding scores. - const score = ({ id }: EnteFile) => - ensure(suggestion.clipScoreForFileID.get(id)); + const score = ({ id }: EnteFile) => suggestion.clipScoreForFileID.get(id)!; return files.sort((a, b) => score(b) - score(a)); }; diff --git a/web/packages/new/photos/services/user-entity/remote.ts b/web/packages/new/photos/services/user-entity/remote.ts index c7c02c170f..59715218f8 100644 --- a/web/packages/new/photos/services/user-entity/remote.ts +++ b/web/packages/new/photos/services/user-entity/remote.ts @@ -2,7 +2,6 @@ import { decryptBlob } from "@/base/crypto"; import type { EncryptedBlobB64 } from "@/base/crypto/types"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { apiURL } from "@/base/origins"; -import { ensure } from "@/utils/ensure"; import { z } from "zod"; import type { EntityType } from "."; @@ -140,7 +139,7 @@ export const userEntityDiff = async ( async ({ id, encryptedData, header, isDeleted, updatedAt }) => ({ id, data: !isDeleted - ? await decrypt(ensure(encryptedData), ensure(header)) + ? await decrypt(encryptedData!, header!) : undefined, updatedAt, }), diff --git a/web/packages/new/photos/types/context.ts b/web/packages/new/photos/types/context.ts index dfc2638286..903eee593f 100644 --- a/web/packages/new/photos/types/context.ts +++ b/web/packages/new/photos/types/context.ts @@ -1,5 +1,4 @@ import type { AccountsContextT } from "@/accounts/types/context"; -import { ensure } from "@/utils/ensure"; import { THEME_COLOR } from "@ente/shared/themes/constants"; import { createContext, useContext } from "react"; import type { SetNotificationAttributes } from "./notification"; @@ -42,4 +41,4 @@ export const AppContext = createContext(undefined); * This context is provided at the top level _app component for the photos app, * and thus is available to all React components in the Photos app's React tree. */ -export const useAppContext = (): AppContextT => ensure(useContext(AppContext)); +export const useAppContext = (): AppContextT => useContext(AppContext)!; diff --git a/web/packages/shared/utils/index.ts b/web/packages/shared/utils/index.ts index fd372fd7cf..878f2d66f8 100644 --- a/web/packages/shared/utils/index.ts +++ b/web/packages/shared/utils/index.ts @@ -1,4 +1,3 @@ -import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; export async function retryAsyncFunction( @@ -25,7 +24,7 @@ export async function retryAsyncFunction( if (attemptNumber === waitTimeBeforeNextTry.length) { throw e; } - await wait(ensure(waitTimeBeforeNextTry[attemptNumber])); + await wait(waitTimeBeforeNextTry[attemptNumber]!); } } } diff --git a/web/packages/shared/utils/queueProcessor.ts b/web/packages/shared/utils/queueProcessor.ts index 15daf069d6..0661e34533 100644 --- a/web/packages/shared/utils/queueProcessor.ts +++ b/web/packages/shared/utils/queueProcessor.ts @@ -1,5 +1,3 @@ -import { ensure } from "@/utils/ensure"; - interface RequestQueueItem { request: (canceller?: RequestCanceller) => Promise; successCallback: (response: any) => void; @@ -50,7 +48,7 @@ export default class QueueProcessor { this.isProcessingRequest = true; while (this.requestQueue.length > 0) { - const queueItem = ensure(this.requestQueue.shift()); + const queueItem = this.requestQueue.shift()!; let response = null; if (queueItem.isCanceled.status) { From 24b9e629c1c0c0d44d892a3b0b7f2b10ca339797 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 18:18:18 +0530 Subject: [PATCH 64/75] Cont --- .../photos/src/components/FixCreationTime.tsx | 5 ++--- .../PhotoViewer/ImageEditorOverlay/index.tsx | 9 ++++---- .../photos/src/components/Upload/Uploader.tsx | 21 +++++++------------ .../photos/src/components/WatchFolder.tsx | 3 +-- web/apps/photos/src/pages/gallery.tsx | 3 +-- .../photos/src/services/upload/thumbnail.ts | 7 +++---- .../src/services/upload/uploadManager.ts | 19 +++++++---------- web/apps/photos/src/utils/photoFrame/index.ts | 9 ++++---- .../accounts/components/RecoveryKey.tsx | 3 +-- web/packages/accounts/pages/change-email.tsx | 3 +-- .../accounts/pages/change-password.tsx | 5 ++--- web/packages/accounts/services/passkey.ts | 3 +-- web/packages/accounts/services/session.ts | 3 +-- .../photos/components/CollectionSelector.tsx | 5 ++--- .../new/photos/components/PlanSelector.tsx | 8 ++----- .../new/photos/components/gallery/BarImpl.tsx | 11 +++++----- .../new/photos/components/gallery/reducer.ts | 19 ++++++++--------- web/packages/new/photos/services/download.ts | 18 +++++++--------- web/packages/new/photos/services/ml/blob.ts | 7 +++---- .../new/photos/services/user-details.ts | 3 +-- 20 files changed, 65 insertions(+), 99 deletions(-) diff --git a/web/apps/photos/src/components/FixCreationTime.tsx b/web/apps/photos/src/components/FixCreationTime.tsx index 91ea1ecb90..6bb9b16d43 100644 --- a/web/apps/photos/src/components/FixCreationTime.tsx +++ b/web/apps/photos/src/components/FixCreationTime.tsx @@ -12,7 +12,6 @@ import { FileType } from "@/media/file-type"; import { PhotoDateTimePicker } from "@/new/photos/components/PhotoDateTimePicker"; import downloadManager from "@/new/photos/services/download"; import { extractExifDates } from "@/new/photos/services/exif"; -import { ensure } from "@/utils/ensure"; import { Box, Dialog, @@ -318,11 +317,11 @@ const updateEnteFileDate = async ( if (fixOption == "custom") { newDate = { - dateTime: ensure(customDate).dateTime, + dateTime: customDate!.dateTime, // See [Note: Don't modify offsetTime when editing date via picker] // for why we don't also set the offset here. offset: undefined, - timestamp: ensure(customDate).timestamp, + timestamp: customDate!.timestamp, }; } else if (enteFile.metadata.fileType == FileType.image) { const stream = await downloadManager.getFile(enteFile); diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx index 248976a57b..c5aab81f81 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx @@ -12,7 +12,6 @@ import { EnteFile } from "@/media/file"; import { photosDialogZIndex } from "@/new/photos/components/utils/z-index"; import downloadManager from "@/new/photos/services/download"; import { AppContext } from "@/new/photos/types/context"; -import { ensure } from "@/utils/ensure"; import { CenteredFlex, HorizontalFlex, @@ -453,7 +452,7 @@ const ImageEditorOverlay = (props: IProps) => { } const getEditedFile = async () => { - const originalSizeCanvas = ensure(originalSizeCanvasRef.current); + const originalSizeCanvas = originalSizeCanvasRef.current!; const originalFileName = props.file.metadata.title; return canvasToFile(originalSizeCanvas, originalFileName, mimeType); }; @@ -777,9 +776,9 @@ const canvasToFile = async ( break; } - const blob = ensure( - await new Promise((resolve) => canvas.toBlob(resolve, mimeType)), - ); + const blob = (await new Promise((resolve) => + canvas.toBlob(resolve, mimeType), + ))!; const [originalName] = nameAndExtension(originalFileName); const fileName = `${originalName}-edited.${extension}`; diff --git a/web/apps/photos/src/components/Upload/Uploader.tsx b/web/apps/photos/src/components/Upload/Uploader.tsx index 7b0e0e2378..e5acb2f6d4 100644 --- a/web/apps/photos/src/components/Upload/Uploader.tsx +++ b/web/apps/photos/src/components/Upload/Uploader.tsx @@ -18,7 +18,6 @@ import { redirectToCustomerPortal } from "@/new/photos/services/user-details"; import { useAppContext } from "@/new/photos/types/context"; import { NotificationAttributes } from "@/new/photos/types/notification"; import { firstNonEmpty } from "@/utils/array"; -import { ensure } from "@/utils/ensure"; import { CustomError } from "@ente/shared/error"; import DiscFullIcon from "@mui/icons-material/DiscFull"; import InfoOutlined from "@mui/icons-material/InfoRounded"; @@ -853,17 +852,13 @@ const desktopFilesAndZipItems = async (electron: Electron, files: File[]) => { * https://github.com/react-dropzone/file-selector/blob/master/src/file.ts#L1214 */ const pathLikeForWebFile = (file: File): string => - ensure( - firstNonEmpty([ - // We need to check first, since path is not a property of - // the standard File objects. - "path" in file && typeof file.path == "string" - ? file.path - : undefined, - file.webkitRelativePath, - file.name, - ]), - ); + firstNonEmpty([ + // We need to check first, since path is not a property of + // the standard File objects. + "path" in file && typeof file.path == "string" ? file.path : undefined, + file.webkitRelativePath, + file.name, + ])!; // This is used to prompt the user the make upload strategy choice interface ImportSuggestion { @@ -889,7 +884,7 @@ function getImportSuggestion( const separatorCounts = new Map( paths.map((s) => [s, s.match(/\//g)?.length ?? 0]), ); - const separatorCount = (s: string) => ensure(separatorCounts.get(s)); + const separatorCount = (s: string) => separatorCounts.get(s)!; paths.sort((path1, path2) => separatorCount(path1) - separatorCount(path2)); const firstPath = paths[0]; const lastPath = paths[paths.length - 1]; diff --git a/web/apps/photos/src/components/WatchFolder.tsx b/web/apps/photos/src/components/WatchFolder.tsx index 0446509b2e..f8b75086ee 100644 --- a/web/apps/photos/src/components/WatchFolder.tsx +++ b/web/apps/photos/src/components/WatchFolder.tsx @@ -9,7 +9,6 @@ import type { CollectionMapping, FolderWatch } from "@/base/types/ipc"; import { CollectionMappingChoiceDialog } from "@/new/photos/components/CollectionMappingChoiceDialog"; import { DialogCloseIconButton } from "@/new/photos/components/mui/Dialog"; import { AppContext, useAppContext } from "@/new/photos/types/context"; -import { ensure } from "@/utils/ensure"; import { FlexWrapper, HorizontalFlex, @@ -109,7 +108,7 @@ export const WatchFolder: React.FC = ({ const handleCollectionMappingSelect = (mapping: CollectionMapping) => { setSavedFolderPath(undefined); - addWatch(ensure(savedFolderPath), mapping); + addWatch(savedFolderPath!, mapping); }; return ( diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index f6deba1397..e929aa6707 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -55,7 +55,6 @@ import { } from "@/new/photos/services/user-details"; import { useAppContext } from "@/new/photos/types/context"; import { splitByPredicate } from "@/utils/array"; -import { ensure } from "@/utils/ensure"; import { CenteredFlex, FlexWrapper, @@ -512,7 +511,7 @@ export default function Gallery() { } : { mode: barMode as "albums" | "hidden-albums", - collectionID: ensure(activeCollectionID), + collectionID: activeCollectionID!, }, }; diff --git a/web/apps/photos/src/services/upload/thumbnail.ts b/web/apps/photos/src/services/upload/thumbnail.ts index a768a04622..281a91fa52 100644 --- a/web/apps/photos/src/services/upload/thumbnail.ts +++ b/web/apps/photos/src/services/upload/thumbnail.ts @@ -8,7 +8,6 @@ import { toDataOrPathOrZipEntry, type DesktopUploadItem, } from "@/new/photos/services/upload/types"; -import { ensure } from "@/utils/ensure"; import { withTimeout } from "@/utils/promise"; /** Maximum width or height of the generated thumbnail */ @@ -70,7 +69,7 @@ const generateImageThumbnailWeb = async ( const generateImageThumbnailUsingCanvas = async (blob: Blob) => { const canvas = document.createElement("canvas"); - const canvasCtx = ensure(canvas.getContext("2d")); + const canvasCtx = canvas.getContext("2d")!; const imageURL = URL.createObjectURL(blob); await withTimeout( @@ -118,7 +117,7 @@ const compressedJPEGData = async (canvas: HTMLCanvasElement) => { percentageSizeDiff(blob.size, prevSize) >= 10 ); - return new Uint8Array(await ensure(blob).arrayBuffer()); + return new Uint8Array(await blob!.arrayBuffer()); }; const percentageSizeDiff = ( @@ -140,7 +139,7 @@ const generateVideoThumbnailWeb = async (blob: Blob) => { export const generateVideoThumbnailUsingCanvas = async (blob: Blob) => { const canvas = document.createElement("canvas"); - const canvasCtx = ensure(canvas.getContext("2d")); + const canvasCtx = canvas.getContext("2d")!; const videoURL = URL.createObjectURL(blob); await withTimeout( diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 12ddef9ee2..cb733f7a5c 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -18,7 +18,6 @@ import { UPLOAD_RESULT, type UploadPhase, } from "@/new/photos/services/upload/types"; -import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { CustomError } from "@ente/shared/error"; import { Canceler } from "axios"; @@ -514,9 +513,7 @@ class UploadManager { this.abortIfCancelled(); log.info(`Parsing metadata JSON ${fileName}`); - const metadataJSON = await tryParseTakeoutMetadataJSON( - ensure(uploadItem), - ); + const metadataJSON = await tryParseTakeoutMetadataJSON(uploadItem!); if (metadataJSON) { this.parsedMetadataJSONMap.set( getMetadataJSONMapKeyForJSON(collectionID, fileName), @@ -757,13 +754,11 @@ type UploadItemWithCollectionIDAndName = UploadAsset & { const makeUploadItemWithCollectionIDAndName = ( f: UploadItemWithCollection, ): UploadItemWithCollectionIDAndName => ({ - localID: ensure(f.localID), - collectionID: ensure(f.collectionID), - fileName: ensure( - f.isLivePhoto - ? uploadItemFileName(f.livePhotoAssets.image) - : uploadItemFileName(f.uploadItem), - ), + localID: f.localID!, + collectionID: f.collectionID!, + fileName: (f.isLivePhoto + ? uploadItemFileName(f.livePhotoAssets.image) + : uploadItemFileName(f.uploadItem))!, isLivePhoto: f.isLivePhoto, uploadItem: f.uploadItem, livePhotoAssets: f.livePhotoAssets, @@ -835,7 +830,7 @@ const markUploaded = async (electron: Electron, item: ClusteredUploadItem) => { ); } } else { - const p = ensure(item.uploadItem); + const p = item.uploadItem!; if (Array.isArray(p)) { electron.markUploadedZipItems([p]); } else if (typeof p == "string") { diff --git a/web/apps/photos/src/utils/photoFrame/index.ts b/web/apps/photos/src/utils/photoFrame/index.ts index 651848f1d9..3665478a05 100644 --- a/web/apps/photos/src/utils/photoFrame/index.ts +++ b/web/apps/photos/src/utils/photoFrame/index.ts @@ -4,7 +4,6 @@ import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import type { SelectionContext } from "@/new/photos/components/gallery"; import type { GalleryBarMode } from "@/new/photos/components/gallery/reducer"; -import { ensure } from "@/utils/ensure"; import { SetSelectedState } from "types/gallery"; export async function playVideo(livePhotoVideo, livePhotoImage) { @@ -137,10 +136,10 @@ export const handleSelectCreator = ...selected, context: mode == "people" - ? { mode, personID: ensure(activePersonID) } + ? { mode, personID: activePersonID! } : { mode, - collectionID: ensure(activeCollectionID), + collectionID: activeCollectionID!, }, }; } else { @@ -153,10 +152,10 @@ export const handleSelectCreator = collectionID: 0, context: mode == "people" - ? { mode, personID: ensure(activePersonID) } + ? { mode, personID: activePersonID! } : { mode, - collectionID: ensure(activeCollectionID), + collectionID: activeCollectionID!, }, }; } else { diff --git a/web/packages/accounts/components/RecoveryKey.tsx b/web/packages/accounts/components/RecoveryKey.tsx index 3b26ff969c..ba5e4f4e64 100644 --- a/web/packages/accounts/components/RecoveryKey.tsx +++ b/web/packages/accounts/components/RecoveryKey.tsx @@ -7,7 +7,6 @@ import { useIsSmallWidth } from "@/base/hooks"; import log from "@/base/log"; import { downloadString } from "@/base/utils/web"; import { DialogCloseIconButton } from "@/new/photos/components/mui/Dialog"; -import { ensure } from "@/utils/ensure"; import CodeBlock from "@ente/shared/components/CodeBlock"; import { getRecoveryKey } from "@ente/shared/crypto/helpers"; import { @@ -58,7 +57,7 @@ export const RecoveryKey: React.FC = ({ }, [open, handleLoadError]); const handleSaveClick = () => { - downloadRecoveryKeyMnemonic(ensure(recoveryKey)); + downloadRecoveryKeyMnemonic(recoveryKey!); onClose(); }; diff --git a/web/packages/accounts/pages/change-email.tsx b/web/packages/accounts/pages/change-email.tsx index f60f96f6d0..94b182e01a 100644 --- a/web/packages/accounts/pages/change-email.tsx +++ b/web/packages/accounts/pages/change-email.tsx @@ -5,7 +5,6 @@ import { FormPaperTitle, } from "@/base/components/FormPaper"; import { LoadingButton } from "@/base/components/mui/LoadingButton"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import { LS_KEYS, getData, setLSUser } from "@ente/shared/storage/localStorage"; @@ -81,7 +80,7 @@ const ChangeEmailForm: React.FC = () => { ) => { try { setLoading(true); - await changeEmail(email, ensure(ott)); + await changeEmail(email, ott!); await setLSUser({ ...getData(LS_KEYS.USER), email }); setLoading(false); goToApp(); diff --git a/web/packages/accounts/pages/change-password.tsx b/web/packages/accounts/pages/change-password.tsx index a8750be29f..54870dcd3c 100644 --- a/web/packages/accounts/pages/change-password.tsx +++ b/web/packages/accounts/pages/change-password.tsx @@ -19,7 +19,6 @@ import { FormPaperTitle, } from "@/base/components/FormPaper"; import { sharedCryptoWorker } from "@/base/crypto"; -import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; import { @@ -94,7 +93,7 @@ const Page: React.FC = () => { const srpA = convertBufferToBase64(srpClient.computeA()); - const { setupID, srpB } = await startSRPSetup(ensure(token), { + const { setupID, srpB } = await startSRPSetup(token!, { srpUserID, srpSalt, srpVerifier, @@ -105,7 +104,7 @@ const Page: React.FC = () => { const srpM1 = convertBufferToBase64(srpClient.computeM1()); - await updateSRPAndKeys(ensure(token), { + await updateSRPAndKeys(token!, { setupID, srpM1, updatedKeyAttr: updatedKey, diff --git a/web/packages/accounts/services/passkey.ts b/web/packages/accounts/services/passkey.ts index ac68f470b0..a15b5ec0a9 100644 --- a/web/packages/accounts/services/passkey.ts +++ b/web/packages/accounts/services/passkey.ts @@ -5,7 +5,6 @@ import { clientPackageHeader, HTTPError } from "@/base/http"; import log from "@/base/log"; import { accountsAppOrigin, apiURL } from "@/base/origins"; import { TwoFactorAuthorizationResponse } from "@/base/types/credentials"; -import { ensure } from "@/utils/ensure"; import { getRecoveryKey } from "@ente/shared/crypto/helpers"; import HTTPService from "@ente/shared/network/HTTPService"; import { @@ -263,7 +262,7 @@ export const saveCredentialsAndNavigateTo = async ( encryptedToken, id, }); - setData(LS_KEYS.KEY_ATTRIBUTES, ensure(keyAttributes)); + setData(LS_KEYS.KEY_ATTRIBUTES, keyAttributes!); return unstashRedirect() ?? "/credentials"; }; diff --git a/web/packages/accounts/services/session.ts b/web/packages/accounts/services/session.ts index 77389e6d02..0830ab923b 100644 --- a/web/packages/accounts/services/session.ts +++ b/web/packages/accounts/services/session.ts @@ -1,7 +1,6 @@ import { authenticatedRequestHeaders, HTTPError } from "@/base/http"; import { ensureLocalUser } from "@/base/local-user"; import { apiURL } from "@/base/origins"; -import { ensure } from "@/utils/ensure"; import { getData, LS_KEYS } from "@ente/shared/storage/localStorage"; import type { KeyAttributes } from "@ente/shared/user/types"; import type { SRPAttributes } from "../api/srp"; @@ -86,7 +85,7 @@ export const checkSessionValidity = async (): Promise => { // We should have these values locally if we reach here. const email = ensureLocalUser().email; - const localSRPAttributes = ensure(getData(LS_KEYS.SRP_ATTRIBUTES)); + const localSRPAttributes = getData(LS_KEYS.SRP_ATTRIBUTES)!; // Fetch the remote SRP attributes. // diff --git a/web/packages/new/photos/components/CollectionSelector.tsx b/web/packages/new/photos/components/CollectionSelector.tsx index 3619b3ab0a..cbbdec0311 100644 --- a/web/packages/new/photos/components/CollectionSelector.tsx +++ b/web/packages/new/photos/components/CollectionSelector.tsx @@ -14,7 +14,6 @@ import { type CollectionSummaries, type CollectionSummary, } from "@/new/photos/services/collection/ui"; -import { ensure } from "@/utils/ensure"; import { Dialog, DialogContent, @@ -126,8 +125,8 @@ export const CollectionSelector: React.FC = ({ }) .sort((a, b) => { return ( - ensure(CollectionSummaryOrder.get(a.type)) - - ensure(CollectionSummaryOrder.get(b.type)) + CollectionSummaryOrder.get(a.type)! - + CollectionSummaryOrder.get(b.type)! ); }); diff --git a/web/packages/new/photos/components/PlanSelector.tsx b/web/packages/new/photos/components/PlanSelector.tsx index 5f8061897f..5d43857d60 100644 --- a/web/packages/new/photos/components/PlanSelector.tsx +++ b/web/packages/new/photos/components/PlanSelector.tsx @@ -32,7 +32,6 @@ import { import { useAppContext } from "@/new/photos/types/context"; import { bytesInGB, formattedStorageByteSize } from "@/new/photos/utils/units"; import { openURL } from "@/new/photos/utils/web"; -import { ensure } from "@/utils/ensure"; import { FlexWrapper, FluidContainer, @@ -158,7 +157,7 @@ const PlanSelectorCard: React.FC = ({ case "buyPlan": try { setLoading(true); - await redirectToPaymentsApp(ensure(plan.stripeID), "buy"); + await redirectToPaymentsApp(plan.stripeID!, "buy"); } catch (e) { setLoading(false); showMiniDialog( @@ -176,10 +175,7 @@ const PlanSelectorCard: React.FC = ({ continue: { text: t("update_subscription"), action: () => - redirectToPaymentsApp( - ensure(plan.stripeID), - "update", - ), + redirectToPaymentsApp(plan.stripeID!, "update"), }, }); break; diff --git a/web/packages/new/photos/components/gallery/BarImpl.tsx b/web/packages/new/photos/components/gallery/BarImpl.tsx index 29c9d7987c..7d4875f32c 100644 --- a/web/packages/new/photos/components/gallery/BarImpl.tsx +++ b/web/packages/new/photos/components/gallery/BarImpl.tsx @@ -18,7 +18,6 @@ import type { CollectionsSortBy, } from "@/new/photos/services/collection/ui"; import type { Person } from "@/new/photos/services/ml/people"; -import { ensure } from "@/utils/ensure"; import ArchiveIcon from "@mui/icons-material/Archive"; import ExpandMore from "@mui/icons-material/ExpandMore"; import Favorite from "@mui/icons-material/FavoriteRounded"; @@ -201,7 +200,7 @@ export const GalleryBarImpl: React.FC = ({ ? { type: "collections", collectionSummaries, - activeCollectionID: ensure(activeCollectionID), + activeCollectionID: activeCollectionID!, onSelectCollectionID, } : { @@ -439,11 +438,11 @@ const getItemCount = (data: ItemData) => { const getItemKey = (index: number, data: ItemData) => { switch (data.type) { case "collections": { - const collectionSummary = ensure(data.collectionSummaries[index]); + const collectionSummary = data.collectionSummaries[index]!; return `${data.type}-${collectionSummary.id}-${collectionSummary.coverFile?.id}`; } case "people": { - const person = ensure(data.people[index]); + const person = data.people[index]!; return `${data.type}-${person.id}-${person.displayFaceID}`; } } @@ -461,7 +460,7 @@ const ListItem = memo((props: ListChildComponentProps) => { activeCollectionID, onSelectCollectionID, } = data; - const collectionSummary = ensure(collectionSummaries[index]); + const collectionSummary = collectionSummaries[index]!; card = ( ) => { case "people": { const { people, activePerson, onSelectPerson } = data; - const person = ensure(people[index]); + const person = people[index]!; card = ( = ( action.collections.concat(state.hiddenCollections), ), collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, action.collections, state.files, state.trashedFiles, @@ -464,14 +463,14 @@ const galleryReducer: React.Reducer = ( action.collections.concat(action.hiddenCollections), ), collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, action.collections, state.files, state.trashedFiles, archivedCollectionIDs, ), hiddenCollectionSummaries: deriveHiddenCollectionSummaries( - ensure(state.user), + state.user!, action.hiddenCollections, state.hiddenFiles, ), @@ -488,7 +487,7 @@ const galleryReducer: React.Reducer = ( ), fileCollectionIDs: createFileCollectionIDs(action.files), collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, state.collections, files, state.trashedFiles, @@ -511,7 +510,7 @@ const galleryReducer: React.Reducer = ( ), fileCollectionIDs: createFileCollectionIDs(action.files), collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, state.collections, files, state.trashedFiles, @@ -532,7 +531,7 @@ const galleryReducer: React.Reducer = ( // TODO: Consider batching this instead of doing it per file // upload to speed up uploads. Perf test first though. collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, state.collections, files, state.trashedFiles, @@ -547,7 +546,7 @@ const galleryReducer: React.Reducer = ( hiddenFiles, hiddenFileIDs: deriveHiddenFileIDs(hiddenFiles), hiddenCollectionSummaries: deriveHiddenCollectionSummaries( - ensure(state.user), + state.user!, state.hiddenCollections, hiddenFiles, ), @@ -567,7 +566,7 @@ const galleryReducer: React.Reducer = ( hiddenFiles, hiddenFileIDs: deriveHiddenFileIDs(hiddenFiles), hiddenCollectionSummaries: deriveHiddenCollectionSummaries( - ensure(state.user), + state.user!, state.hiddenCollections, hiddenFiles, ), @@ -578,7 +577,7 @@ const galleryReducer: React.Reducer = ( ...state, trashedFiles: action.trashedFiles, collectionSummaries: deriveCollectionSummaries( - ensure(state.user), + state.user!, state.collections, state.files, action.trashedFiles, diff --git a/web/packages/new/photos/services/download.ts b/web/packages/new/photos/services/download.ts index 2da7a4c5e7..5973c5f0ff 100644 --- a/web/packages/new/photos/services/download.ts +++ b/web/packages/new/photos/services/download.ts @@ -12,7 +12,6 @@ import { FileType } from "@/media/file-type"; import { decodeLivePhoto } from "@/media/live-photo"; import * as ffmpeg from "@/new/photos/services/ffmpeg"; import { renderableImageBlob } from "@/new/photos/utils/file"; -import { ensure } from "@/utils/ensure"; import { CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import { retryAsyncFunction } from "@ente/shared/utils"; @@ -90,8 +89,8 @@ class DownloadManagerImpl { ); return { - downloadClient: ensure(this.downloadClient), - cryptoWorker: ensure(this.cryptoWorker), + downloadClient: this.downloadClient!, + cryptoWorker: this.cryptoWorker!, }; } @@ -200,9 +199,8 @@ class DownloadManagerImpl { // TODO: Is this ensure valid? // The existing code was already dereferencing, so it shouldn't // affect behaviour. - const { url: originalFileURL } = ensure( - await this.fileObjectURLPromises.get(file.id), - ); + const { url: originalFileURL } = + (await this.fileObjectURLPromises.get(file.id))!; const converted = await getRenderableFileURL( file, @@ -255,9 +253,7 @@ class DownloadManagerImpl { // TODO: Is this ensure valid? // The existing code was already dereferencing, so it shouldn't // affect behaviour. - const fileURLs = ensure( - await this.fileObjectURLPromises.get(file.id), - ); + const fileURLs = (await this.fileObjectURLPromises.get(file.id))!; if (fileURLs.isOriginal) { const fileStream = (await fetch(fileURLs.url as string)).body; return fileStream; @@ -515,8 +511,8 @@ async function getRenderableFileURL( } } - // TODO: Can we remove this ensure and reflect it in the types? - return { url: ensure(url), isOriginal, isRenderable, type, mimeType }; + // TODO: Can we remove this non-null assertion and reflect it in the types? + return { url: url!, isOriginal, isRenderable, type, mimeType }; } async function getRenderableLivePhotoURL( diff --git a/web/packages/new/photos/services/ml/blob.ts b/web/packages/new/photos/services/ml/blob.ts index 234a030172..380c7bfa0d 100644 --- a/web/packages/new/photos/services/ml/blob.ts +++ b/web/packages/new/photos/services/ml/blob.ts @@ -3,7 +3,6 @@ import type { ElectronMLWorker } from "@/base/types/ipc"; import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { decodeLivePhoto } from "@/media/live-photo"; -import { ensure } from "@/utils/ensure"; import { renderableImageBlob } from "../../utils/file"; import { readStream } from "../../utils/native-stream"; import DownloadManager from "../download"; @@ -44,7 +43,7 @@ export const createImageBitmapAndData = async ( // Use an OffscreenCanvas to get the bitmap's data. const offscreenCanvas = new OffscreenCanvas(width, height); - const ctx = ensure(offscreenCanvas.getContext("2d")); + const ctx = offscreenCanvas.getContext("2d")!; ctx.drawImage(imageBitmap, 0, 0, width, height); const imageData = ctx.getImageData(0, 0, width, height); @@ -93,7 +92,7 @@ const fetchRenderableUploadItemBlob = async ( const fileType = file.metadata.fileType; if (fileType == FileType.video) { const thumbnailData = await DownloadManager.getThumbnail(file); - return new Blob([ensure(thumbnailData)]); + return new Blob([thumbnailData!]); } else { const blob = await readNonVideoUploadItem(uploadItem, electron); return renderableImageBlob(file.metadata.title, blob); @@ -148,7 +147,7 @@ export const fetchRenderableEnteFileBlob = async ( const fileType = file.metadata.fileType; if (fileType == FileType.video) { const thumbnailData = await DownloadManager.getThumbnail(file); - return new Blob([ensure(thumbnailData)]); + return new Blob([thumbnailData!]); } const fileStream = await DownloadManager.getFile(file); diff --git a/web/packages/new/photos/services/user-details.ts b/web/packages/new/photos/services/user-details.ts index f3d9dfc13f..29716d1b03 100644 --- a/web/packages/new/photos/services/user-details.ts +++ b/web/packages/new/photos/services/user-details.ts @@ -1,7 +1,6 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKV, setKV } from "@/base/kv"; import { apiURL, familyAppOrigin, paymentsAppOrigin } from "@/base/origins"; -import { ensure } from "@/utils/ensure"; import { nullishToEmpty, nullishToZero, @@ -336,7 +335,7 @@ export const verifyStripeSubscription = async ( }), ); await syncUserDetails(); - return ensure(userDetailsSnapshot()?.subscription); + return userDetailsSnapshot()!.subscription; }; /** From ebd550505fd8819a74ff9f577f5490d815f93741 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 18:32:51 +0530 Subject: [PATCH 65/75] Cont --- web/packages/shared/themes/palette.tsx | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/web/packages/shared/themes/palette.tsx b/web/packages/shared/themes/palette.tsx index 004d06b4cb..f7c6a7d9bb 100644 --- a/web/packages/shared/themes/palette.tsx +++ b/web/packages/shared/themes/palette.tsx @@ -1,4 +1,3 @@ -import { ensure } from "@/utils/ensure"; import type { PaletteOptions, ThemeColorsOptions } from "@mui/material"; import { THEME_COLOR } from "./constants"; @@ -21,24 +20,33 @@ export const getPalletteOptions = ( ): PaletteOptions => { return { primary: { - // TODO: Refactor this code to not require this ensure - main: ensure(colors.fill?.base), + // See: [Note: strict mode migration] + // + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: colors.fill.base, dark: colors.fill?.basePressed, contrastText: themeColor === "dark" ? colors.black?.base : colors.white?.base, }, secondary: { - main: ensure(colors.fill?.faint), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: colors.fill.faint, dark: colors.fill?.faintPressed, contrastText: colors.text?.base, }, accent: { - main: ensure(colors.accent?.A500), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: colors.accent.A500, dark: colors.accent?.A700, contrastText: colors.white?.base, }, critical: { - main: ensure(colors.danger?.A700), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: colors.danger.A700, dark: colors.danger?.A800, contrastText: colors.white?.base, }, From ebbca2b609f751840ab55458300f0791b2398c8f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 18:37:30 +0530 Subject: [PATCH 66/75] Fin --- .../photos/src/services/upload/upload-service.ts | 4 ++-- web/apps/photos/src/utils/photoFrame/index.ts | 8 ++++---- web/packages/base/local-user.ts | 7 +++++-- web/packages/utils/ensure.ts | 14 -------------- 4 files changed, 11 insertions(+), 22 deletions(-) diff --git a/web/apps/photos/src/services/upload/upload-service.ts b/web/apps/photos/src/services/upload/upload-service.ts index c08a08ad60..6afe1e02db 100644 --- a/web/apps/photos/src/services/upload/upload-service.ts +++ b/web/apps/photos/src/services/upload/upload-service.ts @@ -38,7 +38,7 @@ import { import { detectFileTypeInfoFromChunk } from "@/new/photos/utils/detect-type"; import { readStream } from "@/new/photos/utils/native-stream"; import { mergeUint8Arrays } from "@/utils/array"; -import { ensure, ensureInteger, ensureNumber } from "@/utils/ensure"; +import { ensureInteger, ensureNumber } from "@/utils/ensure"; import { CustomError, handleUploadError } from "@ente/shared/error"; import { addToCollection } from "services/collectionService"; import { @@ -857,7 +857,7 @@ const readImageOrVideoDetails = async (uploadItem: UploadItem) => { const fileTypeInfo = await detectFileTypeInfoFromChunk(async () => { const reader = stream.getReader(); - const chunk = ensure((await reader.read()).value); + const chunk = (await reader.read())!.value; await reader.cancel(); return chunk; }, uploadItemFileName(uploadItem)); diff --git a/web/apps/photos/src/utils/photoFrame/index.ts b/web/apps/photos/src/utils/photoFrame/index.ts index 3665478a05..8d752d1bd8 100644 --- a/web/apps/photos/src/utils/photoFrame/index.ts +++ b/web/apps/photos/src/utils/photoFrame/index.ts @@ -168,7 +168,7 @@ export const handleSelectCreator = collectionID: 0, context: { mode: selected.context?.mode, - personID: ensure(activePersonID), + personID: activePersonID!, }, }; } @@ -183,7 +183,7 @@ export const handleSelectCreator = collectionID: 0, context: { mode: selected.context?.mode, - collectionID: ensure(activeCollectionID), + collectionID: activeCollectionID!, }, }; } @@ -194,8 +194,8 @@ export const handleSelectCreator = const newContext: SelectionContext | undefined = !mode ? undefined : mode == "people" - ? { mode, personID: ensure(activePersonID) } - : { mode, collectionID: ensure(activeCollectionID) }; + ? { mode, personID: activePersonID! } + : { mode, collectionID: activeCollectionID! }; const handleCounterChange = (count: number) => { if (selected[id] === checked) { diff --git a/web/packages/base/local-user.ts b/web/packages/base/local-user.ts index 5a3eeafaac..c2a446eb3c 100644 --- a/web/packages/base/local-user.ts +++ b/web/packages/base/local-user.ts @@ -1,6 +1,5 @@ // TODO: This file belongs to the accounts package -import { ensure } from "@/utils/ensure"; import { z } from "zod"; import { getKVS } from "./kv"; @@ -57,4 +56,8 @@ export const ensureLocalUser = (): LocalUser => { * The underlying data is stored in IndexedDB, and can be accessed from web * workers. */ -export const ensureAuthToken = async () => ensure(await getKVS("token")); +export const ensureAuthToken = async () => { + const token = await getKVS("token"); + if (!token) throw new Error("Not logged in"); + return token; +}; diff --git a/web/packages/utils/ensure.ts b/web/packages/utils/ensure.ts index a7508eb8ad..ec31167a68 100644 --- a/web/packages/utils/ensure.ts +++ b/web/packages/utils/ensure.ts @@ -1,17 +1,3 @@ -/** - * Throw an exception if the given value is `null` or `undefined`. - * - * This is different from TypeScript's built in null assertion operator `!` in - * that `ensure` involves a runtime check, and will throw if the given value is - * null-ish. On the other hand the TypeScript null assertion is only an - * indication to the type system and does not involve any runtime checks. - */ -export const ensure = (v: T | null | undefined): T => { - if (v === null) throw new Error("Required value was null"); - if (v === undefined) throw new Error("Required value was undefined"); - return v; -}; - /** * Throw an exception if the given value is not a string. */ From ed5c4dfc7edaca92ba566198c7b36a0e13a970f2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 18:58:48 +0530 Subject: [PATCH 67/75] Unlab --- .../src/components/Sidebar/Preferences.tsx | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/web/apps/photos/src/components/Sidebar/Preferences.tsx b/web/apps/photos/src/components/Sidebar/Preferences.tsx index 459ed53d77..c09b812c93 100644 --- a/web/apps/photos/src/components/Sidebar/Preferences.tsx +++ b/web/apps/photos/src/components/Sidebar/Preferences.tsx @@ -26,8 +26,7 @@ import { import { useAppContext } from "@/new/photos/types/context"; import { EnteMenuItem } from "@ente/shared/components/Menu/EnteMenuItem"; import ChevronRight from "@mui/icons-material/ChevronRight"; -import ScienceIcon from "@mui/icons-material/Science"; -import { Box, Stack } from "@mui/material"; +import { Stack } from "@mui/material"; import DropdownInput from "components/DropdownInput"; import { t } from "i18next"; import React, { useCallback, useEffect } from "react"; @@ -65,6 +64,15 @@ export const Preferences: React.FC = ({ /> + {isMLSupported && ( + + } + onClick={showMLSettings} + label={t("ml_search")} + /> + + )} } @@ -75,21 +83,6 @@ export const Preferences: React.FC = ({ endIcon={} label={t("advanced")} /> - {isMLSupported && ( - - } - /> - - } - onClick={showMLSettings} - label={t("ml_search")} - /> - - - )} Date: Mon, 18 Nov 2024 19:02:14 +0530 Subject: [PATCH 68/75] Always show people section btn on destkop --- .../Collections/GalleryBarAndListHeader.tsx | 2 -- web/apps/photos/src/pages/gallery.tsx | 5 ---- .../new/photos/components/gallery/BarImpl.tsx | 25 ++++++------------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/web/apps/photos/src/components/Collections/GalleryBarAndListHeader.tsx b/web/apps/photos/src/components/Collections/GalleryBarAndListHeader.tsx index 28bc207407..7b1e9bce2c 100644 --- a/web/apps/photos/src/components/Collections/GalleryBarAndListHeader.tsx +++ b/web/apps/photos/src/components/Collections/GalleryBarAndListHeader.tsx @@ -78,7 +78,6 @@ type CollectionsProps = Omit< */ export const GalleryBarAndListHeader: React.FC = ({ shouldHide, - showPeopleSectionButton, mode, onChangeMode, collectionSummaries, @@ -193,7 +192,6 @@ export const GalleryBarAndListHeader: React.FC = ({ <> ; } - // `peopleState` will be undefined only when ML is disabled, otherwise it'll - // be present, with empty arrays, even if people data is still syncing. - const showPeopleSectionButton = peopleState !== undefined; - return ( = ({ - showPeopleSectionButton, mode, onChangeMode, collectionSummaries, @@ -255,9 +251,7 @@ export const GalleryBarImpl: React.FC = ({ sx={people.length ? {} : { borderBlockEndColor: "transparent" }} > - + {controls1} @@ -314,20 +308,17 @@ export const Row2 = styled(Box)` `; const ModeIndicator: React.FC< - Pick< - GalleryBarImplProps, - "showPeopleSectionButton" | "mode" | "onChangeMode" - > -> = ({ showPeopleSectionButton, mode, onChangeMode }) => { + Pick +> = ({ mode, onChangeMode }) => { // Mode switcher is not shown in the hidden albums section. if (mode == "hidden-albums") { return {t("hidden_albums")}; } - // Show the static mode indicator with only the "Albums" title if we have - // not been asked to show the people button (there are no other sections to - // switch to in such a case). - if (!showPeopleSectionButton) { + // Show the static mode indicator with only the "Albums" title if ML is not + // supported on this client (web), since there are no other sections to + // switch to in such a case. + if (!isMLSupported) { return {t("albums")}; } From d5d97d3d6e20a1798b830e88ffb47e5e17d244d1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 19:58:30 +0530 Subject: [PATCH 69/75] Prep --- .../new/photos/components/gallery/index.tsx | 75 +++++++++++++------ .../photos/components/sidebar/MLSettings.tsx | 2 +- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/web/packages/new/photos/components/gallery/index.tsx b/web/packages/new/photos/components/gallery/index.tsx index 2d828fd62f..3209f9da37 100644 --- a/web/packages/new/photos/components/gallery/index.tsx +++ b/web/packages/new/photos/components/gallery/index.tsx @@ -7,8 +7,8 @@ * there. */ +import { CenteredBox } from "@/base/components/mui/Container"; import type { SearchOption } from "@/new/photos/services/search/types"; -import { VerticallyCentered } from "@ente/shared/components/Container"; import { Typography } from "@mui/material"; import { t } from "i18next"; import React from "react"; @@ -46,25 +46,56 @@ export const SearchResultsHeader: React.FC = ({ export const PeopleEmptyState: React.FC = () => { const mlStatus = useMLStatusSnapshot(); - const message = - mlStatus?.phase == "done" - ? t("people_empty_too_few") - : t("syncing_wait"); - - return ( - - - - ); + switch (mlStatus?.phase) { + case "disabled": + return ; + case "done": + return ( + + {t("people_empty_too_few")} + + ); + default: + return ( + + {t("syncing_wait")} + + ); + } }; + +export const PeopleEmptyStateDisabled: React.FC = () => ( + + + +); + +export const PeopleEmptyStateMessage: React.FC = ({ + children, +}) => ( + + + +); diff --git a/web/packages/new/photos/components/sidebar/MLSettings.tsx b/web/packages/new/photos/components/sidebar/MLSettings.tsx index d67b1e028f..cc034cab2b 100644 --- a/web/packages/new/photos/components/sidebar/MLSettings.tsx +++ b/web/packages/new/photos/components/sidebar/MLSettings.tsx @@ -100,7 +100,7 @@ interface EnableMLProps { onEnable: () => void; } -const EnableML: React.FC = ({ onEnable }) => { +export const EnableML: React.FC = ({ onEnable }) => { const moreDetails = () => openURL("https://help.ente.io/photos/features/machine-learning"); From 0024ee5b77af5bf8ab2fbd1e69b70b728b47fc3f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 20:10:48 +0530 Subject: [PATCH 70/75] wip checkpoint --- .../new/photos/components/gallery/index.tsx | 55 +++++++++++++------ .../photos/components/sidebar/MLSettings.tsx | 21 +++++-- 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/web/packages/new/photos/components/gallery/index.tsx b/web/packages/new/photos/components/gallery/index.tsx index 3209f9da37..bcf9314789 100644 --- a/web/packages/new/photos/components/gallery/index.tsx +++ b/web/packages/new/photos/components/gallery/index.tsx @@ -9,10 +9,12 @@ import { CenteredBox } from "@/base/components/mui/Container"; import type { SearchOption } from "@/new/photos/services/search/types"; -import { Typography } from "@mui/material"; +import { Paper, Stack, Typography } from "@mui/material"; import { t } from "i18next"; -import React from "react"; +import React, { useState } from "react"; +import { EnableML, FaceConsent } from "../sidebar/MLSettings"; import { useMLStatusSnapshot } from "../utils/use-snapshot"; +import { useWrapAsyncOperation } from "../utils/use-wrap-async"; import { GalleryItemsHeaderAdapter, GalleryItemsSummary } from "./ListHeader"; /** @@ -64,22 +66,39 @@ export const PeopleEmptyState: React.FC = () => { } }; -export const PeopleEmptyStateDisabled: React.FC = () => ( - - - -); +// import { FormPaper } from "@/base/components/FormPaper"; + +export const PeopleEmptyStateDisabled: React.FC = () => { + const [openFaceConsent, setOpenFaceConsent] = useState(false); + + const handleEnableML = () => setOpenFaceConsent(true); + + const handleConsent = useWrapAsyncOperation(async () => { + await enableML(); + // Close the FaceConsent drawer, come back to ourselves. + setOpenFaceConsent(false); + }); + + return ( + + + + + + setOpenFaceConsent(false)} + onRootClose={() => {}} + onConsent={handleConsent} + /> + + ); +}; export const PeopleEmptyStateMessage: React.FC = ({ children, diff --git a/web/packages/new/photos/components/sidebar/MLSettings.tsx b/web/packages/new/photos/components/sidebar/MLSettings.tsx index cc034cab2b..108eee09f5 100644 --- a/web/packages/new/photos/components/sidebar/MLSettings.tsx +++ b/web/packages/new/photos/components/sidebar/MLSettings.tsx @@ -54,7 +54,7 @@ export const MLSettings: React.FC = ({ if (!mlStatus) { component = ; } else if (mlStatus.phase == "disabled") { - component = ; + component = ; } else { component = ( @@ -98,9 +98,16 @@ const Loading: React.FC = () => { interface EnableMLProps { /** Called when the user enables ML. */ onEnable: () => void; + /** + * If true, a footnote describing the magic search feature will be shown. + */ + showMagicSearchHint?: boolean; } -export const EnableML: React.FC = ({ onEnable }) => { +export const EnableML: React.FC = ({ + onEnable, + showMagicSearchHint, +}) => { const moreDetails = () => openURL("https://help.ente.io/photos/features/machine-learning"); @@ -118,9 +125,11 @@ export const EnableML: React.FC = ({ onEnable }) => { {t("more_details")} - - {t("ml_search_footnote")} - + {showMagicSearchHint && ( + + {t("ml_search_footnote")} + + )} ); }; @@ -130,7 +139,7 @@ type FaceConsentProps = NestedSidebarDrawerVisibilityProps & { onConsent: () => void; }; -const FaceConsent: React.FC = ({ +export const FaceConsent: React.FC = ({ open, onClose, onRootClose, From 07600c60185e9426313f1d8ea6e99e8f5dd8f326 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 18 Nov 2024 20:23:57 +0530 Subject: [PATCH 71/75] Inline consent contents --- .../new/photos/components/gallery/index.tsx | 58 +++----- .../photos/components/sidebar/MLSettings.tsx | 138 +++++++++--------- 2 files changed, 97 insertions(+), 99 deletions(-) diff --git a/web/packages/new/photos/components/gallery/index.tsx b/web/packages/new/photos/components/gallery/index.tsx index bcf9314789..b487dd512e 100644 --- a/web/packages/new/photos/components/gallery/index.tsx +++ b/web/packages/new/photos/components/gallery/index.tsx @@ -12,6 +12,7 @@ import type { SearchOption } from "@/new/photos/services/search/types"; import { Paper, Stack, Typography } from "@mui/material"; import { t } from "i18next"; import React, { useState } from "react"; +import { enableML } from "../../services/ml"; import { EnableML, FaceConsent } from "../sidebar/MLSettings"; import { useMLStatusSnapshot } from "../utils/use-snapshot"; import { useWrapAsyncOperation } from "../utils/use-wrap-async"; @@ -66,40 +67,6 @@ export const PeopleEmptyState: React.FC = () => { } }; -// import { FormPaper } from "@/base/components/FormPaper"; - -export const PeopleEmptyStateDisabled: React.FC = () => { - const [openFaceConsent, setOpenFaceConsent] = useState(false); - - const handleEnableML = () => setOpenFaceConsent(true); - - const handleConsent = useWrapAsyncOperation(async () => { - await enableML(); - // Close the FaceConsent drawer, come back to ourselves. - setOpenFaceConsent(false); - }); - - return ( - - - - - - setOpenFaceConsent(false)} - onRootClose={() => {}} - onConsent={handleConsent} - /> - - ); -}; - export const PeopleEmptyStateMessage: React.FC = ({ children, }) => ( @@ -118,3 +85,26 @@ export const PeopleEmptyStateMessage: React.FC = ({ ); + +export const PeopleEmptyStateDisabled: React.FC = () => { + const [showConsent, setShowConsent] = useState(false); + + const handleConsent = useWrapAsyncOperation(async () => { + await enableML(); + }); + + return ( + + + {!showConsent ? ( + setShowConsent(true)} /> + ) : ( + setShowConsent(false)} + /> + )} + + + ); +}; diff --git a/web/packages/new/photos/components/sidebar/MLSettings.tsx b/web/packages/new/photos/components/sidebar/MLSettings.tsx index 108eee09f5..315aa21774 100644 --- a/web/packages/new/photos/components/sidebar/MLSettings.tsx +++ b/web/packages/new/photos/components/sidebar/MLSettings.tsx @@ -77,7 +77,7 @@ export const MLSettings: React.FC = ({ - setOpenFaceConsent(false)} onRootClose={handleRootClose} @@ -134,28 +134,54 @@ export const EnableML: React.FC = ({ ); }; -type FaceConsentProps = NestedSidebarDrawerVisibilityProps & { - /** Called when the user provides their consent. */ - onConsent: () => void; -}; +type FaceConsentDrawerProps = NestedSidebarDrawerVisibilityProps & + Pick; -export const FaceConsent: React.FC = ({ +const FaceConsentDrawer: React.FC = ({ open, onClose, onRootClose, onConsent, }) => { - const [acceptTerms, setAcceptTerms] = useState(false); - - useEffect(() => { - setAcceptTerms(false); - }, [open]); - const handleRootClose = () => { onClose(); onRootClose(); }; + return ( + + + + + + + ); +}; + +interface FaceConsentProps { + /** Called when the user provides their consent. */ + onConsent: () => void; + /** Called when the user cancels out. */ + onCancel: () => void; +} + +export const FaceConsent: React.FC = ({ + onConsent, + onCancel, +}) => { + const [acceptTerms, setAcceptTerms] = useState(false); + + useEffect(() => { + setAcceptTerms(false); + }, []); + const privacyPolicyLink = ( = ({ ); return ( - - - + + - - - + + setAcceptTerms(e.target.checked)} /> - - - - setAcceptTerms(e.target.checked) - } - /> - } - label={t("ml_consent_confirmation")} - /> - - - - - - + } + label={t("ml_consent_confirmation")} + /> + + + + - + ); }; From a2b9126c88c5241c86214f1b44a93061be8c8731 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 19 Nov 2024 06:34:24 +0530 Subject: [PATCH 72/75] Rename --- web/packages/base/components/mui/Container.tsx | 2 +- .../photos/components/gallery/PeopleHeader.tsx | 17 ++++++++++------- .../new/photos/components/gallery/index.tsx | 6 +++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/web/packages/base/components/mui/Container.tsx b/web/packages/base/components/mui/Container.tsx index abaa0e2dce..78e8657f1b 100644 --- a/web/packages/base/components/mui/Container.tsx +++ b/web/packages/base/components/mui/Container.tsx @@ -18,7 +18,7 @@ export const SpaceBetweenFlex = styled("div")` * A flex child that fills the entire flex direction, and shows its children * after centering them both vertically and horizontally. */ -export const CenteredBox = styled("div")` +export const CenteredFill = styled("div")` flex: 1; display: flex; justify-content: center; diff --git a/web/packages/new/photos/components/gallery/PeopleHeader.tsx b/web/packages/new/photos/components/gallery/PeopleHeader.tsx index 8ef463d306..63ae4f2ca9 100644 --- a/web/packages/new/photos/components/gallery/PeopleHeader.tsx +++ b/web/packages/new/photos/components/gallery/PeopleHeader.tsx @@ -1,6 +1,9 @@ import { ActivityErrorIndicator } from "@/base/components/ErrorIndicator"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; -import { CenteredBox, SpaceBetweenFlex } from "@/base/components/mui/Container"; +import { + CenteredFill, + SpaceBetweenFlex, +} from "@/base/components/mui/Container"; import { FocusVisibleButton } from "@/base/components/mui/FocusVisibleButton"; import { LoadingButton } from "@/base/components/mui/LoadingButton"; import { @@ -691,15 +694,15 @@ const SuggestionsDialog: React.FC = ({ sx={{ display: "flex", "&&&": { pt: 0 } }} > {state.activity == "fetching" ? ( - + {t("people_suggestions_finding")} - + ) : state.fetchFailed ? ( - + - + ) : state.showChoices ? ( = ({ onUpdateItem={handleUpdateItem} /> ) : state.suggestions.length == 0 ? ( - + t{"people_suggestions_empty"} - + ) : ( { export const PeopleEmptyStateMessage: React.FC = ({ children, }) => ( - + = ({ > {children} - + ); export const PeopleEmptyStateDisabled: React.FC = () => { From 68c230dae931d408ba478d358243dcb819bcb1ed Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 19 Nov 2024 08:10:47 +0530 Subject: [PATCH 73/75] Fix scroll (partially) We want the consent message to be scrollable. The current changes are a partial solution, the navbar still shows through at times. --- web/apps/photos/src/components/FullScreenDropZone.tsx | 1 + web/apps/photos/src/styles/global.css | 1 + web/packages/new/photos/components/gallery/index.tsx | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/web/apps/photos/src/components/FullScreenDropZone.tsx b/web/apps/photos/src/components/FullScreenDropZone.tsx index 9de95d8f5c..d02b0da2bc 100644 --- a/web/apps/photos/src/components/FullScreenDropZone.tsx +++ b/web/apps/photos/src/components/FullScreenDropZone.tsx @@ -14,6 +14,7 @@ const DropDiv = styled("div")` flex: 1; display: flex; flex-direction: column; + height: 100%; `; const Overlay = styled("div")` border-width: 8px; diff --git a/web/apps/photos/src/styles/global.css b/web/apps/photos/src/styles/global.css index e60b1944f4..7a06257c3c 100644 --- a/web/apps/photos/src/styles/global.css +++ b/web/apps/photos/src/styles/global.css @@ -49,6 +49,7 @@ body { flex: 1; display: flex; flex-direction: column; + height: 100%; } .pswp__button--custom { diff --git a/web/packages/new/photos/components/gallery/index.tsx b/web/packages/new/photos/components/gallery/index.tsx index 37b31a3b54..db1afadf39 100644 --- a/web/packages/new/photos/components/gallery/index.tsx +++ b/web/packages/new/photos/components/gallery/index.tsx @@ -94,7 +94,7 @@ export const PeopleEmptyStateDisabled: React.FC = () => { }); return ( - + {!showConsent ? ( setShowConsent(true)} /> From 641a73c1011e57e22cb904f48d6bd856bde08da3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:24:58 +0530 Subject: [PATCH 74/75] [server] validate bonus reversal --- server/pkg/repo/storagebonus/bf_addon.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/pkg/repo/storagebonus/bf_addon.go b/server/pkg/repo/storagebonus/bf_addon.go index 5e012f01fc..00326b4777 100644 --- a/server/pkg/repo/storagebonus/bf_addon.go +++ b/server/pkg/repo/storagebonus/bf_addon.go @@ -3,6 +3,8 @@ package storagebonus import ( "context" "fmt" + + "github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente/storagebonus" ) @@ -27,7 +29,15 @@ func (r *Repository) RemoveAddOnBonus(ctx context.Context, bonusType storagebonu if err != nil { return 0, err } - return res.RowsAffected() + // verify if the bonus was removed + rowsAffected, err := res.RowsAffected() + if err != nil { + return 0, err + } + if rowsAffected == int64(0) { + return 0, ente.NewBadRequestWithMessage(fmt.Sprintf("bonus not found for user %d with bonusID %s", userID, bonusID)) + } + return rowsAffected, nil } func (r *Repository) UpdateAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error { From 05f5c7f439bb2038aee96ac22b06e54d8c28e2bc Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:28:02 +0530 Subject: [PATCH 75/75] [server] Wrap inside db transaction --- server/pkg/repo/storagebonus/bf_addon.go | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/server/pkg/repo/storagebonus/bf_addon.go b/server/pkg/repo/storagebonus/bf_addon.go index 00326b4777..2c5a759c28 100644 --- a/server/pkg/repo/storagebonus/bf_addon.go +++ b/server/pkg/repo/storagebonus/bf_addon.go @@ -24,20 +24,34 @@ func (r *Repository) RemoveAddOnBonus(ctx context.Context, bonusType storagebonu if err := _validate(bonusType); err != nil { return 0, err } + bonusID := fmt.Sprintf("%s-%d", bonusType, userID) - res, err := r.DB.ExecContext(ctx, "DELETE FROM storage_bonus WHERE bonus_id = $1", bonusID) + + tx, err := r.DB.BeginTx(ctx, nil) if err != nil { - return 0, err + return 0, fmt.Errorf("failed to begin transaction: %w", err) + } + defer tx.Rollback() // Will be no-op if transaction is committed + res, err := tx.ExecContext(ctx, "DELETE FROM storage_bonus WHERE bonus_id = $1", bonusID) + if err != nil { + return 0, fmt.Errorf("failed to execute delete query: %w", err) } - // verify if the bonus was removed rowsAffected, err := res.RowsAffected() if err != nil { - return 0, err + return 0, fmt.Errorf("failed to get affected rows: %w", err) } - if rowsAffected == int64(0) { + switch { + case rowsAffected == 0: return 0, ente.NewBadRequestWithMessage(fmt.Sprintf("bonus not found for user %d with bonusID %s", userID, bonusID)) + case rowsAffected > 1: + return 0, fmt.Errorf("more than one (%d) bonus found for user %d with bonusID %s", rowsAffected, userID, bonusID) } - return rowsAffected, nil + + if err := tx.Commit(); err != nil { + return 0, fmt.Errorf("failed to commit transaction: %w", err) + } + + return 1, nil // We know exactly one row was affected at this point } func (r *Repository) UpdateAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error {