mirror of
https://github.com/fergalmoran/radio-otherway.git
synced 2025-12-22 09:50:29 +00:00
Firestore working
This commit is contained in:
2
.env
2
.env
@@ -10,6 +10,8 @@ GOOGLE_APPLICATION_CREDENTIALS=radio-otherway-service-account.json
|
||||
NEXTAUTH_URL=https://otherway.dev.fergl.ie:3000
|
||||
GOOGLE_CLIENT_ID=47147490249-adhc8cbko4nvigrfoodo17oa3qfsg4pd.apps.googleusercontent.com
|
||||
GOOGLE_CLIENT_SECRET=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
|
||||
TWITTER_CLIENT_ID=TlZlQU9uQjJoaExJMjVPWmF5cno6MTpjaQ
|
||||
TWITTER_CLIENT_SECRET=AiSsD9ueQ7h2xTXjMgE5LLWBcc7qqC8gsHOP2n954mjExVtUqI
|
||||
|
||||
#calendar api
|
||||
GOOGLE_CALENDAR_PROJECT_ID=47147490249
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@next-auth/firebase-adapter": "^2.0.0",
|
||||
"@next-auth/prisma-adapter": "^1.0.5",
|
||||
"@next/font": "13.1.5",
|
||||
"@prisma/client": "^4.9.0",
|
||||
"@types/node": "18.11.18",
|
||||
@@ -19,12 +17,12 @@
|
||||
"@types/react-dom": "18.0.10",
|
||||
"@upstash/qstash": "^0.3.6",
|
||||
"daisyui": "^2.49.0",
|
||||
"encoding": "^0.1.13",
|
||||
"eslint": "8.32.0",
|
||||
"eslint-config-next": "13.1.5",
|
||||
"firebase": "^9.17.1",
|
||||
"firebase-admin": "^11.5.0",
|
||||
"next": "13.1.5",
|
||||
"next-auth": "^4.19.0",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"react-icons": "^4.7.1",
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
"use client";
|
||||
|
||||
import React from 'react';
|
||||
import "./globals.css";
|
||||
import { Inter } from "@next/font/google";
|
||||
import { NavBar } from "@/components/layout";
|
||||
import { SessionProvider } from "next-auth/react";
|
||||
import {Inter} from "@next/font/google";
|
||||
import {NavBar} from "@/components/layout";
|
||||
import {AuthUserProvider} from "@/lib/auth/authUserContext";
|
||||
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
const inter = Inter({subsets: ["latin"]});
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" data-theme="bumblebee">
|
||||
<head />
|
||||
<body className={`${inter.className} h-screen`}>
|
||||
<SessionProvider>
|
||||
<NavBar />
|
||||
<div className="-mt-[4rem]">
|
||||
{children}
|
||||
</div>
|
||||
</SessionProvider>
|
||||
</body>
|
||||
<head/>
|
||||
<body className={`${inter.className} h-screen`}>
|
||||
<AuthUserProvider>
|
||||
<NavBar/>
|
||||
<div className="-mt-[4rem]">
|
||||
{children}
|
||||
</div>
|
||||
</AuthUserProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,80 @@
|
||||
"use client";
|
||||
import React from "react";
|
||||
import {signIn} from "next-auth/react";
|
||||
import {useRouter} from "next/navigation";
|
||||
import {BsFacebook, BsGoogle, BsTwitter} from "react-icons/bs";
|
||||
import useFirebaseAuth from "@/lib/auth/useFirebaseAuth";
|
||||
|
||||
const LoginPage = () => {
|
||||
const {signInWithGoogle, signInWithTwitter, signInWithFacebook} = useFirebaseAuth();
|
||||
const router = useRouter()
|
||||
return (
|
||||
<div className="flex justify-center w-1/2 place-items-center bg-base-200">
|
||||
<div className="px-10 py-24">
|
||||
<h2 className="mb-2 text-2xl font-semibold text-center">Login </h2>
|
||||
|
||||
<div key="{provider.name}">
|
||||
<button onClick={() => signIn("google").then(r => router.push('/'))}>Sign in with Google</button>
|
||||
<div className="min-h-screen bg-gray-100 flex flex-col justify-center sm:py-12">
|
||||
<div className="xs:p-0 mx-auto md:w-full md:max-w-md">
|
||||
<h1 className="font-bold text-center text-2xl mb-5 mx-auto">
|
||||
Login to Radio Otherway
|
||||
</h1>
|
||||
<div className="bg-white shadow w-full rounded-lg">
|
||||
<div className="px-5 py-7">
|
||||
<label className="font-semibold text-sm text-gray-600 pb-1 block">E-mail</label>
|
||||
<input type="text" className="border rounded-lg px-3 py-2 mt-1 mb-5 text-sm w-full"/>
|
||||
<label className="font-semibold text-sm text-gray-600 pb-1 block">Password</label>
|
||||
<input type="text" className="border rounded-lg px-3 py-2 mt-1 mb-5 text-sm w-full"/>
|
||||
<button type="button"
|
||||
className="transition duration-200 bg-blue-500 hover:bg-blue-600 focus:bg-blue-700 focus:shadow-sm focus:ring-4 focus:ring-blue-500 focus:ring-opacity-50 text-white w-full py-2.5 rounded-lg text-sm shadow-sm hover:shadow-md font-semibold text-center inline-block">
|
||||
<span className="inline-block mr-2">Login</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
||||
className="w-4 h-4 inline-block">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M17 8l4 4m0 0l-4 4m4-4H3"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div className="relative flex py-5 items-center">
|
||||
<div className="flex-grow border-t border-gray-400"></div>
|
||||
<span className="flex-shrink mx-4 text-gray-400">or login with</span>
|
||||
<div className="flex-grow border-t border-gray-400"></div>
|
||||
</div>
|
||||
<div className="p-5">
|
||||
<div className="btn-group w-full">
|
||||
<button type="button"
|
||||
className="btn gap-2"
|
||||
onClick={signInWithGoogle}
|
||||
>
|
||||
<BsGoogle className="h-6 w-6"/>
|
||||
Google
|
||||
</button>
|
||||
<button type="button"
|
||||
className="btn gap-2"
|
||||
onClick={signInWithTwitter}>
|
||||
<BsTwitter className="h-6 w-6"/>
|
||||
Twitter
|
||||
</button>
|
||||
<button type="button"
|
||||
className="btn gap-2"
|
||||
onClick={signInWithFacebook}>
|
||||
<BsFacebook className="h-6 w-6"/>
|
||||
Facebook
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="py-5">
|
||||
<div className="grid grid-cols-2 gap-1">
|
||||
<div className="text-center sm:text-left whitespace-nowrap">
|
||||
<button
|
||||
className="transition duration-200 mx-5 px-5 py-4 cursor-pointer font-normal text-sm rounded-lg text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-200 focus:ring-2 focus:ring-gray-400 focus:ring-opacity-50 ring-inset">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
||||
className="w-4 h-4 inline-block align-text-top">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||
d="M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"/>
|
||||
</svg>
|
||||
<span className="inline-block ml-1">Forgot Password</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
143
src/components/boilerplate/Boilerplate.css
Normal file
143
src/components/boilerplate/Boilerplate.css
Normal file
@@ -0,0 +1,143 @@
|
||||
body {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 28px;
|
||||
margin: 24px;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
li,
|
||||
p {
|
||||
margin: 0 0 16px
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 40px;
|
||||
line-height: 60px
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 32px;
|
||||
line-height: 48px
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 24px;
|
||||
line-height: 36px
|
||||
}
|
||||
|
||||
h3,
|
||||
h4 {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 20px;
|
||||
line-height: 30px
|
||||
}
|
||||
|
||||
h5,
|
||||
h6 {
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
color: #000
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a[rel~=nofollow] {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
a[rel~=nofollow] {
|
||||
color: #553df4
|
||||
}
|
||||
|
||||
a[rel~=nofollow]:hover {
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
.visible {
|
||||
display: block
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none
|
||||
}
|
||||
|
||||
.page {
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.container {
|
||||
position: relative;
|
||||
width: 90%;
|
||||
max-width: 1024px;
|
||||
margin: 0 auto
|
||||
}
|
||||
|
||||
.header {
|
||||
padding: 16px 0
|
||||
}
|
||||
|
||||
.header .title {
|
||||
font-size: 28px;
|
||||
line-height: 42px;
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
.translations-list-container {
|
||||
padding-bottom: 8px;
|
||||
margin: 0 0 16px
|
||||
}
|
||||
|
||||
.translations-list-container .translations-list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none
|
||||
}
|
||||
|
||||
.translations-list-container .translations-list .translations-list-item {
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 0 8px 8px 0;
|
||||
font-weight: 700;
|
||||
color: #553df4
|
||||
}
|
||||
|
||||
.translations-list-container .translations-list .translations-list-item a {
|
||||
display: inline-block;
|
||||
color: #553df4;
|
||||
border: 1px solid #553df4;
|
||||
border-radius: 32px;
|
||||
padding: 4px 16px
|
||||
}
|
||||
|
||||
.translations-content-container {
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid #eee;
|
||||
word-break: break-all
|
||||
}
|
||||
|
||||
.footer {
|
||||
border-top: 1px solid #eee;
|
||||
margin: 32px 0 0;
|
||||
padding: 16px 0
|
||||
}
|
||||
300
src/components/boilerplate/PrivacyComponent.tsx
Normal file
300
src/components/boilerplate/PrivacyComponent.tsx
Normal file
@@ -0,0 +1,300 @@
|
||||
import './Boilerplate.css'
|
||||
|
||||
const PrivacyComponent = () => {
|
||||
return (<div className="tab-content translations-content-item en visible m-5" id="en">
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>Last updated: February 22, 2023</p>
|
||||
<p>This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your
|
||||
information when You use the Service and tells You about Your privacy rights and how the law protects You.</p>
|
||||
<p>We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection
|
||||
and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the
|
||||
help of the <a href="https://www.freeprivacypolicy.com/free-privacy-policy-generator/" target="_blank"
|
||||
rel="noreferrer">Free
|
||||
Privacy Policy Generator</a>.</p>
|
||||
<h1>Interpretation and Definitions</h1>
|
||||
<h2>Interpretation</h2>
|
||||
<p>The words of which the initial letter is capitalized have meanings defined under the following conditions. The
|
||||
following definitions shall have the same meaning regardless of whether they appear in singular or in
|
||||
plural.</p>
|
||||
<h2>Definitions</h2>
|
||||
<p>For the purposes of this Privacy Policy:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Account</strong> means a unique account created for You to access our Service or parts of our
|
||||
Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Affiliate</strong> means an entity that controls, is controlled by or is under common control with
|
||||
a party, where "control" means ownership of 50% or more of the shares, equity interest or other
|
||||
securities entitled to vote for election of directors or other managing authority.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Company</strong> (referred to as either "the
|
||||
Company", "We", "Us" or "Our" in this Agreement) refers to Radio
|
||||
Otherway.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Cookies</strong> are small files that are placed on Your computer, mobile device or any other
|
||||
device by a website, containing the details of Your browsing history on that website among its many uses.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Country</strong> refers to: Ireland</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Device</strong> means any device that can access the Service such as a computer, a cellphone or a
|
||||
digital tablet.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Personal Data</strong> is any information that relates to an identified or identifiable individual.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Service</strong> refers to the Website.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Service Provider</strong> means any natural or legal person who processes the data on behalf of the
|
||||
Company. It refers to third-party companies or individuals employed by the Company to facilitate the
|
||||
Service, to provide the Service on behalf of the Company, to perform services related to the Service or to
|
||||
assist the Company in analyzing how the Service is used.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Usage Data</strong> refers to data collected automatically, either generated by the use of the
|
||||
Service or from the Service infrastructure itself (for example, the duration of a page visit).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Website</strong> refers to Radio Otherway, accessible from <a
|
||||
href="https://otherway.dev.fergl.ie:3000/privacy" rel="external nofollow noopener noreferrer"
|
||||
target="_blank">https://otherway.dev.fergl.ie:3000/privacy</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>You</strong> means the individual accessing or using the Service, or the company, or other legal
|
||||
entity on behalf of which such individual is accessing or using the Service, as applicable.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h1>Collecting and Using Your Personal Data</h1>
|
||||
<h2>Types of Data Collected</h2>
|
||||
<h3>Personal Data</h3>
|
||||
<p>While using Our Service, We may ask You to provide Us with certain personally identifiable information that can
|
||||
be used to contact or identify You. Personally identifiable information may include, but is not limited to:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Email address</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>First name and last name</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Usage Data</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Usage Data</h3>
|
||||
<p>Usage Data is collected automatically when using the Service.</p>
|
||||
<p>Usage Data may include information such as Your Device"s Internet Protocol address (e.g. IP address),
|
||||
browser
|
||||
type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent
|
||||
on those pages, unique device identifiers and other diagnostic data.</p>
|
||||
<p>When You access the Service by or through a mobile device, We may collect certain information automatically,
|
||||
including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address
|
||||
of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device
|
||||
identifiers and other diagnostic data.</p>
|
||||
<p>We may also collect information that Your browser sends whenever You visit our Service or when You access the
|
||||
Service by or through a mobile device.</p>
|
||||
<h3>Tracking Technologies and Cookies</h3>
|
||||
<p>We use Cookies and similar tracking technologies to track the activity on Our Service and store certain
|
||||
information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to
|
||||
improve and analyze Our Service. The technologies We use may include:</p>
|
||||
<ul>
|
||||
<li><strong>Cookies or Browser Cookies.</strong> A cookie is a small file placed on Your Device. You can
|
||||
instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not
|
||||
accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser
|
||||
setting so that it will refuse Cookies, our Service may use Cookies.
|
||||
</li>
|
||||
<li><strong>Web Beacons.</strong> Certain sections of our Service and our emails may contain small electronic
|
||||
files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the
|
||||
Company, for example, to count users who have visited those pages or opened an email and for other related
|
||||
website statistics (for example, recording the popularity of a certain section and verifying system and server
|
||||
integrity).
|
||||
</li>
|
||||
</ul>
|
||||
<p>Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your
|
||||
personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close
|
||||
Your web browser. Learn more about cookies on the <a
|
||||
href="https://www.freeprivacypolicy.com/blog/sample-privacy-policy-template/#Use_Of_Cookies_And_Tracking"
|
||||
target="_blank" rel="noreferrer">Free Privacy Policy website</a> article.</p>
|
||||
<p>We use both Session and Persistent Cookies for the purposes set out below:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Necessary / Essential Cookies</strong></p>
|
||||
<p>Type: Session Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies are essential to provide You with services available through the Website and to
|
||||
enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user
|
||||
accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use
|
||||
these Cookies to provide You with those services.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Cookies Policy / Notice Acceptance Cookies</strong></p>
|
||||
<p>Type: Persistent Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies identify if users have accepted the use of cookies on the Website.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Functionality Cookies</strong></p>
|
||||
<p>Type: Persistent Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering
|
||||
your login details or language preference. The purpose of these Cookies is to provide You with a more
|
||||
personal experience and to avoid You having to re-enter your preferences every time You use the Website.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>For more information about the cookies we use and your choices regarding cookies, please visit our Cookies
|
||||
Policy or the Cookies section of our Privacy Policy.</p>
|
||||
<h2>Use of Your Personal Data</h2>
|
||||
<p>The Company may use Personal Data for the following purposes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>To provide and maintain our Service</strong>, including to monitor the usage of our Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To manage Your Account:</strong> to manage Your registration as a user of the Service. The Personal
|
||||
Data You provide can give You access to different functionalities of the Service that are available to You
|
||||
as a registered user.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For the performance of a contract:</strong> the development, compliance and undertaking of the
|
||||
purchase contract for the products, items or services You have purchased or of any other contract with Us
|
||||
through the Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To contact You:</strong> To contact You by email, telephone calls, SMS, or other equivalent forms
|
||||
of electronic communication, such as a mobile application"s push notifications regarding updates or
|
||||
informative communications related to the functionalities, products or contracted services, including the
|
||||
security updates, when necessary or reasonable for their implementation.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To provide You</strong> with news, special offers and general information about other goods,
|
||||
services and events which we offer that are similar to those that you have already purchased or enquired
|
||||
about unless You have opted not to receive such information.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To manage Your requests:</strong> To attend and manage Your requests to Us.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For business transfers:</strong> We may use Your information to evaluate or conduct a merger,
|
||||
divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our
|
||||
assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which
|
||||
Personal Data held by Us about our Service users is among the assets transferred.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For other purposes</strong>: We may use Your information for other purposes, such as data analysis,
|
||||
identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and
|
||||
improve our Service, products, services, marketing and your experience.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>We may share Your personal information in the following situations:</p>
|
||||
<ul>
|
||||
<li><strong>With Service Providers:</strong> We may share Your personal information with Service Providers to
|
||||
monitor and analyze the use of our Service, to contact You.
|
||||
</li>
|
||||
<li><strong>For business transfers:</strong> We may share or transfer Your personal information in connection
|
||||
with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a
|
||||
portion of Our business to another company.
|
||||
</li>
|
||||
<li><strong>With Affiliates:</strong> We may share Your information with Our affiliates, in which case we will
|
||||
require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other
|
||||
subsidiaries, joint venture partners or other companies that We control or that are under common control with
|
||||
Us.
|
||||
</li>
|
||||
<li><strong>With business partners:</strong> We may share Your information with Our business partners to offer
|
||||
You certain products, services or promotions.
|
||||
</li>
|
||||
<li><strong>With other users:</strong> when You share personal information or otherwise interact in the public
|
||||
areas with other users, such information may be viewed by all users and may be publicly distributed outside.
|
||||
</li>
|
||||
<li><strong>With Your consent</strong>: We may disclose Your personal information for any other purpose with
|
||||
Your consent.
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Retention of Your Personal Data</h2>
|
||||
<p>The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this
|
||||
Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal
|
||||
obligations (for example, if we are required to retain your data to comply with applicable laws), resolve
|
||||
disputes, and enforce our legal agreements and policies.</p>
|
||||
<p>The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a
|
||||
shorter period of time, except when this data is used to strengthen the security or to improve the functionality
|
||||
of Our Service, or We are legally obligated to retain this data for longer time periods.</p>
|
||||
<h2>Transfer of Your Personal Data</h2>
|
||||
<p>Your information, including Personal Data, is processed at the Company"s operating offices and in any
|
||||
other
|
||||
places where the parties involved in the processing are located. It means that this information may be
|
||||
transferred to — and maintained on — computers located outside of Your state, province, country or other
|
||||
governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.</p>
|
||||
<p>Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement
|
||||
to that transfer.</p>
|
||||
<p>The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in
|
||||
accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or
|
||||
a country unless there are adequate controls in place including the security of Your data and other personal
|
||||
information.</p>
|
||||
<h2>Delete Your Personal Data</h2>
|
||||
<p>You have the right to delete or request that We assist in deleting the Personal Data that We have collected
|
||||
about You.</p>
|
||||
<p>Our Service may give You the ability to delete certain information about You from within the Service.</p>
|
||||
<p>You may update, amend, or delete Your information at any time by signing in to Your Account, if you have one,
|
||||
and visiting the account settings section that allows you to manage Your personal information. You may also
|
||||
contact Us to request access to, correct, or delete any personal information that You have provided to Us.</p>
|
||||
<p>Please note, however, that We may need to retain certain information when we have a legal obligation or lawful
|
||||
basis to do so.</p>
|
||||
<h2>Disclosure of Your Personal Data</h2>
|
||||
<h3>Business Transactions</h3>
|
||||
<p>If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We
|
||||
will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy
|
||||
Policy.</p>
|
||||
<h3>Law enforcement</h3>
|
||||
<p>Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by
|
||||
law or in response to valid requests by public authorities (e.g. a court or a government agency).</p>
|
||||
<h3>Other legal requirements</h3>
|
||||
<p>The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:</p>
|
||||
<ul>
|
||||
<li>Comply with a legal obligation</li>
|
||||
<li>Protect and defend the rights or property of the Company</li>
|
||||
<li>Prevent or investigate possible wrongdoing in connection with the Service</li>
|
||||
<li>Protect the personal safety of Users of the Service or the public</li>
|
||||
<li>Protect against legal liability</li>
|
||||
</ul>
|
||||
<h2>Security of Your Personal Data</h2>
|
||||
<p>The security of Your Personal Data is important to Us, but remember that no method of transmission over the
|
||||
Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means
|
||||
to protect Your Personal Data, We cannot guarantee its absolute security.</p>
|
||||
<h1>Children"s Privacy</h1>
|
||||
<p>Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable
|
||||
information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child
|
||||
has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data
|
||||
from anyone under the age of 13 without verification of parental consent, We take steps to remove that
|
||||
information from Our servers.</p>
|
||||
<p>If We need to rely on consent as a legal basis for processing Your information and Your country requires
|
||||
consent from a parent, We may require Your parent"s consent before We collect and use that information.</p>
|
||||
<h1>Links to Other Websites</h1>
|
||||
<p>Our Service may contain links to other websites that are not operated by Us. If You click on a third party
|
||||
link, You will be directed to that third party"s site. We strongly advise You to review the Privacy Policy
|
||||
of
|
||||
every site You visit.</p>
|
||||
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any
|
||||
third party sites or services.</p>
|
||||
<h1>Changes to this Privacy Policy</h1>
|
||||
<p>We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new
|
||||
Privacy Policy on this page.</p>
|
||||
<p>We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective
|
||||
and update the "Last updated" date at the top of this Privacy Policy.</p>
|
||||
<p>You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are
|
||||
effective when they are posted on this page.</p>
|
||||
<h1>Contact Us</h1>
|
||||
<p>If you have any questions about this Privacy Policy, You can contact us:</p>
|
||||
<ul>
|
||||
<li>By email: <a href="/cdn-cgi/l/email-protection" className="__cf_email__"
|
||||
data-cfemail="5d322935382f2a3c241d2d32393332302e733e3230">[email protected]</a></li>
|
||||
</ul>
|
||||
</div>)
|
||||
}
|
||||
|
||||
export default PrivacyComponent;
|
||||
@@ -1,11 +1,13 @@
|
||||
"use client";
|
||||
import {signOut, useSession} from "next-auth/react";
|
||||
import React from "react";
|
||||
import {BiLogInCircle} from "react-icons/bi";
|
||||
import Link from "next/link";
|
||||
import useFirebaseAuth from "@/lib/auth/useFirebaseAuth";
|
||||
import {useAuthUserContext} from '@/lib/auth/authUserContext';
|
||||
|
||||
const Navbar = () => {
|
||||
const {data: session, status} = useSession();
|
||||
const {authUser, loading, logOut} = useAuthUserContext();
|
||||
|
||||
return (
|
||||
<div
|
||||
className="sticky top-0 z-30 flex justify-center w-full h-16 transition-all duration-100 shadow-sm bg-base-100 bg-opacity-90 text-base-content backdrop-blur">
|
||||
@@ -44,7 +46,7 @@ const Navbar = () => {
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<a className="text-xl normal-case btn-ghost btn">Radio::Otherway</a>
|
||||
<a href="/" className="text-xl normal-case btn-ghost btn">Radio::Otherway</a>
|
||||
</div>
|
||||
<div className="hidden navbar-center lg:flex">
|
||||
<ul className="px-1 menu menu-horizontal">
|
||||
@@ -57,8 +59,8 @@ const Navbar = () => {
|
||||
</ul>
|
||||
</div>
|
||||
<div className="navbar-end">
|
||||
{status === "authenticated" ? (
|
||||
<button className="gap-4 btn" onClick={() => signOut()}>
|
||||
{authUser ? (
|
||||
<button className="gap-4 btn" onClick={() => logOut()}>
|
||||
<BiLogInCircle className="inline-block w-5 h-5 stroke-current md:h-6 md:w-6"/>
|
||||
<span>Logout</span>
|
||||
</button>
|
||||
|
||||
40
src/lib/auth/authUserContext.tsx
Normal file
40
src/lib/auth/authUserContext.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import React, {createContext, useContext, Context} from 'react'
|
||||
import useFirebaseAuth from "@/lib/auth/useFirebaseAuth";
|
||||
import {User} from "@/lib/auth/user";
|
||||
|
||||
interface IAuthUserContext {
|
||||
authUser: User | undefined;
|
||||
loading: boolean;
|
||||
signIn: (email: string, password: string) => {},
|
||||
signUp: (email: string, password: string) => {},
|
||||
logOut: () => {},
|
||||
signInWithGoogle: () => {},
|
||||
signInWithTwitter: () => {},
|
||||
signInWithFacebook: () => {}
|
||||
}
|
||||
|
||||
const authUserContext
|
||||
= createContext<IAuthUserContext>({
|
||||
authUser: undefined,
|
||||
loading: true,
|
||||
signIn: async (email: string, password: string) => {
|
||||
},
|
||||
signUp: async (email: string, password: string) => {
|
||||
},
|
||||
logOut: async () => {
|
||||
},
|
||||
signInWithGoogle: async () => {
|
||||
},
|
||||
signInWithTwitter: async () => {
|
||||
},
|
||||
signInWithFacebook: async () => {
|
||||
},
|
||||
});
|
||||
|
||||
export function AuthUserProvider({children}: { children: React.ReactNode }) {
|
||||
const auth
|
||||
= useFirebaseAuth();
|
||||
return <authUserContext.Provider value={auth}>{children}</authUserContext.Provider>;
|
||||
}
|
||||
|
||||
export const useAuthUserContext = () => useContext(authUserContext);
|
||||
15
src/lib/auth/firebase.ts
Normal file
15
src/lib/auth/firebase.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import firebase, {getApp, getApps, initializeApp} from 'firebase/app';
|
||||
import 'firebase/auth';
|
||||
import {getFirestore} from "firebase/firestore";
|
||||
|
||||
const firebaseConfig = {
|
||||
apiKey: "AIzaSyDtQVcCocVj-baMyBNxhV3Fbi7YXeyTXXE",
|
||||
authDomain: "radio-otherway.firebaseapp.com",
|
||||
projectId: "radio-otherway",
|
||||
storageBucket: "radio-otherway.appspot.com",
|
||||
messagingSenderId: "47147490249",
|
||||
appId: "1:47147490249:web:a84515b3ce1c481826e618",
|
||||
measurementId: "G-12YB78EZM4"
|
||||
};
|
||||
|
||||
export const app = initializeApp(firebaseConfig);
|
||||
128
src/lib/auth/useFirebaseAuth.tsx
Normal file
128
src/lib/auth/useFirebaseAuth.tsx
Normal file
@@ -0,0 +1,128 @@
|
||||
import {useEffect, useState} from 'react'
|
||||
import {
|
||||
createUserWithEmailAndPassword,
|
||||
FacebookAuthProvider,
|
||||
getAuth,
|
||||
GoogleAuthProvider,
|
||||
onAuthStateChanged,
|
||||
signInWithEmailAndPassword,
|
||||
signInWithPopup, signInWithRedirect,
|
||||
signOut,
|
||||
TwitterAuthProvider
|
||||
} from 'firebase/auth';
|
||||
import {app} from './firebase';
|
||||
import {User} from "@/lib/auth/user";
|
||||
import {useRouter} from "next/navigation";
|
||||
|
||||
const formatAuthUser = (user: User) => ({
|
||||
uid: user.uid,
|
||||
email: user.email
|
||||
});
|
||||
|
||||
export default function useFirebaseAuth() {
|
||||
const auth = getAuth(app)
|
||||
const router = useRouter();
|
||||
|
||||
const [authUser, setAuthUser] = useState<User | undefined>(undefined);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
const authStateChanged = async (authState: any) => {
|
||||
if (!authState) {
|
||||
setLoading(false)
|
||||
return;
|
||||
}
|
||||
|
||||
setLoading(true)
|
||||
var formattedUser = formatAuthUser(authState);
|
||||
setAuthUser(formattedUser);
|
||||
setLoading(false);
|
||||
|
||||
};
|
||||
|
||||
const clear = () => {
|
||||
setAuthUser(undefined);
|
||||
setLoading(true);
|
||||
};
|
||||
|
||||
const signIn = (email: string, password: string) =>
|
||||
signInWithEmailAndPassword(auth, email, password);
|
||||
|
||||
const signUp = (email: string, password: string) =>
|
||||
createUserWithEmailAndPassword(auth, email, password);
|
||||
|
||||
const logOut = () =>
|
||||
signOut(auth).then(clear);
|
||||
const signInWithGoogle = () => {
|
||||
const provider = new GoogleAuthProvider();
|
||||
provider.setCustomParameters({prompt: 'select_account'});
|
||||
|
||||
return signInWithPopup(auth, provider)
|
||||
.then((result) => {
|
||||
const credential = GoogleAuthProvider.credentialFromResult(result);
|
||||
if (credential) {
|
||||
const token = credential.accessToken;
|
||||
const user = result.user;
|
||||
}
|
||||
router.push('/');
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
const email = error.email;
|
||||
const credential = GoogleAuthProvider.credentialFromError(error);
|
||||
});
|
||||
}
|
||||
const signInWithTwitter = () => {
|
||||
const provider = new TwitterAuthProvider();
|
||||
|
||||
return signInWithPopup(auth, provider)
|
||||
.then((result) => {
|
||||
const credential = TwitterAuthProvider.credentialFromResult(result);
|
||||
if (credential) {
|
||||
const token = credential.accessToken;
|
||||
const user = result.user;
|
||||
}
|
||||
router.push('/');
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
const email = error.email;
|
||||
const credential = GoogleAuthProvider.credentialFromError(error);
|
||||
});
|
||||
};
|
||||
const signInWithFacebook = () => {
|
||||
const provider = new FacebookAuthProvider()
|
||||
return signInWithPopup(auth, provider)
|
||||
.then((result) => {
|
||||
const credential = TwitterAuthProvider.credentialFromResult(result);
|
||||
if (credential) {
|
||||
const token = credential.accessToken;
|
||||
const user = result.user;
|
||||
}
|
||||
router.push('/');
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
const email = error.email;
|
||||
const credential = GoogleAuthProvider.credentialFromError(error);
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const unsubscribe = onAuthStateChanged(auth, authStateChanged);
|
||||
return unsubscribe
|
||||
}, []);
|
||||
|
||||
return {
|
||||
authUser,
|
||||
loading,
|
||||
signIn,
|
||||
signUp,
|
||||
logOut,
|
||||
signInWithGoogle,
|
||||
signInWithTwitter,
|
||||
signInWithFacebook
|
||||
};
|
||||
}
|
||||
4
src/lib/auth/user.tsx
Normal file
4
src/lib/auth/user.tsx
Normal file
@@ -0,0 +1,4 @@
|
||||
export type User = {
|
||||
uid: string;
|
||||
email: string
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import GoogleProvider from "next-auth/providers/google";
|
||||
import TwitterProvider from "next-auth/providers/twitter";
|
||||
// import {FirebaseAdapter} from "@next-auth/firebase-adapter"
|
||||
import {FirestoreAdapter} from "@next-auth/firebase-adapter";
|
||||
import {initializeApp, getApp, getApps} from "firebase/app";
|
||||
@@ -29,6 +30,11 @@ export const authOptions = {
|
||||
GoogleProvider({
|
||||
clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
||||
}),
|
||||
TwitterProvider({
|
||||
clientId: process.env.TWITTER_CLIENT_ID,
|
||||
clientSecret: process.env.TWITTER_CLIENT_SECRET,
|
||||
version: "2.0"
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import {NextApiRequest, NextApiResponse} from "next";
|
||||
|
||||
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
res.status(200).json({ hello: "sailor" });
|
||||
res.status(200).json({hello: "sailor"});
|
||||
};
|
||||
export default handler;
|
||||
|
||||
7
src/pages/privacy.tsx
Normal file
7
src/pages/privacy.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
import PrivacyComponent from "@/components/boilerplate/PrivacyComponent";
|
||||
|
||||
const PrivacyPage = () => {
|
||||
return <PrivacyComponent/>
|
||||
}
|
||||
|
||||
export default PrivacyPage;
|
||||
@@ -1,7 +1,12 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
|
||||
"target": "es5",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"lib": [
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
@@ -21,9 +26,18 @@
|
||||
],
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
"@/*": [
|
||||
"./src/*"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
|
||||
105
yarn.lock
105
yarn.lock
@@ -7,7 +7,7 @@
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.1.tgz#a8f81ee2fe872af23faea4b17a08fcc869de7bcc"
|
||||
integrity sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==
|
||||
|
||||
"@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7":
|
||||
"@babel/runtime@^7.20.7":
|
||||
version "7.20.13"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
|
||||
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
|
||||
@@ -538,16 +538,6 @@
|
||||
dependencies:
|
||||
lodash "^4.17.21"
|
||||
|
||||
"@next-auth/firebase-adapter@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@next-auth/firebase-adapter/-/firebase-adapter-2.0.0.tgz#a5e4dd1a6dbd91fbc86bd9e92c986affe57c723f"
|
||||
integrity sha512-Ps4AJZJvg4ue33GswJrlteDL5bFVyxgLuPHaTXhEONr3uXaTyYf93xaze5ceOa3vjlkEP9oLteFXPuz3wCPibg==
|
||||
|
||||
"@next-auth/prisma-adapter@^1.0.5":
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@next-auth/prisma-adapter/-/prisma-adapter-1.0.5.tgz#41a2fc7b44907054b81d456b426164e58becf4ed"
|
||||
integrity sha512-VqMS11IxPXrPGXw6Oul6jcyS/n8GLOWzRMrPr3EMdtD6eOalM6zz05j08PcNiis8QzkfuYnCv49OvufTuaEwYQ==
|
||||
|
||||
"@next/env@13.1.5":
|
||||
version "13.1.5"
|
||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.5.tgz#72b24d3726a6b752be6b7b9a937f7af31b3ce410"
|
||||
@@ -651,11 +641,6 @@
|
||||
"@nodelib/fs.scandir" "2.1.5"
|
||||
fastq "^1.6.0"
|
||||
|
||||
"@panva/hkdf@^1.0.1":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6"
|
||||
integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==
|
||||
|
||||
"@pkgr/utils@^2.3.1":
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03"
|
||||
@@ -1307,11 +1292,6 @@ concat-map@0.0.1:
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
|
||||
|
||||
cookie@^0.5.0:
|
||||
version "0.5.0"
|
||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||
|
||||
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
@@ -1486,6 +1466,13 @@ emoji-regex@^9.2.2:
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||
|
||||
encoding@^0.1.13:
|
||||
version "0.1.13"
|
||||
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
|
||||
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
|
||||
dependencies:
|
||||
iconv-lite "^0.6.2"
|
||||
|
||||
end-of-stream@^1.4.1:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||
@@ -2327,6 +2314,13 @@ https-proxy-agent@^5.0.0:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
iconv-lite@^0.6.2:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||
dependencies:
|
||||
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||
|
||||
idb@7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.1.tgz#d2875b3a2f205d854ee307f6d196f246fea590a7"
|
||||
@@ -2576,11 +2570,6 @@ isexe@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
|
||||
|
||||
jose@^4.10.0, jose@^4.9.3:
|
||||
version "4.11.2"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23"
|
||||
integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==
|
||||
|
||||
jose@^4.10.4:
|
||||
version "4.12.0"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.12.0.tgz#7f00cd2f82499b91623cd413b7b5287fd52651ed"
|
||||
@@ -2938,21 +2927,6 @@ natural-compare@^1.4.0:
|
||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
||||
|
||||
next-auth@^4.19.0:
|
||||
version "4.19.0"
|
||||
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.19.0.tgz#c6b73d546ef2103c9eaa4713c076718ec8c3c4c1"
|
||||
integrity sha512-56Pc/Ni0cxfrVDAz2KeWdj+VXvABbHF1grgFR4+ktXbRmKQOiMU9uyMwhasBQkbL+pRrWujO0Ib/bwkP0oZS4g==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.16.3"
|
||||
"@panva/hkdf" "^1.0.1"
|
||||
cookie "^0.5.0"
|
||||
jose "^4.9.3"
|
||||
oauth "^0.9.15"
|
||||
openid-client "^5.1.0"
|
||||
preact "^10.6.3"
|
||||
preact-render-to-string "^5.1.19"
|
||||
uuid "^8.3.2"
|
||||
|
||||
next@13.1.5:
|
||||
version "13.1.5"
|
||||
resolved "https://registry.yarnpkg.com/next/-/next-13.1.5.tgz#d0c230ccecf18414db78d180537d0474c53fdf73"
|
||||
@@ -3019,21 +2993,11 @@ normalize-range@^0.1.2:
|
||||
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
|
||||
integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
|
||||
|
||||
oauth@^0.9.15:
|
||||
version "0.9.15"
|
||||
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
|
||||
integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==
|
||||
|
||||
object-assign@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
|
||||
|
||||
object-hash@^2.0.1:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
|
||||
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
|
||||
|
||||
object-hash@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
|
||||
@@ -3102,11 +3066,6 @@ object.values@^1.1.6:
|
||||
define-properties "^1.1.4"
|
||||
es-abstract "^1.20.4"
|
||||
|
||||
oidc-token-hash@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6"
|
||||
integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==
|
||||
|
||||
once@^1.3.0, once@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
@@ -3131,16 +3090,6 @@ open@^8.4.0:
|
||||
is-docker "^2.1.1"
|
||||
is-wsl "^2.2.0"
|
||||
|
||||
openid-client@^5.1.0:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.3.2.tgz#fcc2c16f9681fa5f03ee0581b0935f88fc49f11f"
|
||||
integrity sha512-nXXt+cna0XHOw+WqjMZOmuXw/YZEMwfWD2lD7tCsFtsBjMQGVXA+NZABA3upYBET1suhIsmfd7GnxG4jCAnvYQ==
|
||||
dependencies:
|
||||
jose "^4.10.0"
|
||||
lru-cache "^6.0.0"
|
||||
object-hash "^2.0.1"
|
||||
oidc-token-hash "^5.0.1"
|
||||
|
||||
optionator@^0.8.1:
|
||||
version "0.8.3"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
|
||||
@@ -3288,18 +3237,6 @@ postcss@^8.4.18, postcss@^8.4.21:
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
preact-render-to-string@^5.1.19:
|
||||
version "5.2.6"
|
||||
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604"
|
||||
integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==
|
||||
dependencies:
|
||||
pretty-format "^3.8.0"
|
||||
|
||||
preact@^10.6.3:
|
||||
version "10.11.3"
|
||||
resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
|
||||
integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
|
||||
|
||||
prelude-ls@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||
@@ -3320,11 +3257,6 @@ prettier@^2.8.3:
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632"
|
||||
integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==
|
||||
|
||||
pretty-format@^3.8.0:
|
||||
version "3.8.0"
|
||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
|
||||
integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==
|
||||
|
||||
prisma@^4.9.0:
|
||||
version "4.9.0"
|
||||
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.9.0.tgz#295954b2a89cd35a0e6bcf66b2b036dbf80c75ee"
|
||||
@@ -3576,6 +3508,11 @@ safe-regex-test@^1.0.0:
|
||||
get-intrinsic "^1.1.3"
|
||||
is-regex "^1.1.4"
|
||||
|
||||
"safer-buffer@>= 2.1.2 < 3.0.0":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
scheduler@^0.23.0:
|
||||
version "0.23.0"
|
||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
|
||||
@@ -3961,7 +3898,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2:
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||
|
||||
uuid@^8.0.0, uuid@^8.3.2:
|
||||
uuid@^8.0.0:
|
||||
version "8.3.2"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
||||
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
|
||||
|
||||
Reference in New Issue
Block a user