diff --git a/ARCHITECHTURE.md b/ARCHITECHTURE.md
new file mode 100644
index 0000000..4b8ee56
--- /dev/null
+++ b/ARCHITECHTURE.md
@@ -0,0 +1,8 @@
+Monorepo. pnpm required for workspaces.
+
+packages/strapi requires Yarn.
+
+Development uses dockerfile with dotenv.
+
+Production uses dokku.
+
diff --git a/Dockerfile.next b/Dockerfile.next
deleted file mode 100644
index adf6823..0000000
--- a/Dockerfile.next
+++ /dev/null
@@ -1,25 +0,0 @@
-FROM node:20-slim AS base
-ENV NEXT_TELEMETRY_DISABLED 1
-RUN corepack enable
-
-FROM base AS build
-WORKDIR /usr/src/fp-monorepo
-RUN mkdir /usr/src/next
-COPY ./pnpm-lock.yaml ./
-COPY ./pnpm-workspace.yaml ./
-COPY ./packages/next/package.json ./packages/next/
-RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store pnpm install
-COPY . .
-RUN pnpm deploy --filter=fp-next /usr/src/next
-
-FROM base AS dev
-WORKDIR /app
-COPY --from=build /usr/src/next /app
-CMD ["pnpm", "run", "dev"]
-
-FROM base AS prod
-WORKDIR /app
-COPY --from=build /usr/src/next /app
-COPY ./packages/next/app.json /app
-ENTRYPOINT ["pnpm"]
-CMD ["start"]
\ No newline at end of file
diff --git a/README.md b/README.md
index 5caf7b0..4ad60b2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,2 @@
# futureporn-monorepo
-## Dev notes
-
-We are using multiple Dockerfiles which is a inefficiency. We are doing this because we deploy using dokku. We think one Dockerfile per package is the only way for dokku to use monorepo paradigm.
\ No newline at end of file
diff --git a/compose.prod.yml b/compose.prod.yml
deleted file mode 100644
index a1c6841..0000000
--- a/compose.prod.yml
+++ /dev/null
@@ -1,103 +0,0 @@
-version: '3.4'
-
-
-services:
-
- link2cid:
- container_name: fp-link2cid
- image: insanity54/link2cid:latest
- ports:
- - "3939:3939"
- environment:
- API_KEY: ${LINK2CID_API_KEY}
- IPFS_URL: "http://ipfs0:5001"
-
- ipfs0:
- container_name: fp-ipfs0
- image: ipfs/kubo:release
- ports:
- - "5001:5001"
- volumes:
- - ./packages/ipfs0:/data/ipfs
-
- cluster0:
- container_name: fp-cluster0
- image: ipfs/ipfs-cluster:latest
- depends_on:
- - ipfs0
- environment:
- CLUSTER_PEERNAME: cluster0
- CLUSTER_SECRET: ${CLUSTER_SECRET} # From shell variable if set
- CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs0/tcp/5001
- CLUSTER_CRDT_TRUSTEDPEERS: '*' # Trust all peers in Cluster
- CLUSTER_RESTAPI_HTTPLISTENMULTIADDRESS: /ip4/0.0.0.0/tcp/9094 # Expose API
- CLUSTER_RESTAPI_BASICAUTHCREDENTIALS: ${CLUSTER_RESTAPI_BASICAUTHCREDENTIALS}
- CLUSTER_MONITORPINGINTERVAL: 2s # Speed up peer discovery
- ports:
- - "127.0.0.1:9094:9094"
- volumes:
- - ./packages/cluster0:/data/ipfs-cluster
-
- strapi:
- container_name: fp-strapi
- image: elestio/strapi-development
- depends_on:
- - db
- environment:
- ADMIN_PASSWORD: ${STRAPI_ADMIN_PASSWORD}
- ADMIN_EMAIL: ${STRAPI_ADMIN_EMAIL}
- BASE_URL: ${STRAPI_BASE_URL}
- SMTP_HOST: 172.17.0.1
- SMTP_PORT: 25
- SMTP_AUTH_STRATEGY: NONE
- SMTP_FROM_EMAIL: sender@email.com
- DATABASE_CLIENT: postgres
- DATABASE_PORT: ${DATABASE_PORT}
- DATABASE_NAME: ${DATABASE_NAME}
- DATABASE_USERNAME: ${DATABASE_USERNAME}
- DATABASE_PASSWORD: ${DATABASE_PASSWORD}
- JWT_SECRET: ${STRAPI_JWT_SECRET}
- ADMIN_JWT_SECRET: ${STRAPI_ADMIN_JWT_SECRET}
- APP_KEYS: ${STRAPI_APP_KEYS}
- NODE_ENV: development
- DATABASE_HOST: db
- API_TOKEN_SALT: ${STRAPI_API_TOKEN_SALT}
- TRANSFER_TOKEN_SALT: ${STRAPI_TRANSFER_TOKEN_SALT}
- ports:
- - "1337:1337"
- volumes:
- - ./packages/strapi/config:/opt/app/config
- - ./packages/strapi/src:/opt/app/src
- # - ./packages/strapi/package.json:/opt/package.json
- # - ./packages/strapi/yarn.lock:/opt/yarn.lock
- - ./packages/strapi/.env:/opt/app/.env
- - ./packages/strapi/public/uploads:/opt/app/public/uploads
- # - ./packages/strapi/entrypoint.sh:/opt/app/entrypoint.sh
-
- next:
- container_name: fp-next
- build:
- context: ./packages/next
- dockerfile: Dockerfile
- environment:
- REVALIDATION_TOKEN: ${NEXT_REVALIDATION_TOKEN}
- NODE_ENV: production
- ports:
- - "3000:3000"
- volumes:
- - ./packages/next/
-
-
- db:
- container_name: fp-db
- image: postgres:latest
- restart: always
- environment:
- POSTGRES_DB: ${DATABASE_NAME}
- POSTGRES_USER: ${DATABASE_USERNAME}
- POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
- PGDATA: /var/lib/postgresql/data
- volumes:
- - ./packages/db/pgdata:/var/lib/postgresql/data
- ports:
- - "5433:5432"
\ No newline at end of file
diff --git a/compose.yml b/compose.yml
index 27f4b92..affc3e9 100644
--- a/compose.yml
+++ b/compose.yml
@@ -60,7 +60,7 @@ services:
image: fp-strapi:14
build:
context: ./packages/strapi
- dockerfile: Dockerfile.strapi
+ dockerfile: Dockerfile
restart: on-failure
depends_on:
- db
@@ -116,7 +116,7 @@ services:
container_name: fp-next
build:
context: .
- dockerfile: Dockerfile.next
+ dockerfile: Dockerfile
target: dev
restart: on-failure
environment:
diff --git a/next.Dockerfile b/next.Dockerfile
index cdb9e38..9edb233 100644
--- a/next.Dockerfile
+++ b/next.Dockerfile
@@ -1,25 +1,26 @@
FROM node:20-slim AS base
-ENV NEXT_TELEMETRY_DISABLED 1
+
+# Install dependencies only when needed
+FROM base AS deps
RUN corepack enable
-FROM base AS build
-WORKDIR /usr/src/fp-monorepo
-RUN mkdir /usr/src/next
-COPY ./pnpm-lock.yaml ./
-COPY ./pnpm-workspace.yaml ./
-COPY ./packages/next/package.json ./packages/next/
-RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store pnpm install
-COPY . .
-RUN pnpm deploy --filter=fp-next /usr/src/next
-FROM base AS dev
+
+FROM deps AS build
+WORKDIR /usr/src/app
+COPY . .
+ENV NEXT_TELEMETRY_DISABLED 1
+RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store pnpm install
+RUN pnpm run -r build
+RUN pnpm deploy --filter=fp-next /app
+
+
+FROM deps AS dev
WORKDIR /app
-COPY --from=build /usr/src/next /app
+COPY --from=build /usr/src/app /app
CMD ["pnpm", "run", "dev"]
-FROM base AS next
+FROM deps AS next
WORKDIR /app
-COPY --from=build /usr/src/next /app
-COPY ./packages/next/app.json /app
-ENTRYPOINT ["pnpm"]
-CMD ["start"]
\ No newline at end of file
+COPY --from=build /usr/src/app /app
+CMD ["pnpm", "start"]
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..f32481f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "futureporn",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "kompose": "kompose convert --file compose.yml -c --out ./charts",
+ "deploy:bot": "echo @todo",
+ "deploy:next": "git push origin:next main",
+ "deploy:link2cid": "echo @todo",
+ "deploy:strapi": "echo @todo",
+ "deploy:uppy": "echo @todo",
+ "deploy": "echo @todo"
+ },
+ "keywords": [],
+ "author": "@cj_clippy",
+ "license": "CC0-1.0"
+}
diff --git a/packages/next/app/components/archive-progress.tsx b/packages/next/app/components/archive-progress.tsx
index 2de480b..2783f2f 100644
--- a/packages/next/app/components/archive-progress.tsx
+++ b/packages/next/app/components/archive-progress.tsx
@@ -6,18 +6,19 @@ export interface IArchiveProgressProps {
}
export default async function ArchiveProgress ({ vtuber }: IArchiveProgressProps) {
- const streams = await getAllStreamsForVtuber(vtuber.id);
- const goodStreams = await getAllStreamsForVtuber(vtuber.id, ['good']);
- const issueStreams = await getAllStreamsForVtuber(vtuber.id, ['issue']);
- const totalStreams = streams.length;
- const eligibleStreams = issueStreams.length+goodStreams.length;
+ // const streams = await getAllStreamsForVtuber(vtuber.id);
+ // const goodStreams = await getAllStreamsForVtuber(vtuber.id, ['good']);
+ // const issueStreams = await getAllStreamsForVtuber(vtuber.id, ['issue']);
+ // const totalStreams = streams.length;
+ // const eligibleStreams = issueStreams.length+goodStreams.length;
- // Check if totalStreams is not zero before calculating completedPercentage
- const completedPercentage = (totalStreams !== 0) ? Math.round(eligibleStreams / totalStreams * 100) : 0;
- return (
-
-
{eligibleStreams}/{totalStreams} Streams Archived ({completedPercentage}%)
-
-
- )
+ // // Check if totalStreams is not zero before calculating completedPercentage
+ // const completedPercentage = (totalStreams !== 0) ? Math.round(eligibleStreams / totalStreams * 100) : 0;
+ // return (
+ //
+ //
{eligibleStreams}/{totalStreams} Streams Archived ({completedPercentage}%)
+ //
+ //
+ // )
+ return "@todo"
}
\ No newline at end of file
diff --git a/packages/next/app/components/cal.tsx b/packages/next/app/components/cal.tsx
deleted file mode 100644
index 81ee719..0000000
--- a/packages/next/app/components/cal.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-'use client';
-// greets https://github.com/wa0x6e/cal-heatmap-react-starter/blob/main/src/components/cal-heatmap.tsx
-
-import CalHeatmap from 'cal-heatmap';
-// @ts-ignore cal-heatmap is jenk
-import Legend from 'cal-heatmap/plugins/Legend';
-// @ts-ignore cal-heatmap is jenk
-import Tooltip from 'cal-heatmap/plugins/Tooltip';
-import { DataRecord } from 'cal-heatmap/src/options/Options';
-import 'cal-heatmap/cal-heatmap.css';
-import dayjs from 'dayjs';
-import { useEffect, useState, useRef } from 'react';
-import { useRouter } from 'next/navigation';
-import { getSafeDate } from '@/lib/dates';
-
-export interface ICalProps {
- data: DataRecord[];
- slug: string;
-}
-
-
-export function Cal({ data, slug }: ICalProps) {
- const router = useRouter();
- const [cellSize, setCellSize] = useState(13);
- const [targetElementId, setTargetElementId] = useState('');
-
- const generateUniqueId = () => {
- return `cal-${Math.random().toString(36).substring(2, 9)}`;
- };
-
-
-
- useEffect(() => {
- const updateCellSize = () => {
- const windowWidth = window.innerWidth;
- if (windowWidth > 1400) {
- setCellSize(15); // Adjust the cell size for width > 1400px
- } else if (windowWidth > 730) {
- setCellSize(10); // Adjust the cell size for width > 730px
- } else {
- setCellSize(3); // Adjust the cell size for width <= 730px
- }
- }
- updateCellSize();
- // Event listener to update cell size on window resize
- window.addEventListener('resize', updateCellSize);
-
- return () => {
- window.removeEventListener('resize', updateCellSize);
- };
-
- }, [])
-
-
- useEffect(() => {
- setTargetElementId(generateUniqueId());
- }, []);
-
- useEffect(() => {
- if (!targetElementId) return;
- const cal = new CalHeatmap();
- // @ts-ignore
- cal.on('click', (
- event: string,
- timestamp: number,
- value: number
- ) => {
- router.push(`/vt/${slug}/stream/${getSafeDate(new Date(timestamp))}`);
- // console.log(`slug=${slug} safeDate=${getSafeDate(new Date(timestamp))}`);
- });
-
- cal.paint(
- {
- itemSelector: `#${targetElementId}`,
- scale: {
- color: {
- // @ts-ignore this shit is straight from the example website
- domain: ['missing', 'issue', 'good'],
- type: 'ordinal',
- range: ['red', 'yellow', 'green']
- }
- },
- theme: 'dark',
- verticalOrientation: false,
- data: {
- source: data,
- x: 'date',
- y: 'value',
- // @ts-ignore this shit is straight from the example website
- groupY: d => d[0]
- },
- range: 12,
- date: { start: data[0].date },
- domain: {
- type: 'month',
- gutter: 4,
- label: { text: 'MMM', textAlign: 'start', position: 'top' }
- },
- subDomain: {
- type: 'ghDay',
- radius: 2,
- width: cellSize,
- height: cellSize,
- gutter: 4,
- }
- }, [
- [
- Tooltip,
- {
- text: ((ts: number, value: string, dayjsDate: dayjs.Dayjs) => {
- return `${!!value ? value+' - '+dayjsDate.toString() : dayjsDate.toString() }`;
- })
- }
- ]
- ]);
-
- }, [targetElementId, data, cellSize, router, slug]);
-
-
- return (
- <>
-
- >
- )
-}
\ No newline at end of file
diff --git a/packages/next/app/components/tagger.tsx b/packages/next/app/components/tagger.tsx
index 2918642..2b883ab 100644
--- a/packages/next/app/components/tagger.tsx
+++ b/packages/next/app/components/tagger.tsx
@@ -83,7 +83,7 @@ export function Tagger({ vod, setTimestamps }: ITaggerProps): React.JSX.Element
if (authData?.accessToken) {
setIsAuthed(true);
}
- }, [isAuthed]);
+ }, [isAuthed, authData]);
async function getRandomSuggestions() {
diff --git a/packages/next/app/components/upload-form.tsx b/packages/next/app/components/upload-form.tsx
index 650cbf6..8e58084 100644
--- a/packages/next/app/components/upload-form.tsx
+++ b/packages/next/app/components/upload-form.tsx
@@ -253,7 +253,7 @@ export default function UploadForm({ vtubers }: IUploadFormProps) {
{...register('vtuber')}
>
{vtubers.map((vtuber: IVtuber) => (
-
+
))}
diff --git a/packages/next/app/components/vod-page.tsx b/packages/next/app/components/vod-page.tsx
index d57f67a..fce06c2 100644
--- a/packages/next/app/components/vod-page.tsx
+++ b/packages/next/app/components/vod-page.tsx
@@ -10,8 +10,8 @@ import LinkableHeading from './linkable-heading';
export function getVodTitle(vod: IVod): string {
- console.log('lets getVodTitle, ey?')
- console.log(JSON.stringify(vod, null, 2))
+ // console.log('lets getVodTitle, ey?')
+ // console.log(JSON.stringify(vod, null, 2))
return vod.attributes.title || vod.attributes.announceTitle || (vod.attributes?.date2 && vod.attributes?.vtuber?.data?.attributes?.displayName) ? `${vod.attributes.vtuber.data.attributes.displayName} ${vod.attributes.date2}` : `VOD ${vod.id}`;
}
diff --git a/packages/next/app/health/page.tsx b/packages/next/app/health/page.tsx
index 657976e..1336688 100644
--- a/packages/next/app/health/page.tsx
+++ b/packages/next/app/health/page.tsx
@@ -1,11 +1,9 @@
-import Tes from '@/assets/svg/tes';
export default async function Page() {
return (
)
diff --git a/packages/next/app/lib/constants.ts b/packages/next/app/lib/constants.ts
index 174bccd..c7cdf36 100644
--- a/packages/next/app/lib/constants.ts
+++ b/packages/next/app/lib/constants.ts
@@ -1,7 +1,7 @@
// export const strapiUrl = (process.env.NODE_ENV === 'production') ? 'https://portal.futureporn.net' : 'https://chisel.sbtp:1337'
// export const siteUrl = (process.env.NODE_ENV === 'production') ? 'https://futureporn.net' : 'http://localhost:3000'
-export const siteUrl = process.env.NEXT_PUBLIC_SITE_URL
-export const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
+export const siteUrl = ''+process.env.NEXT_PUBLIC_SITE_URL
+export const strapiUrl = ''+process.env.NEXT_PUBLIC_STRAPI_URL
export const patreonSupporterBenefitId: string = '4760169'
export const patreonQuantumSupporterId: string = '10663202'
export const patreonVideoAccessBenefitId: string = '13462019'
diff --git a/packages/next/app/vt/[slug]/history/page.tsx b/packages/next/app/vt/[slug]/history/page.tsx
deleted file mode 100644
index 4c25482..0000000
--- a/packages/next/app/vt/[slug]/history/page.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-
-import { getVtuberBySlug } from '@/lib/vtubers';
-import { getAllStreamsForVtuber } from '@/lib/streams';
-import NotFound from '../not-found';
-import { DataRecord } from 'cal-heatmap/src/options/Options';
-import { Cal } from '@/components/cal';
-
-interface IPageProps {
- params: {
- slug: string;
- };
-}
-
-function getArchiveStatusValue(archiveStatus: string): number {
- if (archiveStatus === 'good') return 2;
- if (archiveStatus === 'issue') return 1;
- else return 0 // missing
-}
-
-function sortDataRecordsByDate(records: DataRecord[]) {
- return records.sort((a, b) => {
- if (typeof a.date === 'string' && typeof b.date === 'string') {
- return a.date.localeCompare(b.date);
- } else {
- // Handle comparison when date is not a string (e.g., when it's a number)
- // For instance, you might want to convert numbers to strings or use a different comparison logic.
- // Example assuming number to string conversion:
- return String(a.date).localeCompare(String(b.date));
- }
- });
-}
-
-
-export default async function Page({ params: { slug } }: IPageProps) {
- const vtuber = await getVtuberBySlug(slug);
- if (!vtuber) return
- const streams = await getAllStreamsForVtuber(vtuber.id);
- const streamsByYear: { [year: string]: DataRecord[] } = {};
- streams.forEach((stream) => {
- const date = new Date(stream.attributes.date);
- const year = date.getFullYear();
- if (!streamsByYear[year]) {
- streamsByYear[year] = [];
- }
- streamsByYear[year].push({
- date: new Date(stream.attributes.date).toISOString(),
- value: stream.attributes.archiveStatus,
- });
- });
- // Sort the data records within each year's array
- for (const year in streamsByYear) {
- streamsByYear[year] = sortDataRecordsByDate(streamsByYear[year]);
- }
-
-
- return (
-
- {Object.keys(streamsByYear).map((year) => {
- return (
-
-
{year}
- {/*
{JSON.stringify(streamsByYear[year], null, 2)}
*/}
-
-
- )
- })}
-
-
- )
-}
diff --git a/packages/next/app/vt/[slug]/page.tsx b/packages/next/app/vt/[slug]/page.tsx
index 910cb64..c9c5a58 100644
--- a/packages/next/app/vt/[slug]/page.tsx
+++ b/packages/next/app/vt/[slug]/page.tsx
@@ -30,217 +30,218 @@ export default async function Page({ params }: { params: { slug: string } }) {
const vods = await getVodsForVtuber(vtuber.id, 1, 9);
if (!vods) notFound();
- const missingStreams = await getAllStreamsForVtuber(vtuber.id, ['missing']);
- const issueStreams = await getAllStreamsForVtuber(vtuber.id, ['issue']);
- const goodStreams = await getAllStreamsForVtuber(vtuber.id, ['good']);
+ return '@todo'
+// const missingStreams = await getAllStreamsForVtuber(vtuber.id, ['missing']);
+// const issueStreams = await getAllStreamsForVtuber(vtuber.id, ['issue']);
+// const goodStreams = await getAllStreamsForVtuber(vtuber.id, ['good']);
- // return (
- // <>
- // hi mom!
- //
- //
- // {JSON.stringify(missingStreams, null, 2)}
- //
- //
- // >
- // )
+// // return (
+// // <>
+// // hi mom!
+// //
+// //
+// // {JSON.stringify(missingStreams, null, 2)}
+// //
+// //
+// // >
+// // )
- return (
- <>
- {vtuber && (
- <>
-
+// return (
+// <>
+// {vtuber && (
+// <>
+//
-
-
-
{vtuber.attributes.displayName}
-
-
-
-
-
-
{vtuber.attributes.description1}
-
{vtuber.attributes.description2}
-
-
+//
+//
+//
{vtuber.attributes.displayName}
+//
+//
+//
+//
+//
+//
{vtuber.attributes.description1}
+//
{vtuber.attributes.description2}
+//
+//
-
- Socials
-
+//
+// Socials
+//
-
-
- {vtuber.attributes.patreon && (
-
-
- Patreon
-
-
- )}
- {vtuber.attributes.twitter && (
-
-
- Twitter
-
-
- )}
- {vtuber.attributes.youtube && (
-
-
- YouTube
-
-
- )}
- {vtuber.attributes.twitch && (
-
-
- Twitch
-
-
- )}
- {vtuber.attributes.tiktok && (
-
-
- TikTok
-
-
- )}
- {vtuber.attributes.fansly && (
-
-
- Fansly
-
-
- )}
- {vtuber.attributes.onlyfans && (
-
-
-
-
- OnlyFans
-
-
- )}
- {vtuber.attributes.pornhub && (
-
- )}
- {vtuber.attributes.reddit && (
-
-
- Reddit
-
-
- )}
- {vtuber.attributes.discord && (
-
-
- Discord
-
-
- )}
- {vtuber.attributes.instagram && (
-
-
- Instagram
-
-
- )}
- {vtuber.attributes.facebook && (
-
-
- Facebook
-
-
- )}
- {vtuber.attributes.merch && (
-
-
- Merch
-
-
- )}
- {vtuber.attributes.chaturbate && (
-
-
- Chaturbate
-
-
- )}
- {vtuber.attributes.throne && (
-
-
- Throne
-
-
- )}
- {vtuber.attributes.linktree && (
-
-
- Linktree
-
-
- )}
- {vtuber.attributes.carrd && (
-
-
- Carrd
-
-
- )}
-
-
+//
+//
+// {vtuber.attributes.patreon && (
+//
+//
+// Patreon
+//
+//
+// )}
+// {vtuber.attributes.twitter && (
+//
+//
+// Twitter
+//
+//
+// )}
+// {vtuber.attributes.youtube && (
+//
+//
+// YouTube
+//
+//
+// )}
+// {vtuber.attributes.twitch && (
+//
+//
+// Twitch
+//
+//
+// )}
+// {vtuber.attributes.tiktok && (
+//
+//
+// TikTok
+//
+//
+// )}
+// {vtuber.attributes.fansly && (
+//
+//
+// Fansly
+//
+//
+// )}
+// {vtuber.attributes.onlyfans && (
+//
+//
+//
+//
+// OnlyFans
+//
+//
+// )}
+// {vtuber.attributes.pornhub && (
+//
+// )}
+// {vtuber.attributes.reddit && (
+//
+//
+// Reddit
+//
+//
+// )}
+// {vtuber.attributes.discord && (
+//
+//
+// Discord
+//
+//
+// )}
+// {vtuber.attributes.instagram && (
+//
+//
+// Instagram
+//
+//
+// )}
+// {vtuber.attributes.facebook && (
+//
+//
+// Facebook
+//
+//
+// )}
+// {vtuber.attributes.merch && (
+//
+//
+// Merch
+//
+//
+// )}
+// {vtuber.attributes.chaturbate && (
+//
+//
+// Chaturbate
+//
+//
+// )}
+// {vtuber.attributes.throne && (
+//
+//
+// Throne
+//
+//
+// )}
+// {vtuber.attributes.linktree && (
+//
+//
+// Linktree
+//
+//
+// )}
+// {vtuber.attributes.carrd && (
+//
+//
+// Carrd
+//
+//
+// )}
+//
+//
- {/*
- Toys
-
+// {/*
+// Toys
+//
- <>
-
- {(toys.pagination.total > toySampleCount) &&
See all of {vtuber.displayName}'s toys}
- > */}
+// <>
+//
+// {(toys.pagination.total > toySampleCount) &&
See all of {vtuber.displayName}'s toys}
+// > */}
-
- Vods
-
+//
+// Vods
+//
-
- {
- (vtuber.attributes.vods) ? (
-
See all {vtuber.attributes.displayName} vods
- ) : (
No VODs have been added, yet.
)
- }
+//
+// {
+// (vtuber.attributes.vods) ? (
+//
See all {vtuber.attributes.displayName} vods
+// ) : (
No VODs have been added, yet.
)
+// }
-
- Streams
-
-
-{/*
-
- Archive Progress
-
-
*/}
+//
+// Streams
+//
+//
+// {/*
+//
+// Archive Progress
+//
+//
*/}
-
- >
- )}
- >
- );
+//
+// >
+// )}
+// >
+// );
}
diff --git a/packages/next/assets/svg/fansly.tsx b/packages/next/assets/svg/fansly.tsx
index fcf575d..03a78dc 100644
--- a/packages/next/assets/svg/fansly.tsx
+++ b/packages/next/assets/svg/fansly.tsx
@@ -1,5 +1,5 @@
import * as React from "react"
-const SvgComponent = (props) => (
+const SvgComponent = (props: any) => (