Skip to content

3 gerbera #12

@akito0820

Description

@akito0820

3-gerbera/
├─ frontend/
│ ├─ app/
│ │ ├─ layout.tsx
│ │ ├─ page.tsx
│ │ ├─ ask/page.tsx
│ │ └─ admin/page.tsx
│ ├─ lib/
│ │ ├─ firebase.ts
│ │ ├─ auth.ts
│ │ └─ i18n.ts
│ ├─ public/
│ │ └─ logo.png
│ ├─ styles/
│ │ └─ globals.css
│ └─ package.json
├─ backend/
│ ├─ server.js
│ ├─ models/
│ │ └─ Question.js
│ ├─ routes/
│ │ └─ questions.js
│ └─ package.json
├─ README.md
└─ .gitignore
export const SUPER_ADMINS = ["artyomchik50@gmail.com"];

export function getRole(email?: string){
if(!email) return "USER";
return SUPER_ADMINS.includes(email?.toLowerCase()!) ? "SUPER_ADMIN" : "USER";
}
import { initializeApp } from "firebase/app";
import { getAuth, GoogleAuthProvider } from "firebase/auth";

const firebaseConfig = {
apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY!,
authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN!,
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID!,
};

const app = initializeApp(firebaseConfig);
export const auth = getAuth(app);
export const googleProvider = new GoogleAuthProvider();
import i18n from "i18next";
import { initReactI18next } from "react-i18next";

i18n.use(initReactI18next).init({
resources: {
uz:{translation:{title:"3 Gerbera",ask:"Savol berish"}},
en:{translation:{title:"3 Gerbera",ask:"Ask a question"}},
ru:{translation:{title:"3 Gerbera",ask:"Задать вопрос"}},
zh:{translation:{title:"3 Gerbera",ask:"提问"}},
},
lng:"uz", fallbackLng:"en", interpolation:{escapeValue:false}
});
export default i18n;
"use client";
import { useTranslation } from "react-i18next";
import "../lib/i18n";

export default function Home() {
const { t, i18n } = useTranslation();
return (


3 Gerbera Logo


{t("title")}


<select onChange={e=>i18n.changeLanguage(e.target.value)}>
UZ
EN
RU
ZH

{t("ask")}

);
}
"use client";
import { useState } from "react";
import { auth } from "../../lib/firebase";

export default function Ask() {
const [text,setText]=useState("");
const [type,setType]=useState("public");

async function submit(){
const user = auth.currentUser;
await fetch(${process.env.NEXT_PUBLIC_API_URL}/questions,{
method:"POST",
headers:{"Content-Type":"application/json"},
body:JSON.stringify({
text, type,
email:user?.email,
})
});
setText("");
alert("Yuborildi");
}

return (


<textarea value={text} onChange={e=>setText(e.target.value)} />
<select value={type} onChange={e=>setType(e.target.value)}>
Ommaviy
Shaxsiy

Yuborish

);
}
"use client";
import { useEffect, useState } from "react";
import { auth } from "../../lib/firebase";
import { getRole } from "../../lib/auth";

export default function Admin(){
const [items,setItems]=useState<any[]>([]);

useEffect(()=>{
const email = auth.currentUser?.email || "";
if (getRole(email)!=="SUPER_ADMIN") return;
fetch(${process.env.NEXT_PUBLIC_API_URL}/questions)
.then(r=>r.json()).then(setItems);
},[]);

return (


Admin Panel


{items.map(q=>(

{q.type} — {q.text} ({q.email})

))}

);
}
import express from "express";
import mongoose from "mongoose";
import cors from "cors";
import questions from "./routes/questions.js";

const app = express();
app.use(cors());
app.use(express.json());

mongoose.connect(process.env.MONGO_URL);
app.use("/questions", questions);

app.listen(process.env.PORT || 4000, ()=>console.log("Backend ishlamoqda"));
import mongoose from "mongoose";
export default mongoose.model("Question", new mongoose.Schema({
text:String,
type:String,
email:String,
createdAt:{type:Date, default:Date.now}
}));
import express from "express";
import Question from "../models/Question.js";
const r = express.Router();

r.post("/", async (req,res)=>{
const q = await Question.create(req.body);
res.json(q);
});

r.get("/", async (req,res)=>{
const all = await Question.find().sort({createdAt:-1});
res.json(all);
});

export default r;
NEXT_PUBLIC_FIREBASE_API_KEY=apiKey
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=authDomain
NEXT_PUBLIC_FIREBASE_PROJECT_ID=projectId
NEXT_PUBLIC_API_URL=https://3-gerbera-backend.vercel.app
MONGO_URL=mongodb+srv://USERNAME:PASSWORD@cluster0.mongodb.net/3gerbera?retryWrites=true&w=majority
PORT=4000

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions