Add /support and /support/privacy

zio/stable
Paul Frazee 2023-03-13 20:34:01 -05:00
parent 56cf890deb
commit 6533d7dd08
13 changed files with 859 additions and 16 deletions

View File

@ -401,7 +401,7 @@ PODS:
- React-Core
- react-native-version-number (0.3.6):
- React
- react-native-webview (11.26.0):
- react-native-webview (11.26.1):
- React-Core
- React-perflogger (0.71.3)
- React-RCTActionSheet (0.71.3):
@ -869,7 +869,7 @@ SPEC CHECKSUMS:
react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-version-number: b415bbec6a13f2df62bf978e85bc0d699462f37f
react-native-webview: 994b9f8fbb504d6314dc40d83f94f27c6831b3bf
react-native-webview: 9f111dfbcfc826084d6c507f569e5e03342ee1c1
React-perflogger: af8a3d31546077f42d729b949925cc4549f14def
React-RCTActionSheet: 57cc5adfefbaaf0aae2cf7e10bccd746f2903673
React-RCTAnimation: 11c61e94da700c4dc915cf134513764d87fc5e2b

View File

@ -102,7 +102,7 @@
"react-native-web": "^0.18.11",
"react-native-web-linear-gradient": "^1.1.2",
"react-native-web-webview": "^1.0.2",
"react-native-webview": "11.26.0",
"react-native-webview": "^11.26.1",
"react-native-youtube-iframe": "^2.2.2",
"rn-fetch-blob": "^0.12.0",
"tippy.js": "^6.3.7",

View File

@ -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} />
</>
)
}

View File

@ -14,6 +14,8 @@ export type CommonNavigatorParams = {
PostRepostedBy: {name: string; rkey: string}
Debug: undefined
Log: undefined
Support: undefined
PrivacyPolicy: undefined
}
export type HomeTabNavigatorParams = CommonNavigatorParams & {

View File

@ -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:&nbsp;2023/02/02</H4>
<P>
This Privacy Policy is designed to help you understand how Bluesky,
PBLLC d.b.a. Bluesky (Bluesky, &nbsp;we, us, or&nbsp;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&rsquo;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).&nbsp;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&apos;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&apos;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&apos;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&nbsp;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. &nbsp;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.&nbsp;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&nbsp;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&rsquo; 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.&nbsp;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&nbsp;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&nbsp;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&nbsp;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.&nbsp;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&rsquo;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. &nbsp;
</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&rsquo;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&rsquo;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.&nbsp;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&rsquo;s Office (ICO)
</A>
</LI>
</UL>
<H2>12. CONTACT US&nbsp;</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>
</>
)
}

View File

@ -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',
})

View File

@ -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 || <>&bull;</>}</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,
},
})

View File

@ -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

View File

@ -78,7 +78,7 @@ const styles = StyleSheet.create({
},
containerScroll: {
width: '100%',
minHeight: '100vh',
maxHeight: '100vh',
maxWidth: 600,
marginLeft: 'auto',
marginRight: 'auto',

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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}>
&nbsp;&middot;&nbsp;
</Text>
<TextLink
type="md"
style={pal.link}
href="/support/privacy"
text="Privacy Policy"
/>
</View>
</View>
</View>
)

View File

@ -13710,10 +13710,10 @@ react-native-web@^0.18.11:
postcss-value-parser "^4.2.0"
styleq "^0.1.2"
react-native-webview@11.26.0:
version "11.26.0"
resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.26.0.tgz#e524992876fe4a79e69905f0fab8949b470e9f16"
integrity sha512-4T4CKRm8xlaQDz9h/bCMPGAvtkesrhkRWqCX9FDJEzBToaVUIsV0ZOqtC4w/JSnCtFKKYiaC1ReJtCGv+4mFeQ==
react-native-webview@^11.26.1:
version "11.26.1"
resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.26.1.tgz#658c09ed5162dc170b361e48c2dd26c9712879da"
integrity sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==
dependencies:
escape-string-regexp "2.0.0"
invariant "2.2.4"