Skip to content

Commit

Permalink
Merge pull request #2 from metalbear-co/frontend
Browse files Browse the repository at this point in the history
add frontend
  • Loading branch information
aviramha authored Jan 7, 2024
2 parents 2927b0f + 394d088 commit f7d130b
Show file tree
Hide file tree
Showing 20 changed files with 5,217 additions and 2 deletions.
7 changes: 6 additions & 1 deletion ingress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ metadata:
networking.gke.io/managed-certificates: playground-metalbear-dev-cert
kubernetes.io/ingress.class: "gce"
spec:
defaultBackend:
service:
name: ip-visit-frontend
port:
number: 80
rules:
- http:
paths:
Expand All @@ -14,7 +19,7 @@ spec:
backend:
service:
name: ip-visit-counter
port:
port:
number: 80
- path: /health
pathType: Prefix
Expand Down
3 changes: 3 additions & 0 deletions ip-visit-frontend/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
67 changes: 67 additions & 0 deletions ip-visit-frontend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
FROM node:18-alpine AS base

# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app

# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
else echo "Lockfile not found." && exit 1; \
fi


# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN yarn build

# If using npm comment out above and use below instead
# RUN npm run build

# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public

# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs

EXPOSE 80

ENV PORT 80
# set hostname to localhost
ENV HOSTNAME "0.0.0.0"

# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
CMD ["node", "server.js"]
36 changes: 36 additions & 0 deletions ip-visit-frontend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.

This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!

## Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
55 changes: 55 additions & 0 deletions ip-visit-frontend/app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: "ip-visit-frontend"
replicas: 1
template:
metadata:
labels:
app: ip-visit-frontend
spec:
containers:
- name: main
image: ghcr.io/metalbear-co/playground-ip-visit-frontend:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 3
periodSeconds: 3
env:
- name: PORT
value: "80"


---

apiVersion: v1
kind: Service
metadata:
name: ip-visit-frontend
spec:
ports:
- port: 80
targetPort: 80
selector:
app: ip-visit-frontend
Binary file added ip-visit-frontend/app/favicon.ico
Binary file not shown.
20 changes: 20 additions & 0 deletions ip-visit-frontend/app/globals.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

:root {
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 214, 219, 220;
--background-end-rgb: 255, 255, 255;
}


body {
color: rgb(var(--foreground-rgb));
background: linear-gradient(
to bottom,
transparent,
rgb(var(--background-end-rgb))
)
rgb(var(--background-start-rgb));
}
22 changes: 22 additions & 0 deletions ip-visit-frontend/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import './globals.css'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
}

export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body className={inter.className}>{children}</body>
</html>
)
}
29 changes: 29 additions & 0 deletions ip-visit-frontend/app/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"use client";

import { IPInfo } from "@/components/ipinfo"
import useSWR from 'swr'

const fetcher = (url: string) => fetch(url, {
method: 'GET',
}).then(res => {
console.log(res);
return res.json();
})


export default function Home() {
const { data, error, isLoading } = useSWR("https://playground.metalbear.dev/count", fetcher)

if (error) {
console.log(error);
return (<main className="flex min-h-screen flex-col items-center justify-between p-24 bg-gray-100"><div>failed to load</div></main>)
}
if (isLoading) return (<main className="flex min-h-screen flex-col items-center justify-between p-24 bg-gray-100"><div>loading...</div></main>)

console.log
return (
<main className="flex min-h-screen flex-col items-center justify-between p-24 bg-gray-100">
<IPInfo ip={data.info.ip} count={data.count} text={data.text} name={data.info.name} />
</main>
)
}
16 changes: 16 additions & 0 deletions ip-visit-frontend/components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "default",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "app/globals.css",
"baseColor": "gray",
"cssVariables": false
},
"aliases": {
"utils": "@/lib/utils",
"components": "@/components"
}
}
35 changes: 35 additions & 0 deletions ip-visit-frontend/components/ipinfo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* This code was generated by v0 by Vercel.
* @see https://v0.dev/t/CiIA7YvXZfT
*/
import { CardTitle, CardHeader, CardContent, Card } from "@/components/ui/card"


export function IPInfo({ count, ip, name, text }: { count: number, ip: string, name: string, text: string }) {
return (
<Card className="max-w-md w-full mx-4">
<CardHeader>
<CardTitle className="text-lg font-bold">API Data</CardTitle>
</CardHeader>
<CardContent>
<div className="grid gap-2">
<div className="flex items-center justify-between">
<span className="font-medium">IP Address:</span>
<span className="text-gray-500">{ip}</span>
</div>
<div className="flex items-center justify-between">
<span className="font-medium">Count:</span>
<span className="text-gray-500">{count}</span>
</div>
<div className="flex items-center justify-between">
<span className="font-medium">Name:</span>
<span className="text-gray-500">{name}</span>
</div>
<div className="flex items-center justify-between">
<span className="font-medium">Text:</span>
<span className="text-gray-500">{text}</span>
</div>
</div>
</CardContent>
</Card> )
}
79 changes: 79 additions & 0 deletions ip-visit-frontend/components/ui/card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import * as React from "react"

import { cn } from "@/lib/utils"

const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-lg border bg-card text-card-foreground shadow-sm",
className
)}
{...props}
/>
))
Card.displayName = "Card"

const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props}
/>
))
CardHeader.displayName = "CardHeader"

const CardTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn(
"text-2xl font-semibold leading-none tracking-tight",
className
)}
{...props}
/>
))
CardTitle.displayName = "CardTitle"

const CardDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
CardDescription.displayName = "CardDescription"

const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
))
CardContent.displayName = "CardContent"

const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
))
CardFooter.displayName = "CardFooter"

export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
Loading

0 comments on commit f7d130b

Please sign in to comment.