diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx
index bf33868..6874603 100644
--- a/components/Modal/Collection/TeamManagement.tsx
+++ b/components/Modal/Collection/TeamManagement.tsx
@@ -43,7 +43,7 @@ export default function TeamManagement({
canDelete: false,
user: {
name: "",
- email: "",
+ username: "",
},
});
@@ -65,7 +65,7 @@ export default function TeamManagement({
canDelete: false,
user: {
name: "",
- email: "",
+ username: "",
},
});
};
@@ -146,32 +146,32 @@ export default function TeamManagement({
{
setMember({
...member,
- user: { ...member.user, email: e.target.value },
+ user: { ...member.user, username: e.target.value },
});
}}
onKeyDown={(e) =>
e.key === "Enter" &&
addMemberToCollection(
- session.data?.user.email as string,
- member.user.email,
+ session.data?.user.username as string,
+ member.user.username,
collection,
setMemberState
)
}
type="text"
- placeholder="Email"
+ placeholder="Username"
className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100"
/>
addMemberToCollection(
- session.data?.user.email as string,
- member.user.email,
+ session.data?.user.username as string,
+ member.user.username,
collection,
setMemberState
)
@@ -206,7 +206,7 @@ export default function TeamManagement({
onClick={() => {
const updatedMembers = collection.members.filter(
(member) => {
- return member.user.email !== e.user.email;
+ return member.user.username !== e.user.username;
}
);
setCollection({
@@ -225,7 +225,7 @@ export default function TeamManagement({
{e.user.name}
-
{e.user.email}
+
{e.user.username}
@@ -269,7 +269,9 @@ export default function TeamManagement({
if (permissions === true) {
const updatedMembers = collection.members.map(
(member) => {
- if (member.user.email === e.user.email) {
+ if (
+ member.user.username === e.user.username
+ ) {
return {
...member,
canCreate: !e.canCreate,
@@ -312,7 +314,9 @@ export default function TeamManagement({
if (permissions === true) {
const updatedMembers = collection.members.map(
(member) => {
- if (member.user.email === e.user.email) {
+ if (
+ member.user.username === e.user.username
+ ) {
return {
...member,
canUpdate: !e.canUpdate,
@@ -355,7 +359,9 @@ export default function TeamManagement({
if (permissions === true) {
const updatedMembers = collection.members.map(
(member) => {
- if (member.user.email === e.user.email) {
+ if (
+ member.user.username === e.user.username
+ ) {
return {
...member,
canDelete: !e.canDelete,
diff --git a/components/Modal/User/ChangePassword.tsx b/components/Modal/User/ChangePassword.tsx
index b7a364d..cab0518 100644
--- a/components/Modal/User/ChangePassword.tsx
+++ b/components/Modal/User/ChangePassword.tsx
@@ -56,8 +56,8 @@ export default function ChangePassword({
setSubmitLoader(false);
- if (user.email !== account.email || user.name !== account.name)
- update({ email: user.email, name: user.name });
+ if (user.username !== account.username || user.name !== account.name)
+ update({ username: user.username, name: user.name });
if (response.ok) {
setUser({ ...user, oldPassword: undefined, newPassword: undefined });
diff --git a/components/Modal/User/PrivacySettings.tsx b/components/Modal/User/PrivacySettings.tsx
index e9f3dad..9ce6197 100644
--- a/components/Modal/User/PrivacySettings.tsx
+++ b/components/Modal/User/PrivacySettings.tsx
@@ -64,8 +64,8 @@ export default function PrivacySettings({
setSubmitLoader(false);
- if (user.email !== account.email || user.name !== account.name)
- update({ email: user.email, name: user.name });
+ if (user.username !== account.username || user.name !== account.name)
+ update({ username: user.username, name: user.name });
if (response.ok) {
setUser({ ...user, oldPassword: undefined, newPassword: undefined });
@@ -93,7 +93,7 @@ export default function PrivacySettings({
Whitelisted Users
- Please provide the Email addresses of the users you wish to grant
+ Please provide the Username of the users you wish to grant
visibility to your profile. Separated by comma.
-
Email
+
Username
setForm({ ...form, email: e.target.value })}
+ value={form.username}
+ onChange={(e) => setForm({ ...form, username: e.target.value })}
className="w-full rounded-md p-3 mx-auto border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100"
/>
diff --git a/pages/register.tsx b/pages/register.tsx
index 757a05a..40dee63 100644
--- a/pages/register.tsx
+++ b/pages/register.tsx
@@ -6,7 +6,7 @@ import SubmitButton from "@/components/SubmitButton";
interface FormData {
name: string;
- email: string;
+ username: string;
password: string;
passwordConfirmation: string;
}
@@ -18,7 +18,7 @@ export default function Register() {
const [form, setForm] = useState
({
name: "",
- email: "",
+ username: "",
password: "",
passwordConfirmation: "",
});
@@ -26,7 +26,7 @@ export default function Register() {
async function registerUser() {
if (
form.name !== "" &&
- form.email !== "" &&
+ form.username !== "" &&
form.password !== "" &&
form.passwordConfirmation !== ""
) {
@@ -54,7 +54,7 @@ export default function Register() {
if (response.ok) {
setForm({
name: "",
- email: "",
+ username: "",
password: "",
passwordConfirmation: "",
});
@@ -96,13 +96,13 @@ export default function Register() {
className="w-full rounded-md p-3 mx-auto border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100"
/>
- Email
+ Username
setForm({ ...form, email: e.target.value })}
+ value={form.username}
+ onChange={(e) => setForm({ ...form, username: e.target.value })}
className="w-full rounded-md p-3 mx-auto border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100"
/>
diff --git a/prisma/migrations/20230704065656_renamed_email_to_username/migration.sql b/prisma/migrations/20230704065656_renamed_email_to_username/migration.sql
new file mode 100644
index 0000000..8261148
--- /dev/null
+++ b/prisma/migrations/20230704065656_renamed_email_to_username/migration.sql
@@ -0,0 +1,32 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `email` on the `User` table. All the data in the column will be lost.
+ - A unique constraint covering the columns `[username]` on the table `User` will be added. If there are existing duplicate values, this will fail.
+ - Added the required column `username` to the `User` table without a default value. This is not possible if the table is not empty.
+
+*/
+-- DropIndex
+DROP INDEX "User_email_key";
+
+ALTER TABLE "User" RENAME COLUMN "email" TO "username";
+
+-- AlterTable
+ALTER TABLE "User" ADD COLUMN "emailVerified" TIMESTAMP(3),
+ADD COLUMN "image" TEXT;
+
+-- CreateTable
+CREATE TABLE "VerificationToken" (
+ "identifier" TEXT NOT NULL,
+ "token" TEXT NOT NULL,
+ "expires" TIMESTAMP(3) NOT NULL
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 6b6d40f..a365dcd 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -7,22 +7,69 @@ datasource db {
url = env("DATABASE_URL")
}
-model User {
- id Int @id @default(autoincrement())
- name String
- email String @unique
- password String
- collections Collection[]
- tags Tag[]
+// model Account {
+// id String @id @default(cuid())
+// userId Int
+// type String
+// provider String
+// providerAccountId String
+// refresh_token String? @db.Text
+// access_token String? @db.Text
+// expires_at Int?
+// token_type String?
+// scope String?
+// id_token String? @db.Text
+// session_state String?
- pinnedLinks Link[]
+// user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+// @@unique([provider, providerAccountId])
+// }
+
+// model Session {
+// id String @id @default(cuid())
+// sessionToken String @unique
+// userId Int
+// expires DateTime
+// user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+// }
+
+model User {
+ id Int @id @default(autoincrement())
+ name String
+
+ username String @unique
+
+ // email String? @unique
+ emailVerified DateTime?
+ image String?
+
+ // accounts Account[]
+ // sessions Session[]
- collectionsJoined UsersAndCollections[]
- isPrivate Boolean @default(false)
- whitelistedUsers String[] @default([])
- createdAt DateTime @default(now())
+ password String
+ collections Collection[]
+
+ tags Tag[]
+
+ pinnedLinks Link[]
+
+ collectionsJoined UsersAndCollections[]
+ isPrivate Boolean @default(false)
+ whitelistedUsers String[] @default([])
+ createdAt DateTime @default(now())
}
+
+model VerificationToken {
+ identifier String
+ token String @unique
+ expires DateTime
+
+ @@unique([identifier, token])
+}
+
+
model Collection {
id Int @id @default(autoincrement())
name String
diff --git a/store/account.ts b/store/account.ts
index 8bd04e9..7df7578 100644
--- a/store/account.ts
+++ b/store/account.ts
@@ -8,14 +8,14 @@ type ResponseObject = {
type AccountStore = {
account: AccountSettings;
- setAccount: (email: string) => void;
+ setAccount: (username: string) => void;
updateAccount: (user: AccountSettings) => Promise;
};
const useAccountStore = create()((set) => ({
account: {} as AccountSettings,
- setAccount: async (email) => {
- const response = await fetch(`/api/routes/users?email=${email}`);
+ setAccount: async (username) => {
+ const response = await fetch(`/api/routes/users?username=${username}`);
const data = await response.json();
diff --git a/types/global.ts b/types/global.ts
index a0c3f92..350cba2 100644
--- a/types/global.ts
+++ b/types/global.ts
@@ -21,7 +21,7 @@ export interface Member {
canCreate: boolean;
canUpdate: boolean;
canDelete: boolean;
- user: OptionalExcluding;
+ user: OptionalExcluding;
}
export interface CollectionIncludingMembersAndLinkCount
diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts
index cb9674b..ca9c127 100644
--- a/types/next-auth.d.ts
+++ b/types/next-auth.d.ts
@@ -1,9 +1,11 @@
-import NextAuth, { DefaultSession } from "next-auth";
+import NextAuth from "next-auth";
declare module "next-auth" {
interface Session {
user: {
id: number;
- } & DefaultSession["user"];
+ username: string;
+ email: string;
+ };
}
}
diff --git a/yarn.lock b/yarn.lock
index c73f334..6163f0d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -12,6 +12,25 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+"@auth/core@0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@auth/core/-/core-0.8.1.tgz#8fbfb7b11ed3e4b346857b033e454efb7c16df26"
+ integrity sha512-WudBmZudZ/cvykxHV5hIwrYsd7AlETQ535O7w3sSiiumT28+U9GvBb8oSRtfzxpW9rym3lAdfeTJqGA8U4FecQ==
+ dependencies:
+ "@panva/hkdf" "^1.0.4"
+ cookie "0.5.0"
+ jose "^4.11.1"
+ oauth4webapi "^2.0.6"
+ preact "10.11.3"
+ preact-render-to-string "5.2.3"
+
+"@auth/prisma-adapter@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@auth/prisma-adapter/-/prisma-adapter-1.0.0.tgz#9107498921997b6174e0189553f29d0eb49ba2a0"
+ integrity sha512-+x+s5dgpNmqrcQC2ZRAXZIM6yhkWP/EXjIUgqUyMepLiX1OHi2AXIUAAbXsW4oG9OpYr/rvPIzPBpuGt6sPFwQ==
+ dependencies:
+ "@auth/core" "0.8.1"
+
"@aws-crypto/crc32@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa"
@@ -1023,7 +1042,7 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@panva/hkdf@^1.0.2":
+"@panva/hkdf@^1.0.2", "@panva/hkdf@^1.0.4":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d"
integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==
@@ -2022,7 +2041,7 @@ convert-source-map@^1.5.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-cookie@^0.5.0:
+cookie@0.5.0, 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==
@@ -3270,7 +3289,7 @@ jiti@^1.18.2:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
-jose@^4.11.4, jose@^4.14.1:
+jose@^4.11.1, jose@^4.11.4, jose@^4.14.1:
version "4.14.4"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca"
integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==
@@ -3663,6 +3682,11 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+oauth4webapi@^2.0.6:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-2.3.0.tgz#d01aeb83b60dbe3ff9ef1c6ec4a39e29c7be7ff6"
+ integrity sha512-JGkb5doGrwzVDuHwgrR4nHJayzN4h59VCed6EW8Tql6iHDfZIabCJvg6wtbn5q6pyB2hZruI3b77Nudvq7NmvA==
+
oauth@^0.9.15:
version "0.9.15"
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
@@ -3961,6 +3985,13 @@ postcss@^8.4.23, postcss@^8.4.24:
picocolors "^1.0.0"
source-map-js "^1.0.2"
+preact-render-to-string@5.2.3:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz#23d17376182af720b1060d5a4099843c7fe92fe4"
+ integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==
+ dependencies:
+ pretty-format "^3.8.0"
+
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"
@@ -3968,7 +3999,7 @@ preact-render-to-string@^5.1.19:
dependencies:
pretty-format "^3.8.0"
-preact@^10.6.3:
+preact@10.11.3, preact@^10.6.3:
version "10.11.3"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==