-
Notifications
You must be signed in to change notification settings - Fork 0
feat: Google Play submission kit — build config, listing, data-safety, deletion path #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
1e25ba8
764441d
7bc5f95
c5179ee
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| */ | ||
|
|
||
| import React from "react"; | ||
| import { ScrollView, View, StyleSheet, Pressable } from "react-native"; | ||
| import { ScrollView, View, StyleSheet, Pressable, Linking } from "react-native"; | ||
| import { SafeAreaView } from "react-native-safe-area-context"; | ||
| import { useRouter } from "expo-router"; | ||
| import { Ionicons } from "@expo/vector-icons"; | ||
|
|
@@ -114,6 +114,20 @@ export default function ProfileScreen() { | |
| icon={<Ionicons name="log-out-outline" size={18} color={colors.text} />} | ||
| /> | ||
| </View> | ||
| {/* Google Play requires an in-app account-deletion entry point | ||
| (linking out to the hosted deletion page is explicitly | ||
| allowed by the policy). Keep this URL in sync with | ||
| docs/delete-account.html and PRIVACY.md. */} | ||
| <View style={{ marginTop: spacing.sm }}> | ||
| <SecondaryButton | ||
| full | ||
| label="Delete account" | ||
| onPress={() => | ||
| Linking.openURL("https://forage.techempower.org/delete-account.html") | ||
| } | ||
|
Comment on lines
+125
to
+127
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| icon={<Ionicons name="trash-outline" size={18} color={colors.text} />} | ||
| /> | ||
| </View> | ||
| </Section> | ||
| </ScrollView> | ||
| </SafeAreaView> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,99 @@ | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <meta charset="utf-8" /> | ||
| <meta name="viewport" content="width=device-width,initial-scale=1" /> | ||
| <title>Delete your account · Forage for All</title> | ||
| <meta name="description" content="Request deletion of your Forage for All account and all associated data." /> | ||
| <link rel="canonical" href="https://forage.techempower.org/delete-account.html" /> | ||
| <meta name="theme-color" content="#F4EDDC" /> | ||
| <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><circle cx=%2250%22 cy=%2250%22 r=%2248%22 fill=%22%238FB36E%22/><text x=%2250%22 y=%2268%22 font-size=%2255%22 text-anchor=%22middle%22>🌿</text></svg>" /> | ||
| <link rel="preconnect" href="https://fonts.googleapis.com"> | ||
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | ||
| <link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,800&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"> | ||
| <style> | ||
| :root { | ||
| --cream: #F4EDDC; --paper: #FBF5E3; --soil: #3E2E1F; --ink: #1F1710; | ||
| --inkSoft: #5A4634; --inkMuted: #8B7457; --line: #D4C49E; --lineSoft: #E7D9B4; | ||
| --moss: #4A7C2E; --mossDeep: #2F5520; --mossLight: #8FB36E; --terra: #B8573A; | ||
| --serif: "Fraunces", "Iowan Old Style", Georgia, serif; | ||
| --sans: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif; | ||
| } | ||
| @media (prefers-color-scheme: dark) { | ||
| :root { | ||
| --cream: #1D1710; --paper: #272016; --soil: #F0E7D3; --ink: #F4EDDC; | ||
| --inkSoft: #CDBFA6; --inkMuted: #9A886D; --line: #4A3D2C; --lineSoft: #382E20; | ||
| --moss: #8FB36E; --mossDeep: #A9C98C; --mossLight: #5C8A3C; --terra: #D97B5C; | ||
| } | ||
| } | ||
| * { box-sizing: border-box; } | ||
| html, body { margin: 0; padding: 0; } | ||
| body { font-family: var(--sans); color: var(--ink); background: var(--cream); line-height: 1.6; } | ||
| a { color: var(--mossDeep); text-decoration: none; border-bottom: 1px solid var(--mossLight); } | ||
| a:hover { border-bottom-color: var(--mossDeep); } | ||
| h1, h2 { font-family: var(--serif); font-weight: 600; color: var(--soil); line-height: 1.15; letter-spacing: -0.015em; margin: 0; } | ||
| h1 { font-size: clamp(30px, 5vw, 42px); } | ||
| h2 { font-size: 22px; margin: 40px 0 12px; } | ||
| p, li { color: var(--inkSoft); } | ||
| header.nav { position: sticky; top: 0; background: color-mix(in srgb, var(--cream) 92%, transparent); backdrop-filter: blur(10px); border-bottom: 1px solid var(--lineSoft); z-index: 5; } | ||
| .nav-inner { max-width: 760px; margin: 0 auto; padding: 14px 24px; display: flex; align-items: center; gap: 10px; } | ||
| .brand { display: flex; align-items: center; gap: 10px; font-family: var(--serif); font-weight: 700; font-size: 19px; border: 0; color: var(--soil); } | ||
| .brand-mark { width: 32px; height: 32px; border-radius: 50%; background: var(--mossLight); display: grid; place-items: center; font-size: 18px; } | ||
| main { max-width: 760px; margin: 0 auto; padding: 56px 24px 80px; } | ||
| ul, ol { padding-left: 22px; margin: 8px 0 16px; } | ||
| li { margin-bottom: 6px; } | ||
| .callout { background: var(--paper); border: 1px solid var(--lineSoft); border-radius: 12px; padding: 18px 20px; margin: 16px 0; } | ||
| .cta { display: inline-block; background: var(--moss); color: #FBF5E3; border: 0; border-radius: 999px; padding: 12px 22px; font-weight: 600; font-size: 15px; margin: 8px 0 4px; } | ||
| .cta:hover { background: var(--mossDeep); border: 0; color: #FBF5E3; } | ||
| footer { border-top: 1px solid var(--lineSoft); margin-top: 40px; padding-top: 24px; font-size: 14px; color: var(--inkMuted); } | ||
| strong { color: var(--soil); } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <header class="nav"> | ||
| <div class="nav-inner"> | ||
| <a class="brand" href="/"><span class="brand-mark">🌿</span> Forage for All</a> | ||
| </div> | ||
| </header> | ||
| <main> | ||
| <h1>Delete your account</h1> | ||
| <p>You can request deletion of your Forage for All account and all data associated with it | ||
| at any time. No questions, no retention tricks.</p> | ||
|
|
||
| <h2>What gets deleted</h2> | ||
| <ul> | ||
| <li>Your account and sign-in email</li> | ||
| <li>Your profile (handle, display name, badges)</li> | ||
| <li>Every pin you created</li> | ||
| <li>Your ripeness reports and comments</li> | ||
| <li>Your saved spots</li> | ||
| </ul> | ||
| <p>Deletion completes within <strong>30 days</strong> of the request. Nothing is retained afterward.</p> | ||
|
|
||
| <h2>How to request it</h2> | ||
| <ol> | ||
| <li><strong>In the app:</strong> Profile → <em>Delete account</em> (brings you to this page), or</li> | ||
| <li><strong>By email:</strong> send a message from your account email with the subject "Delete my account":</li> | ||
| </ol> | ||
| <p><a class="cta" href="mailto:jp@techempower.org?subject=Delete%20my%20account&body=Please%20delete%20my%20Forage%20for%20All%20account%20and%20all%20associated%20data.%20I%20am%20sending%20this%20from%20my%20account%20email.">Email a deletion request</a></p> | ||
| <p style="font-size:13.5px;color:var(--inkMuted)">We verify the request by matching the sender address | ||
| to the account email — that's all magic-code accounts have, so it's the strongest verification available.</p> | ||
|
|
||
| <h2>Deleting some data without closing your account</h2> | ||
| <p>You don't need to delete your account to remove content: any pin, ripeness report, or comment | ||
| you created can be deleted directly in the app, immediately and permanently.</p> | ||
|
|
||
| <div class="callout"> | ||
| <p style="margin:0"><strong>Good to know:</strong> browsing the map never required an account in the | ||
| first place — accounts exist only so the community can trust who's confirming what's ripe. | ||
| Read the full <a href="/privacy.html">privacy policy</a>.</p> | ||
| </div> | ||
|
|
||
| <footer> | ||
| Forage for All is a free, open-source (AGPLv3) project by | ||
| <a href="https://techempower.org">TechEmpower</a>, a 501(c)(3) nonprofit. | ||
| · <a href="/">Home</a> · <a href="/privacy.html">Privacy policy</a> | ||
| </footer> | ||
| </main> | ||
| </body> | ||
| </html> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Setting
targetSdkVersionto 35 while keepingcompileSdkVersionat 34 (the default for Expo SDK 51) will cause build failures on EAS. In Android development,compileSdkVersionmust be greater than or equal totargetSdkVersion. Additionally, modern transitive dependencies (such asandroidx.activityorandroidx.recyclerview) will fail to compile if the app is compiled against SDK 34. Please setcompileSdkVersionto 35 as well.