From d6413fa51451e1201079be55e920108897944dcf Mon Sep 17 00:00:00 2001 From: nomadics9 Date: Sun, 12 May 2024 20:46:32 +0300 Subject: [PATCH] Forbidden page --- package-lock.json | 12 +++ package.json | 1 + src/lib/components/Myerror.svelte | 10 +++ src/lib/firebase.ts | 101 ++++++++++++++++++++++++ src/routes/[username]/+page.svelte | 12 +++ src/routes/[username]/+page.ts | 7 +- static/403.png | Bin 0 -> 32286 bytes tailwind.config.js | 120 ++++++++++++++--------------- 8 files changed, 198 insertions(+), 65 deletions(-) create mode 100644 src/lib/components/Myerror.svelte create mode 100644 src/lib/firebase.ts create mode 100644 static/403.png diff --git a/package-lock.json b/package-lock.json index 9a3e164..0715aeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "bits-ui": "^0.21.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "dotenv": "^16.4.5", "drag-drop-touch": "^1.3.1", "firebase": "^10.11.1", "firebase-admin": "^12.1.0", @@ -2808,6 +2809,17 @@ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/drag-drop-touch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/drag-drop-touch/-/drag-drop-touch-1.3.1.tgz", diff --git a/package.json b/package.json index ba71c69..a3056f9 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "bits-ui": "^0.21.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "dotenv": "^16.4.5", "drag-drop-touch": "^1.3.1", "firebase": "^10.11.1", "firebase-admin": "^12.1.0", diff --git a/src/lib/components/Myerror.svelte b/src/lib/components/Myerror.svelte new file mode 100644 index 0000000..90be279 --- /dev/null +++ b/src/lib/components/Myerror.svelte @@ -0,0 +1,10 @@ + +
+

403

+The Profile of @{username} is not public! +
+
+ forbidden +
diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts new file mode 100644 index 0000000..4001218 --- /dev/null +++ b/src/lib/firebase.ts @@ -0,0 +1,101 @@ +// Import the functions you need from the SDKs you need +import { initializeApp } from "firebase/app"; +import { doc, getFirestore, onSnapshot } from "firebase/firestore"; +import { getAuth, onAuthStateChanged, type User } from "firebase/auth"; +import { getStorage } from "firebase/storage"; +import { writable, type Readable, derived } from "svelte/store"; +import { env } from "$env/dynamic/public"; + +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries +// Your web app's Firebase configuration +const firebaseConfig = { + + apiKey: env.PUBLIC_API_KEY, + authDomain: env.PUBLIC_AUTH_DOMAIN , + projectId: env.PUBLIC_PROJECT_ID, + storageBucket: env.PUBLIC_STORAGE_BUCKET, + messagingSenderId: env.PUBLIC_MESSAGING_SENDER_ID, + appId: env.PUBLIC_APP_ID, + +}; + +// Initialize Firebase +const app = initializeApp(firebaseConfig); + +export const db = getFirestore(); +export const auth = getAuth(); +export const storage = getStorage(); + +/** + * @returns a store with the current firebase user + */ + +function userStore() { + let unsubscribe: () => void; + + if (!auth || !globalThis.window) { + console.warn("Auth is not initialized or not in browser"); + const { subscribe } = writable(null); + return { + subscribe, + }; + } + + const { subscribe } = writable(auth?.currentUser ?? null, (set) => { + unsubscribe = onAuthStateChanged(auth, (user) => { + set(user); + }); + + return () => unsubscribe(); + }); + + return { + subscribe, + }; +} + +export const user = userStore(); + +/** + * @param {string} path document path or reference + * @returns a store with realtime updates on document data + */ +export function docStore(path: string) { + let unsubscribe: () => void; + + const docRef = doc(db, path); + + const { subscribe } = writable(null, (set) => { + unsubscribe = onSnapshot(docRef, (snapshot) => { + set((snapshot.data() as T) ?? null); + }); + + return () => unsubscribe(); + }); + + return { + subscribe, + ref: docRef, + id: docRef.id, + }; +} + +interface UserData { + username: string; + bio: string; + photoURL: string; + links: any[]; + published: boolean; +} + +export const userData: Readable = derived( + user, + ($user, set) => { + if ($user) { + return docStore(`users/${$user.uid}`).subscribe(set); + } else { + set(null); + } + }, +); diff --git a/src/routes/[username]/+page.svelte b/src/routes/[username]/+page.svelte index 6eed820..06701d4 100644 --- a/src/routes/[username]/+page.svelte +++ b/src/routes/[username]/+page.svelte @@ -9,8 +9,10 @@ } from "firebase/auth"; import { goto } from "$app/navigation"; import { toasts, ToastContainer, FlatToast } from "svelte-toasts"; + import Myerror from "$lib/components/Myerror.svelte" export let data: PageData; + async function signInWithGoogle() { const provider = new GoogleAuthProvider(); const user = await signInWithPopup(auth, provider); @@ -36,6 +38,10 @@ navigator.clipboard.writeText(copytext) showToast() } + + + let unpublished = data.published + let username = data.username @@ -47,6 +53,11 @@ +{#if unpublished && data.username != $userData?.username} +
+ +
+{:else}

@{data.username} @@ -102,3 +113,4 @@ > {/if} +{/if} diff --git a/src/routes/[username]/+page.ts b/src/routes/[username]/+page.ts index 76332dc..03aba59 100644 --- a/src/routes/[username]/+page.ts +++ b/src/routes/[username]/+page.ts @@ -1,6 +1,6 @@ import { collection, getDocs, limit, query, where } from 'firebase/firestore'; import type { PageLoad } from './$types'; -import { db, userData } from '$lib/firebase'; +import { db, userData} from '$lib/firebase'; import { error } from '@sveltejs/kit'; export const load = (async ({ params }) => { @@ -20,14 +20,11 @@ export const load = (async ({ params }) => { throw error(404, "that user does not exists") } - if (!data.published) { - throw error(403, `The Profile of @${data.username} is not public!`) - } - return { username: data.username, photoURL: data.photoURL, bio: data.bio, links: data.links ?? [], + published: Boolean } }) satisfies PageLoad; diff --git a/static/403.png b/static/403.png new file mode 100644 index 0000000000000000000000000000000000000000..4788a28fb4797cdc48bfa4be39757805fd4fb715 GIT binary patch literal 32286 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", - input: "hsl(var(--input) / )", - ring: "hsl(var(--ring) / )", - background: "hsl(var(--background) / )", - foreground: "hsl(var(--foreground) / )", - primary: { - DEFAULT: "hsl(var(--primary) / )", - foreground: "hsl(var(--primary-foreground) / )" - }, - secondary: { - DEFAULT: "hsl(var(--secondary) / )", - foreground: "hsl(var(--secondary-foreground) / )" - }, - destructive: { - DEFAULT: "hsl(var(--destructive) / )", - foreground: "hsl(var(--destructive-foreground) / )" - }, - muted: { - DEFAULT: "hsl(var(--muted) / )", - foreground: "hsl(var(--muted-foreground) / )" - }, - accent: { - DEFAULT: "hsl(var(--accent) / )", - foreground: "hsl(var(--accent-foreground) / )" - }, - popover: { - DEFAULT: "hsl(var(--popover) / )", - foreground: "hsl(var(--popover-foreground) / )" - }, - card: { - DEFAULT: "hsl(var(--card) / )", - foreground: "hsl(var(--card-foreground) / )" - } - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)" - }, - fontFamily: { - sans: [...fontFamily.sans] - } - } - }, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )", + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )", + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )", + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )", + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )", + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )", + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + fontFamily: { + sans: [...fontFamily.sans], + }, + }, + }, }; export default config;