diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-03-13 20:34:01 -0500 |
---|---|---|
committer | Paul Frazee <pfrazee@gmail.com> | 2023-03-13 20:34:01 -0500 |
commit | 6533d7dd084ad8cdd479a0d9b416f94c809d96e1 (patch) | |
tree | 65eb1a3b71b3fa1ed79e5ca7f03715215ad1c629 /src | |
parent | 56cf890debeb9872f791ccb992a5587f2c05fd9e (diff) | |
download | voidsky-6533d7dd084ad8cdd479a0d9b416f94c809d96e1.tar.zst |
Add /support and /support/privacy
Diffstat (limited to 'src')
-rw-r--r-- | src/Navigation.tsx | 4 | ||||
-rw-r--r-- | src/lib/routes/types.ts | 2 | ||||
-rw-r--r-- | src/locale/en/privacy-policy.tsx | 608 | ||||
-rw-r--r-- | src/routes.ts | 2 | ||||
-rw-r--r-- | src/view/com/util/Html.tsx | 133 | ||||
-rw-r--r-- | src/view/com/util/Link.tsx | 4 | ||||
-rw-r--r-- | src/view/com/util/Views.web.tsx | 2 | ||||
-rw-r--r-- | src/view/screens/PrivacyPolicy.tsx | 38 | ||||
-rw-r--r-- | src/view/screens/Support.tsx | 44 | ||||
-rw-r--r-- | src/view/shell/desktop/RightNav.tsx | 24 |
10 files changed, 852 insertions, 9 deletions
diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 22d8d8b21..2bfc84ea9 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -35,6 +35,8 @@ import {PostUpvotedByScreen} from './view/screens/PostUpvotedBy' import {PostRepostedByScreen} from './view/screens/PostRepostedBy' import {DebugScreen} from './view/screens/Debug' import {LogScreen} from './view/screens/Log' +import {SupportScreen} from './view/screens/Support' +import {PrivacyPolicyScreen} from './view/screens/PrivacyPolicy' const navigationRef = createNavigationContainerRef<AllNavigatorParams>() @@ -64,6 +66,8 @@ function commonScreens(Stack: typeof HomeTab) { <Stack.Screen name="PostRepostedBy" component={PostRepostedByScreen} /> <Stack.Screen name="Debug" component={DebugScreen} /> <Stack.Screen name="Log" component={LogScreen} /> + <Stack.Screen name="Support" component={SupportScreen} /> + <Stack.Screen name="PrivacyPolicy" component={PrivacyPolicyScreen} /> </> ) } diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts index e339a46bf..9ec623970 100644 --- a/src/lib/routes/types.ts +++ b/src/lib/routes/types.ts @@ -14,6 +14,8 @@ export type CommonNavigatorParams = { PostRepostedBy: {name: string; rkey: string} Debug: undefined Log: undefined + Support: undefined + PrivacyPolicy: undefined } export type HomeTabNavigatorParams = CommonNavigatorParams & { diff --git a/src/locale/en/privacy-policy.tsx b/src/locale/en/privacy-policy.tsx new file mode 100644 index 000000000..02124ff0d --- /dev/null +++ b/src/locale/en/privacy-policy.tsx @@ -0,0 +1,608 @@ +import React from 'react' +import {H2, H4, P, UL, LI, A} from 'view/com/util/Html' + +export default function () { + return ( + <> + <H4>Last Updated: 2023/02/02</H4> + <P> + This Privacy Policy is designed to help you understand how Bluesky, + PBLLC d.b.a. Bluesky (“Bluesky,” “we,” “us,” or “our”) + collects, uses, processes, and shares your personal information, and to + help you understand and exercise your privacy rights.{' '} + </P> + <P>1. SCOPE AND UPDATES TO THIS PRIVACY POLICY</P> + <P>2. PERSONAL INFORMATION WE COLLECT</P> + <P>3. HOW WE USE YOUR PERSONAL INFORMATION</P> + <P>4. HOW WE DISCLOSE YOUR PERSONAL INFORMATION</P> + <P>5. YOUR PRIVACY CHOICES AND RIGHTS</P> + <P>6. SECURITY OF YOUR INFORMATION</P> + <P>7. INTERNATIONAL DATA TRANSFERS</P> + <P>8. RETENTION OF PERSONAL INFORMATION</P> + <P>9. SUPPLEMENTAL NOTICE FOR NEVADA RESIDENTS</P> + <P>10. CHILDREN’S INFORMATION</P> + <P>11. OTHER PROVISIONS</P> + <P>12. CONTACT US</P> + + <H2>1. SCOPE AND UPDATES TO THIS PRIVACY POLICY</H2> + <P> + This Privacy Policy applies to personal information processed by us, + including on our websites, mobile applications, and other online or + offline offerings. To make this Privacy Policy easier to read, our + websites, mobile applications, and other offerings are collectively + called the “Services.” + </P> + <P> + Changes to our Privacy Policy. We may revise this Privacy Policy from + time to time in our sole discretion. If there are any material changes + to this Privacy Policy, we will notify you as required by applicable + law. You understand and agree that you will be deemed to have accepted + the updated Privacy Policy if you continue to use our Services after the + new Privacy Policy takes effect. + </P> + <H2>2. PERSONAL INFORMATION WE COLLECT</H2> + <P> + The categories of personal information we collect depend on how you + interact with us, our Services, and the requirements of applicable law. + We collect information that you provide to us, information we obtain + automatically when you use our Services, and information from other + sources such as third-party services and organizations, as described + below. + </P> + <H4>1. Personal Information You Provide to Us Directly</H4> + <P>We may collect personal information that you provide to us.</P> + <UL> + <LI> + Account Creation. We may collect personal information when you create + an account with us, such as a username and password. + </LI> + </UL> + <UL> + <LI> + Your Communications with Us. We may collect personal information, such + as email address, phone number, or full name when you request + information about our Services, request customer or technical support, + or otherwise communicate with us. + </LI> + </UL> + <UL> + <LI> + Interactive Features. We and others who use our Services may collect + personal information that you submit or make available through our + interactive features (e.g., messaging and chat features, commenting + functionalities, forums, blogs, and social media pages). Any + information you provide using the public sharing features of the + Services will be considered “public,” unless otherwise required by + applicable law, and is not subject to the privacy protections + referenced herein. Please exercise caution before revealing any + information that may identify you in the real world to other users. + </LI> + </UL> + <H4>2. Personal Information Collected Automatically</H4> + <P> + We may collect personal information automatically when you use our + Services. + </P> + <UL> + <LI> + Automatic Collection of Personal Information. We may collect certain + information automatically when you use our Services, such as your + Internet protocol (IP) address, user settings, cookie identifiers, + mobile carrier, mobile advertising and other unique identifiers, + browser or device information, and Internet service provide. We may + also automatically collect information regarding your use of our + Services, such as pages that you visit before, during and after using + our Services, information about the links you click, the types of + content you interact with, the frequency and duration of your + activities, and other information about how you use our Services. + </LI> + <UL> + <LI> + Crash Reports. If you provide crash reports, we may collect personal + information related to such crash reports, including detailed + diagnostic information about your device and the activities that led + to the crash. + </LI> + </UL> + </UL> + <UL> + <LI> + Cookie Policy (and Other Technologies). We, as well as third + parties that provide content, or other functionality on our Services, + may use cookies, pixel tags, and other technologies (“Technologies”) + to automatically collect information through your use of our Services. + </LI> + <UL> + <LI> + Cookies. Cookies are small text files placed in device browsers that + store preferences and facilitate and enhance your experience. + </LI> + </UL> + <UL> + <LI> + Pixel Tags/Web Beacons. A pixel tag (also known as a web beacon) is + a piece of code embedded in our Services that collects information + about engagement on our Services. The use of a pixel tag allows us + to record, for example, that a user has visited a particular web + page or clicked on a particular advertisement. We may also include + web beacons in e-mails to understand whether messages have been + opened, acted on, or forwarded. + </LI> + </UL> + </UL> + <P> + Our uses of these Technologies fall into the following general + categories: + </P> + <UL> + <LI> + Operationally Necessary. This includes Technologies that allow you + access to our Services, applications, and tools that are required to + identify irregular website behavior, prevent fraudulent activity, + improve security, or allow you to make use of our functionality; + </LI> + </UL> + <UL> + <LI> + Performance-Related. We may use Technologies to assess the performance + of our Services, including as part of our analytic practices to help + us understand how individuals use our Services (see Analytics below); + </LI> + </UL> + <UL> + <LI> + Functionality-Related. We may use Technologies that allow us to offer + you enhanced functionality when accessing or using our Services. This + may include identifying you when you sign into our Services or keeping + track of your specified preferences, interests, or past items viewed; + </LI> + </UL> + <P> + See “Your Privacy Choices and Rights” below to understand your choices + regarding these Technologies. + </P> + <UL> + <LI> + Analytics. We may use Technologies and other third-party tools to + process analytics information on our Services. These Technologies + allow us to better understand how our digital Services are used and to + continually improve and personalize our Services. Some of our + analytics partners include: + </LI> + <UL> + <LI> + Segment.io. We use Segment's event tracking services to + aggregate, archive, and distribute website and application usage + information. For more information about how Segment uses your + personal information, please visit{' '} + <A href="https://www.twilio.com/legal/privacy"> + https://www.twilio.com/legal/privacy + </A> + . + </LI> + <LI> + Mixpanel. We use Mixpanel's analytics and event tracking + services to record and analyze website and application usage. For + more information about how Mixpanel uses your personal information, + please visit{' '} + <A href="https://mixpanel.com/legal/privacy-policy"> + https://mixpanel.com/legal/privacy-policy + </A> + . + </LI> + <LI> + DataDog. We use DataDog's monitoring, tracing, and logging + services to record application and server metrics, logs, and related + debugging information. For more information about how DataDog uses + your personal information, please visit{' '} + <A href="https://www.datadoghq.com/legal/privacy/"> + https://www.datadoghq.com/legal/privacy/ + </A> + . + </LI> + </UL> + </UL> + <UL> + <LI> + Social Media Platforms. Our Services may contain social media + buttons, such as Twitter, GitHub, Matrix, which might include widgets + such as the “share this” button or other interactive mini programs). + These features may collect personal information such as your IP + address and which page you are visiting on our Services, and may set a + cookie to enable the feature to function properly. Your interactions + with these platforms are governed by the privacy policy of the company + providing it. + </LI> + </UL> + <H4>3. Personal Information Collected from Other Sources</H4> + <P> + Third-Party Services and Sources. We may obtain personal information + about you from other sources, including through third-party services and + organizations. For example, if you access our Services through a + third-party application, such as an app store, a third-party login + service, or a social networking site, we may collect personal + information about you from that third-party application that you have + made available via your privacy settings. + </P> + <P> + Referrals and Sharing Features. Our Services may offer various + tools and functionalities that allow you to provide personal information + about your friends through our referral service. Third parties may also + use the Services to upload personal information about you, including + when they tag you. Our referral services may also allow you to forward + or share certain content with a friend or colleague, such as an email + inviting your friend to use our Services. Please only share with us + contact information of people with whom you have a relationship (e.g., + relative, friend, neighbor, or co-worker). + </P> + <H2>3. HOW WE USE YOUR PERSONAL INFORMATION</H2> + <P> + We use your personal information for a variety of business purposes, + including to provide our Services, for administrative purposes, and to + market our products and Services, as described below. + </P> + <H4>1. Provide Our Services</H4> + <P> + We use your information to fulfill our contract with you and provide you + with our Services, such as: + </P> + <UL> + <LI>Managing your information and accounts;</LI> + <LI> + Providing access to certain areas, functionalities, and features of + our Services; + </LI> + <LI>Answering requests for customer or technical support;</LI> + <LI> + Communicating with you about your account, activities on our Services, + and policy changes; + </LI> + <LI> + Processing your financial information and other payment methods for + products or Services purchased; + </LI> + <LI>Allowing you to register for events.</LI> + </UL> + <H4>2. Administrative Purposes</H4> + <P> + We use your information for various administrative purposes, such as: + </P> + <UL> + <LI> + Pursuing our legitimate interests such as direct marketing, research + and development (including marketing research), network and + information security, and fraud prevention; + </LI> + <LI> + Detecting security incidents, protecting against malicious, deceptive, + fraudulent or illegal activity, and prosecuting those responsible for + that activity; + </LI> + <LI>Measuring interest and engagement in our Services;</LI> + <LI> + Short-term, transient use, such as contextual customization of ads; + </LI> + <LI>Improving, upgrading, or enhancing our Services;</LI> + <LI>Developing new products and services;</LI> + <LI>Ensuring internal quality control and safety;</LI> + </UL> + <UL> + <LI> + Authenticating and verifying individual identities, including requests + to exercise your rights under this Privacy Policy; + </LI> + <LI>Debugging to identify and repair errors with our Services;</LI> + <LI> + Auditing relating to interactions, transactions, and other compliance + activities; + </LI> + <LI> + Sharing personal information with third parties as needed to provide + the Services; + </LI> + <LI>Enforcing our agreements and policies; and</LI> + <LI> + Carrying out activities that are required to comply with our legal + obligations. + </LI> + </UL> + <H4>3. With Your Consent</H4> + <P> + We may use personal information for other purposes that are clearly + disclosed to you at the time you provide personal information or with + your consent. + </P> + <H4>4. Other Purposes</H4> + <P> + We also use your personal information for other purposes as requested by + you or as permitted by applicable law. + </P> + <UL> + <LI> + De-identified and Aggregated Information. We may use personal + information to create de-identified and/or aggregated information, + such as demographic information, information about the device from + which you access our Services, or other analyses we create.{' '} + </LI> + </UL> + <H2>4. HOW WE DISCLOSE YOUR PERSONAL INFORMATION</H2> + <P> + We disclose your personal information to third parties for a variety of + business purposes, including to provide our Services, to protect us or + others, or in the event of a major business transaction such as a + merger, sale, or asset transfer, as described below. + </P> + <H4>1. Disclosures to Provide our Services</H4> + <P> + The categories of third parties with whom we may share your personal + information are described below. + </P> + <UL> + <LI> + Service Providers. We may share your personal information with our + third-party service providers and vendors that assist us with the + provision of our Services. This includes service providers and vendors + that provide us with IT support, hosting, payment processing, customer + service, and related services. + </LI> + </UL> + <UL> + <LI> + Business Partners. We may share your personal information with + business partners to provide you with a product or service you have + requested. We may also share your personal information with business + partners with whom we jointly offer products or services. + </LI> + </UL> + <UL> + <LI> + Other Users or Third Parties You Share or Interact With. As described + above in “Personal Information We Collect,” our Services may allow you + to share personal information or interact with other users and third + parties (including individuals and third parties who do not use our + Services and the general public). + </LI> + </UL> + <UL> + <LI> + APIs/SDKs. We may use third-party application program interfaces + (“APIs”) and software development kits (“SDKs”) as part of the + functionality of our Services. For more information about our use of + APIs and SDKs, please contact us as set forth in “ Contact + Us” below. + </LI> + </UL> + <H4>2. Disclosures to Protect Us or Others</H4> + <P> + We may access, preserve, and disclose any information we store + associated with you to external parties if we, in good faith, believe + doing so is required or appropriate to: comply with law enforcement or + national security requests and legal process, such as a court order or + subpoena; protect your, our, or others’ rights, property, or + safety; enforce our policies or contracts; collect amounts owed to us; + or assist with an investigation or prosecution of suspected or actual + illegal activity. + </P> + <H4> + 3. Disclosure in the Event of Merger, Sale, or Other Asset Transfers + </H4> + <P> + If we are involved in a merger, acquisition, financing due diligence, + reorganization, bankruptcy, receivership, purchase or sale of assets, or + transition of service to another provider, your information may be sold + or transferred as part of such a transaction, as permitted by law and/or + contract. + </P> + <H2>5. YOUR PRIVACY CHOICES AND RIGHTS</H2> + <P> + Your Privacy Choices. The privacy choices you may have about your + personal information are determined by applicable law and are described + below. + </P> + <UL> + <LI> + Email Communications. If you receive an unwanted email from us, you + can use the unsubscribe link found at the bottom of the email to opt + out of receiving future emails. Note that you will continue to receive + transaction-related emails regarding products or Services you have + requested. We may also send you certain non-promotional communications + regarding us and our Services, and you will not be able to opt out of + those communications (e.g., communications regarding our Services or + updates to our Terms or this Privacy Policy). + </LI> + </UL> + <UL> + <LI> + Mobile Devices. We may send you push notifications through our mobile + application. You may opt out from receiving these push notifications + by changing the settings on your mobile device. With your consent, we + may also collect precise location-based information via our mobile + application. You may opt out of this collection by changing the + settings on your mobile device. + </LI> + </UL> + <UL> + <LI> + “Do Not Track.” Do Not Track (“DNT”) is a privacy preference that + users can set in certain web browsers. Please note that we do not + respond to or honor DNT signals or similar mechanisms transmitted by + web browsers. + </LI> + </UL> + <P> + Your Privacy Rights. In accordance with applicable law, you may have the + right to: + </P> + <UL> + <LI> + Access to and Portability of Your Personal Information, including: (i) + confirming whether we are processing your personal information; (ii) + obtaining access to or a copy of your personal information; and (iii) + receiving an electronic copy of personal information that you have + provided to us, or asking us to send that information to another + company in a structured, commonly used, and machine readable format + (also known as the “right of data portability”); + </LI> + </UL> + <UL> + <LI> + Request Correction of your personal information where it is inaccurate + or incomplete. In some cases, we may provide self-service tools that + enable you to update your personal information; + </LI> + </UL> + <UL> + <LI>Request Deletion of your personal information;</LI> + </UL> + <UL> + <LI> + Request Restriction of or Object to our processing of your + personal information where the processing of your personal information + is based on our legitimate interest or for direct marketing purposes; + and + </LI> + </UL> + <UL> + <LI> + Withdraw your Consent to our processing of your personal + information. Please note that your withdrawal will only take effect + for future processing, and will not affect the lawfulness of + processing before the withdrawal. + </LI> + </UL> + <P> + If you would like to exercise any of these rights, please contact us as + set forth in “Contact Us” below. We will process such requests in + accordance with applicable laws. + </P> + <H2>6. SECURITY OF YOUR INFORMATION</H2> + <P> + We take steps to ensure that your information is treated securely and in + accordance with this Privacy Policy. Unfortunately, no system is + 100% secure, and we cannot ensure or warrant the security of any + information you provide to us. To the fullest extent permitted by + applicable law, we do not accept liability for unauthorized access, use, + disclosure, or loss of personal information. + </P> + <P> + By using our Services or providing personal information to us, you agree + that we may communicate with you electronically regarding security, + privacy, and administrative issues relating to your use of our Services. + If we learn of a security system’s breach, we may attempt to + notify you electronically by posting a notice on our Services, by mail, + or by sending an email to you. + </P> + <H2>7. INTERNATIONAL DATA TRANSFERS</H2> + <P> + All information processed by us may be transferred, processed, and + stored anywhere in the world, including, but not limited to, the United + States or other countries, which may have data protection laws that are + different from the laws where you live. We endeavor to safeguard your + information consistent with the requirements of applicable laws. + </P> + <P> + If we transfer personal information which originates in the European + Economic Area, Switzerland, and/or the United Kingdom to a country that + has not been found to provide an adequate level of protection under + applicable data protection laws, one of the safeguards we may use to + support such transfer is the{' '} + <A href="https://ec.europa.eu/info/law/law-topic/data-protection/international-dimension-data-protection/standard-contractual-clauses-scc/standard-contractual-clauses-international-transfers_en"> + EU Standard Contractual Clauses + </A> + . + </P> + <P> + For more information about the safeguards we use for international + transfers of your personal information, please contact us as set forth + below. + </P> + <H2>8. RETENTION OF PERSONAL INFORMATION</H2> + <P> + We store the personal information we collect as described in this + Privacy Policy for as long as you use our Services, or as necessary to + fulfill the purpose(s) for which it was collected, provide our Services, + resolve disputes, establish legal defenses, conduct audits, pursue + legitimate business purposes, enforce our agreements, and comply with + applicable laws. + </P> + <H2>9. SUPPLEMENTAL NOTICE FOR NEVADA RESIDENTS</H2> + <P> + If you are a resident of Nevada, you have the right to opt-out of the + sale of certain personal information to third parties who intend to + license or sell that personal information. You can exercise this right + by contacting us at{' '} + <A href="mailto:support@bsky.app" title="support@bsky.app"> + support@bsky.app + </A>{' '} + with the subject line “Nevada Do Not Sell Request” and providing us with + your name and the email address associated with your account. Please + note that we do not currently sell your personal information as sales + are defined in Nevada Revised Statutes Chapter 603A. If you have any + questions, please contact us as set forth in Contact Us below. + </P> + <H2>10. CHILDREN’S INFORMATION</H2> + <P> + The Services are not directed to children under 13 (or other age as + required by local law), and we do not knowingly collect personal + information from children. + </P> + <P> + If you are a parent or guardian and believe your child has uploaded + personal information to our site without your consent, you may contact + us as described in “Contact Us” below. If we become aware that a child + has provided us with personal information in violation of applicable + law, we will delete any personal information we have collected, unless + we have a legal obligation to keep it, and terminate the child’s + account. + </P> + <H2>11. OTHER PROVISIONS</H2> + <P> + Third-Party Websites/Applications. The Services may contain links to + other websites/applications and other websites/applications may + reference or link to our Services. These third-party services are not + controlled by us. We encourage our users to read the privacy policies of + each website and application with which they interact. We do not + endorse, screen, or approve, and are not responsible for, the privacy + practices or content of such other websites or applications. Providing + personal information to third-party websites or applications is at your + own risk. + </P> + <P> + Supervisory Authority. If your personal information is subject to + the applicable data protection laws of the European Economic Area, + Switzerland, or the United Kingdom, you have the right to lodge a + complaint with the competent supervisory authority or attorney general + if you believe our processing of your personal information violates + applicable law. + </P> + <UL> + <LI> + <A href="https://edpb.europa.eu/about-edpb/board/members_en"> + EEA Data Protection Authorities (DPAs) + </A> + </LI> + <LI> + <A href="https://www.edoeb.admin.ch/edoeb/en/home/the-fdpic/contact.html"> + Swiss Federal Data Protection and Information Commissioner (FDPIC) + </A> + </LI> + <LI> + <A href="https://ico.org.uk/global/contact-us/"> + UK Information Commissioner’s Office (ICO) + </A> + </LI> + </UL> + <H2>12. CONTACT US </H2> + <P> + Bluesky is the controller of the personal information we process under + this Privacy Policy. + </P> + <P> + If you have any questions about our privacy practices or this Privacy + Policy, or to exercise your rights as detailed in this Privacy Policy, + please contact us at:{' '} + <A href="mailto:support@bsky.app">support@bsky.app</A> + </P> + </> + ) +} diff --git a/src/routes.ts b/src/routes.ts index 5987177ef..6c02a7c50 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -13,4 +13,6 @@ export const router = new Router({ PostRepostedBy: '/profile/:name/post/:rkey/reposted-by', Debug: '/sys/debug', Log: '/sys/log', + Support: '/support', + PrivacyPolicy: '/support/privacy', }) diff --git a/src/view/com/util/Html.tsx b/src/view/com/util/Html.tsx new file mode 100644 index 000000000..245952e40 --- /dev/null +++ b/src/view/com/util/Html.tsx @@ -0,0 +1,133 @@ +import React from 'react' +import {StyleSheet, View} from 'react-native' +import {usePalette} from 'lib/hooks/usePalette' +import {Text} from './text/Text' +import {TextLink} from './Link' + +/** + * These utilities are used to define long documents in an html-like + * DSL. See for instance /locale/en/privacy-policy.tsx + */ + +export function H1({children}: React.PropsWithChildren<{}>) { + const pal = usePalette('default') + return ( + <Text type="title-xl" style={[pal.text, styles.h1]}> + {children} + </Text> + ) +} + +export function H2({children}: React.PropsWithChildren<{}>) { + const pal = usePalette('default') + return ( + <Text type="title-lg" style={[pal.text, styles.h2]}> + {children} + </Text> + ) +} + +export function H3({children}: React.PropsWithChildren<{}>) { + const pal = usePalette('default') + return ( + <Text type="title" style={[pal.text, styles.h3]}> + {children} + </Text> + ) +} + +export function H4({children}: React.PropsWithChildren<{}>) { + const pal = usePalette('default') + return ( + <Text type="title-sm" style={[pal.text, styles.h4]}> + {children} + </Text> + ) +} + +export function P({children}: React.PropsWithChildren<{}>) { + const pal = usePalette('default') + return ( + <Text type="md" style={[pal.text, styles.p]}> + {children} + </Text> + ) +} + +export function UL({children}: React.PropsWithChildren<{}>) { + return <View style={styles.ul}>{children}</View> +} + +export function OL({children}: React.PropsWithChildren<{}>) { + return <View style={styles.ol}>{children}</View> +} + +export function LI({ + children, + value, +}: React.PropsWithChildren<{value?: string}>) { + const pal = usePalette('default') + return ( + <View style={styles.li}> + <Text style={[pal.text, styles.liBullet]}>{value || <>•</>}</Text> + <Text type="md" style={[pal.text, styles.liText]}> + {children} + </Text> + </View> + ) +} + +export function A({children, href}: React.PropsWithChildren<{href: string}>) { + const pal = usePalette('default') + return ( + <TextLink + type="md" + style={[pal.link, styles.a]} + text={children} + href={href} + /> + ) +} + +const styles = StyleSheet.create({ + h1: { + marginTop: 20, + marginBottom: 10, + letterSpacing: 0.8, + }, + h2: { + marginTop: 20, + marginBottom: 10, + letterSpacing: 0.8, + }, + h3: { + marginBottom: 10, + }, + h4: { + marginBottom: 10, + fontWeight: 'bold', + }, + p: { + marginBottom: 10, + }, + ul: { + marginBottom: 10, + paddingLeft: 18, + }, + ol: { + marginBottom: 10, + paddingLeft: 18, + }, + li: { + flexDirection: 'row', + paddingRight: 10, + marginBottom: 10, + }, + liBullet: { + paddingRight: 10, + }, + liText: {}, + a: { + marginBottom: 10, + }, +}) diff --git a/src/view/com/util/Link.tsx b/src/view/com/util/Link.tsx index cee4d4136..f356f0b09 100644 --- a/src/view/com/util/Link.tsx +++ b/src/view/com/util/Link.tsx @@ -89,7 +89,7 @@ export const TextLink = observer(function TextLink({ type?: TypographyVariant style?: StyleProp<TextStyle> href: string - text: string | JSX.Element + text: string | JSX.Element | React.ReactNode numberOfLines?: number lineHeight?: number }) { @@ -193,7 +193,7 @@ function onPressInner( if (shouldHandle) { href = convertBskyAppUrlIfNeeded(href) - if (href.startsWith('http')) { + if (href.startsWith('http') || href.startsWith('mailto')) { Linking.openURL(href) } else { store.shell.closeModal() // close any active modals diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx index 9a43697b5..aa27d7f88 100644 --- a/src/view/com/util/Views.web.tsx +++ b/src/view/com/util/Views.web.tsx @@ -78,7 +78,7 @@ const styles = StyleSheet.create({ }, containerScroll: { width: '100%', - minHeight: '100vh', + maxHeight: '100vh', maxWidth: 600, marginLeft: 'auto', marginRight: 'auto', diff --git a/src/view/screens/PrivacyPolicy.tsx b/src/view/screens/PrivacyPolicy.tsx new file mode 100644 index 000000000..d5476ab52 --- /dev/null +++ b/src/view/screens/PrivacyPolicy.tsx @@ -0,0 +1,38 @@ +import React from 'react' +import {View} from 'react-native' +import {useFocusEffect} from '@react-navigation/native' +import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' +import {ViewHeader} from '../com/util/ViewHeader' +import {useStores} from 'state/index' +import {ScrollView} from 'view/com/util/Views' +import {Text} from 'view/com/util/text/Text' +import {usePalette} from 'lib/hooks/usePalette' +import {s} from 'lib/styles' +import PrivacyPolicyHtml from '../../locale/en/privacy-policy' + +type Props = NativeStackScreenProps<CommonNavigatorParams, 'PrivacyPolicy'> +export const PrivacyPolicyScreen = (_props: Props) => { + const pal = usePalette('default') + const store = useStores() + + useFocusEffect( + React.useCallback(() => { + store.shell.setMinimalShellMode(false) + }, [store]), + ) + + return ( + <View> + <ViewHeader title="Privacy Policy" /> + <ScrollView style={[s.hContentRegion, pal.view]}> + <View style={[s.p20]}> + <Text type="title-xl" style={[pal.text, s.pb20]}> + Privacy Policy + </Text> + <PrivacyPolicyHtml /> + </View> + <View style={s.footerSpacer} /> + </ScrollView> + </View> + ) +} diff --git a/src/view/screens/Support.tsx b/src/view/screens/Support.tsx new file mode 100644 index 000000000..de1b38b84 --- /dev/null +++ b/src/view/screens/Support.tsx @@ -0,0 +1,44 @@ +import React from 'react' +import {View} from 'react-native' +import {useFocusEffect} from '@react-navigation/native' +import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' +import {ViewHeader} from '../com/util/ViewHeader' +import {useStores} from 'state/index' +import {Text} from 'view/com/util/text/Text' +import {TextLink} from 'view/com/util/Link' +import {CenteredView} from 'view/com/util/Views' +import {usePalette} from 'lib/hooks/usePalette' +import {s} from 'lib/styles' + +type Props = NativeStackScreenProps<CommonNavigatorParams, 'Support'> +export const SupportScreen = (_props: Props) => { + const store = useStores() + const pal = usePalette('default') + + useFocusEffect( + React.useCallback(() => { + store.shell.setMinimalShellMode(false) + }, [store]), + ) + + return ( + <View> + <ViewHeader title="Support" /> + <CenteredView> + <Text type="title-xl" style={[pal.text, s.p20, s.pb5]}> + Support + </Text> + <Text style={[pal.text, s.p20]}> + If you need help, email us at{' '} + <TextLink + href="mailto:support@bsky.app" + text="support@bsky.app" + style={pal.link} + />{' '} + with a description of your issue and information about how we can help + you. + </Text> + </CenteredView> + </View> + ) +} diff --git a/src/view/shell/desktop/RightNav.tsx b/src/view/shell/desktop/RightNav.tsx index a196951af..58fb31392 100644 --- a/src/view/shell/desktop/RightNav.tsx +++ b/src/view/shell/desktop/RightNav.tsx @@ -6,6 +6,7 @@ import {DesktopSearch} from './Search' import {Text} from 'view/com/util/text/Text' import {TextLink} from 'view/com/util/Link' import {FEEDBACK_FORM_URL} from 'lib/constants' +import {s} from 'lib/styles' export const DesktopRightNav = observer(function DesktopRightNav() { const pal = usePalette('default') @@ -17,12 +18,23 @@ export const DesktopRightNav = observer(function DesktopRightNav() { Welcome to Bluesky! This is a beta application that's still in development. </Text> - <TextLink - type="md" - style={pal.link} - href={FEEDBACK_FORM_URL} - text="Send feedback" - /> + <View style={[s.flexRow]}> + <TextLink + type="md" + style={pal.link} + href={FEEDBACK_FORM_URL} + text="Send feedback" + /> + <Text type="md" style={pal.textLight}> + · + </Text> + <TextLink + type="md" + style={pal.link} + href="/support/privacy" + text="Privacy Policy" + /> + </View> </View> </View> ) |