You can contribute to our website development or add your
documents and user account to eeXiv on our{' '}
-
+
GitHub repository
.
diff --git a/src/app/affiliation/[shortName]/page.tsx b/src/app/affiliation/[shortName]/page.tsx
index cdf2f84..5c2cb16 100644
--- a/src/app/affiliation/[shortName]/page.tsx
+++ b/src/app/affiliation/[shortName]/page.tsx
@@ -36,20 +36,24 @@ export default function Page({
return (
-
+
-
+
+
{name}
-
{short}
+
{short}
+
diff --git a/src/app/author/[author]/AuthorDisplay.tsx b/src/app/author/[author]/AuthorDisplay.tsx
index 81e73c7..7fde590 100644
--- a/src/app/author/[author]/AuthorDisplay.tsx
+++ b/src/app/author/[author]/AuthorDisplay.tsx
@@ -1,11 +1,12 @@
import Link from 'next/link'
-import { Fragment } from 'react'
+import { Fragment, Suspense } from 'react'
import { affiliations, nationalities, authors } from '../../db/data'
import { Zilla_Slab } from 'next/font/google'
import { notFound } from 'next/navigation'
import DocumentCard from '@/app/components/DocumentCard'
import findDocumentsByAuthor from './findDocumentsByAuthor'
import cardEffects from '@/app/styles/cardEffects.module.css'
+import KonamiSnowfall from './KonamiSnowfall'
const zillaSlab = Zilla_Slab({ subsets: ['latin'], weight: ['500'] })
@@ -26,6 +27,7 @@ export default function AuthorDisplay({
const mainPosition = affiliation[0].split('@')[0]
const mainAffiliation = affiliations[mainAffiliationShort]
const { website } = data
+
return (
<>
{mainPosition} at
@@ -40,17 +42,17 @@ export default function AuthorDisplay({
- eeXiv 2.1 has been released! Documents are now statically generated
- for instant loading speeds.{' '}
+ eeXiv 2.2 has been released! You can now select document version and
+ export as BibTex.{' '}
+
eeXiv is currently under active development! There may be major
updates, breaking changes, or weird bugs. Report bugs, suggest new
features, or give us feedback at{' '}
-
+
our issue tracker.
Want to upload your documents or just make yourself a profile on
- eeXiv? Check our about page for more
- information!
+ eeXiv? Check our{' '}
+
+ about page
+ {' '}
+ for more information!
diff --git a/src/app/db/data.ts b/src/app/db/data.ts
index 42163a9..1f7f0e7 100644
--- a/src/app/db/data.ts
+++ b/src/app/db/data.ts
@@ -1,31 +1,3 @@
-/*
-documents db schema
-documents {
- slug: {
- manifest: {
- title: string
- authors: string[]
- date: unix epoch integer[] -> if multiple revisions, put the earlier dates first
- type: presentation | report | whitepaper | other
- latest: integer >= 1 -> the latest revision of the document (earliest = 1)
- keywords: string[]
- topics: string[]
- references: string[],
- code: url[]
- },
- abstract: string,
- file: pdf | docx | pptx | targz | other, named file[rev].[ext]
- (eg. revision 1 = file1.pdf, revision 2 = file2.pdf, etc)
- the "latest" should be the latest revision
- citation: a string that can be used to cite the document
- reviewers: an array of reviewers, following the reviewer format. if you specify a local
- profile username, it will link to the author's profile, and take priority over the link
- status: draft | under review | reviewed | published no review
- note: published no review should be used for documents where peer review
- is not appropriate or unnecessary
- }
-}
-*/
export type FileType = 'pdf' | 'docx' | 'pptx' | 'tar.gz' | 'other'
export type DocumentType =
| 'presentation'
@@ -42,11 +14,13 @@ export type reviewer = {
profile?: string
url?: string
}
+
export type DocumentStatus =
| 'draft'
| 'under review'
| 'reviewed'
| 'published no review'
+
export interface Document {
manifest: DocumentManifest
abstract: string
@@ -415,7 +389,7 @@ export const authors: Readonly<{ [key: string]: Author }> = {
formerAffiliations: ['Programming Lead@1280-programming'],
image: '/img/profiles/avenkatesh.png',
nationality: ['ind', 'eth', 'usa'],
- bio: 'The king of jank.',
+ bio: 'King of jank. Hacker in JS, TS, R, and Python. Capitalist innovator. EECS creator. eeXiv co-founder.',
website: 'https://github.com/quantum9Innovation',
},
ywu: {
@@ -441,7 +415,7 @@ export const authors: Readonly<{ [key: string]: Author }> = {
'Student@srvhs',
],
image: '/img/profiles/wlin.jpg',
- nationality: ['twn', 'chn', 'jpn', 'usa'],
+ nationality: ['twn', 'usa'],
formerAffiliations: ['Intern@raid-zero'],
bio: 'Hi, I am Kaito or Warren. I am a Self-taught programmer and engineer. I go around doing dumb things such as my projects. I have a dream of building a community. I am currently part of many projects.',
website: 'https://kaitotlex.carrd.co/',
@@ -534,6 +508,16 @@ export const authors: Readonly<{ [key: string]: Author }> = {
image: '/img/profiles/cbordalo.jpg',
nationality: ['phl', 'usa'],
},
+ bgraham: {
+ name: {
+ first: 'Benjamin',
+ last: 'Graham',
+ },
+ affiliation: ['Student@srvhs'],
+ image: '/img/profiles/bgraham.jpg',
+ bio: 'Unrelated to Ben Garrison. Maintains a Signal profile. Most likely to become President of the United States.',
+ nationality: ['usa'],
+ },
}
export interface Affiliation {
@@ -545,7 +529,7 @@ export interface Affiliation {
export const affiliations: Readonly<{ [key: string]: Affiliation }> = {
'1280-mech': {
- name: "Team 1280, the Ragin' C Biscuits, Mechanical Subteam",
+ name: "Team 1280, the Ragin' C-Biscuits, Mechanical Subteam",
short: '1280 Mech',
image: '/img/logos/1280-main.png',
description: `The mechanical subteam is the backbone of Team 1280, focusing on the physical design, construction, and mechanical integrity of their robots. This subteam is where concepts and designs become tangible, transforming ideas into the moving parts and structural components that give the robots their form and function. The Mechanical subteam's work encompasses a broad range of activities, from drafting initial sketches and CAD modeling to machining parts and assembling complex mechanical systems.
@@ -557,7 +541,7 @@ Collaboration is key within the Mechanical subteam, as its members must coordina
The Mechanical subteam fosters a culture of creativity, innovation, and excellence, encouraging its members to push the boundaries of what is possible. Through their participation in the FIRST Robotics Competition, students develop not only technical skills in mechanical design and engineering but also soft skills such as teamwork, problem-solving, and project management. With access to advanced tools and guided by mentors from various engineering fields, the Mechanical subteam of Team 1280 is a place where future mechanical engineers are nurtured, ready to make their mark in the world of robotics and beyond.`,
},
'1280-eecs': {
- name: "Team 1280, the Ragin' C Biscuits, Electrical Engineering and Computer Science Subteam",
+ name: "Team 1280, the Ragin' C-Biscuits, Electrical Engineering and Computer Science Subteam",
short: '1280 EECS',
image: '/img/logos/eecs-wordmark.png',
description: `The Team 1280 EECS (Electrical Engineering and Computer Science) subteam is an autonomous organization within Team 1280, specializing in the design, programming, and electrical systems that bring their robots to life. As the nerve center of Team 1280, the EECS subteam combines the disciplines of electrical engineering and computer science to develop sophisticated control systems, autonomous functionalities, and robust electrical infrastructures that enable their robots to perform complex tasks and maneuvers in the competitive arena.
@@ -567,10 +551,10 @@ Team 1280 EECS is composed of highly skilled and passionate students who are kee
Team 1280 EECS benefits from mentorship by experienced professionals and alumni, access to state-of-the-art tools and technologies, and a culture that encourages creativity, experimentation, and continuous improvement. As a result, the EECS subteam plays a crucial role in driving Team 1280's success in competitions and inspiring the next generation of engineers and computer scientists.`,
},
'1280-programming': {
- name: "Team 1280, the Ragin' C Biscuits, Programming Subteam (now defunct)",
+ name: "Team 1280, the Ragin' C-Biscuits, Programming Subteam (now defunct)",
short: '1280 Programming',
image: '/img/logos/1280-main.png',
- description: `The former programming subteam of Team 1280, it combined with the Team 1280 electrical subteam in a historic merger to form Team 1280 EECS.`,
+ description: `The former programming subteam of Team 1280, which combined with the Team 1280 electrical subteam in a historic merger to form Team 1280 EECS.`,
},
'usc-viterbi': {
name: 'University of Southern California, Viterbi School of Engineering',
@@ -601,7 +585,7 @@ Team 1280 EECS benefits from mentorship by experienced professionals and alumni,
the wider world.`,
},
'1280-business': {
- name: "Team 1280, the Ragin' C Biscuits, Business Subteam",
+ name: "Team 1280, the Ragin' C-Biscuits, Business Subteam",
short: '1280 Business',
image: '/img/logos/1280-main.png',
description: `The Business subteam of Team 1280 plays a crucial role in ensuring the team's operational success and sustainability. Unlike the engineering-focused subteams, the Business subteam focuses on the financial, organizational, and community aspects of the team's operations. They are responsible for fundraising, sponsorship outreach, budget management, and public relations, ensuring that the team has the necessary resources and support to thrive in their endeavors.
@@ -615,8 +599,8 @@ Through their work, the Business subteam members gain valuable experience in bus
By bridging the gap between engineering innovation and business acumen, the Business subteam ensures that Team 1280 is not only competitive in robotics challenges but also sustainable and impactful in its mission to inspire and educate future generations in STEM fields.`,
},
'raid-zero': {
- name: 'Team 4253 - Raid Zero',
- short: 'Raid 0',
+ name: 'Team 4253, Raid Zero',
+ short: 'Raid Zero',
image: '/img/logos/raid-zero.png',
description: `Team 4253, Raid Zero, hailing from Taipei American School in Taipei, Taipei Special Municipality, Chinese Taipei, has been a formidable presence in the world of robotics since its rookie year in 2012. As a participant in the international FIRST Robotics Competition, Raid Zero exemplifies innovation, teamwork, and the pursuit of excellence in science, technology, engineering, and mathematics (STEM).
[linebreak]
@@ -640,7 +624,7 @@ Raid Zero's influence extends beyond the technical achievements in robotics comp
image: '/img/logos/cal-poly-slo.png',
description: `California Polytechnic State University, San Luis Obispo (Cal Poly SLO) is renowned for its learn-by-doing philosophy that stands at the core of its engineering education. Founded in 1901, Cal Poly SLO's College of Engineering is recognized as one of the premier engineering schools in the nation, offering a hands-on approach to education that prepares students for the practical challenges they will face in the workforce.
[linebreak]
- With a wide array of undergraduate and graduate programs, the College of Engineering at Cal Poly SLO covers disciplines such as aerospace, biomedical, civil and environmental, computer science and software engineering, electrical, industrial and manufacturing, and mechanical engineering among others. This diversity ensures that students can find their niche and develop specialized skills in their chosen field.
+ With a wide array of undergraduate and graduate programs, the College of Engineering at Cal Poly SLO covers disciplines such as aerospace, biomedical, civil and environmental, computer science and software engineering, electrical, industrial and manufacturing, and mechanical engineering, among others. This diversity ensures that students can find their niche and develop specialized skills in their chosen field.
[linebreak]
Cal Poly SLO prides itself on its state-of-the-art laboratories and facilities, which allow students to engage directly with the material they are learning. This hands-on experience is supplemented by a curriculum that encourages interdisciplinary collaboration, critical thinking, and problem-solving skills, ensuring that graduates are well-equipped to contribute to their fields effectively.
[linebreak]
@@ -651,10 +635,10 @@ Raid Zero's influence extends beyond the technical achievements in robotics comp
With its blend of rigorous academics, practical experience, and a supportive community, Cal Poly SLO stands out as a leader in engineering education, preparing the next generation of engineers to face global challenges with innovation and expertise.`,
},
'team-1280': {
- name: `Team 1280, the Ragin' C Biscuits`,
+ name: `Team 1280, the Ragin' C-Biscuits`,
short: 'Team 1280',
image: '/img/logos/1280-main.png',
- description: `We are the San Ramon Valley High School Robotics Team (FRC Team 1280) and we have been competing in the FIRST Robotics Challenge for 16 years. With just 6 weeks to design, build, program, and fundraise for a robot, FRC teaches us teamwork, business, engineering, machinery, and computer design. This year’s challenge is “Deep Space” and we are eagerly awaiting the challenge release and season kickoff in January! We are team of 79 students with 1 full time mentor, 2 part time mentors, and 1 staff liason.
+ description: `We are the San Ramon Valley High School Robotics Team (FRC Team 1280) and we have been competing in the FIRST Robotics Challenge for 16 years. With just 6 weeks to design, build, program, and fundraise for a robot, FRC teaches us teamwork, business, engineering, machinery, and computer design. We are a team of over 50 students with 1 full time mentor, 2 part time mentors, and 1 staff liason.
[linebreak]
Throughout our FRC career, we have won several regional events and numerous awards including: the Rookie Inspiration Award, both the Radio Shack and Rockwell Automation Innovation in Control Awards, the Imagery Award, the Engineering Excellence Award, and the Creativity Award. While we do focus on the competitive aspect of robotics, we also strive to spread the knowledge of STEM through our outreach programs to those who might not otherwise have access to these opportunities.
[linebreak]
diff --git a/src/app/db/loaders.ts b/src/app/db/loaders.ts
index 2af5727..86f0be7 100644
--- a/src/app/db/loaders.ts
+++ b/src/app/db/loaders.ts
@@ -1,5 +1,11 @@
import { Document, Author, Affiliation, Topic, Nationality } from './data'
+/**
+ * Loads a document with the given ID using a web worker if available, and returns a promise that resolves with the document.
+ *
+ * @param {string} id - The ID of the document to load
+ * @return {Promise} A promise that resolves with the loaded document, or rejects with an error
+ */
export const loadDocument = (id: string): Promise => {
return new Promise((resolve, reject) => {
if (typeof Worker !== 'undefined') {
@@ -8,13 +14,12 @@ export const loadDocument = (id: string): Promise => {
{ type: 'module' }
)
- worker.onmessage = (e: MessageEvent<{ [key: string]: Document }>) => {
+ worker.onmessage = (e: MessageEvent) => {
const data = e.data
- const doc: Document | undefined = data[id]
- if (!doc) {
+ if (!data) {
return reject(new Error('404'))
} else {
- resolve(doc)
+ resolve(data)
}
worker.terminate()
}
@@ -24,7 +29,7 @@ export const loadDocument = (id: string): Promise => {
worker.terminate()
}
- worker.postMessage('LOAD')
+ worker.postMessage(id)
} else {
reject(
new Error(
@@ -34,6 +39,9 @@ export const loadDocument = (id: string): Promise => {
}
})
}
+/**
+ * @deprecated This function doesn't improve efficiency and shouldn't be used
+ */
export const loadAllDocuments = (): Promise<{ [key: string]: Document }> => {
return new Promise((resolve, reject) => {
if (typeof Worker !== 'undefined') {
@@ -83,16 +91,15 @@ export const loadAllAuthors = (): Promise<{ [key: string]: Author }> => {
worker.postMessage('LOAD')
} else {
- reject(
- new Error(
- 'Web Workers are not supported in this environment. Please avoid using a prehistoric browser.'
- )
- )
+ return
}
})
}
-export const loadAuthor = (id: string): Promise => {
+export const loadAuthors = (
+ authorIds: string[]
+): Promise<{ [key: string]: Author }> => {
+ 'use client'
return new Promise((resolve, reject) => {
if (typeof Worker !== 'undefined') {
const worker = new Worker(
@@ -101,12 +108,10 @@ export const loadAuthor = (id: string): Promise => {
)
worker.onmessage = (e: MessageEvent<{ [key: string]: Author }>) => {
- const data = e.data
- const author: Author | undefined = data[id]
- if (!author) {
- return reject(new Error('404'))
+ if (typeof e.data === 'object' && Object.keys(e.data).length > 0) {
+ resolve(e.data)
} else {
- resolve(author)
+ reject(new Error('404'))
}
worker.terminate()
}
@@ -116,7 +121,7 @@ export const loadAuthor = (id: string): Promise => {
worker.terminate()
}
- worker.postMessage('LOAD')
+ worker.postMessage(authorIds)
} else {
reject(
new Error(
diff --git a/src/app/db/workers/authorLoader.worker.ts b/src/app/db/workers/authorLoader.worker.ts
index 4ec63fe..0509ee4 100644
--- a/src/app/db/workers/authorLoader.worker.ts
+++ b/src/app/db/workers/authorLoader.worker.ts
@@ -1,7 +1,30 @@
-import { authors } from '../data'
+import { authors, Author } from '../data'
+
+export function getAuthorsById(authorIds: string[]): { [key: string]: Author } {
+ const result: { [key: string]: Author } = {}
+
+ // Iterate through the array of author IDs
+ for (const id of authorIds) {
+ const author = authors[id] // Retrieve the author entry by ID
+ if (author) {
+ result[id] = author // If the author exists, add it to the result object
+ }
+ }
+
+ return result
+}
+
+const checkIsStringArray = (data: unknown): data is string[] => {
+ if (Array.isArray(data)) {
+ return data.every((d) => typeof d === 'string')
+ }
+ return false
+}
onmessage = (e) => {
- if (e.data === 'LOAD') {
- self.postMessage(authors)
- }
+ let authorIds: string[] = []
+ checkIsStringArray(e.data) && (authorIds = e.data as string[])
+ let results = getAuthorsById(authorIds)
+
+ postMessage(results)
}
diff --git a/src/app/db/workers/documentLoader.worker.ts b/src/app/db/workers/documentLoader.worker.ts
index b263e79..1ea6e60 100644
--- a/src/app/db/workers/documentLoader.worker.ts
+++ b/src/app/db/workers/documentLoader.worker.ts
@@ -1,7 +1,5 @@
import { documents } from '../data'
onmessage = (e) => {
- if (e.data === 'LOAD') {
- self.postMessage(documents)
- }
+ typeof e.data === 'string' && postMessage(documents[e.data])
}
diff --git a/src/app/document/page.tsx b/src/app/document/page.tsx
deleted file mode 100644
index 0b7b6ad..0000000
--- a/src/app/document/page.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function Page() {
- return (
-
- This is a placeholder for a document browser that will be implemented in
- the future. In the meantime, you can view specific documents by searching.
-
If you encounter any accessibility-related issues related to your use of
our site, it is likely because of our jank code architecture.
diff --git a/src/app/legal/copyright/page.tsx b/src/app/legal/copyright/page.tsx
index 8c75ebd..88a94ca 100644
--- a/src/app/legal/copyright/page.tsx
+++ b/src/app/legal/copyright/page.tsx
@@ -2,7 +2,9 @@ import Link from 'next/link'
export default function Page() {
return (
diff --git a/src/app/status/notifications/page.tsx b/src/app/status/notifications/page.tsx
index 537d862..4e5d04d 100644
--- a/src/app/status/notifications/page.tsx
+++ b/src/app/status/notifications/page.tsx
@@ -3,12 +3,15 @@ import Link from 'next/link'
export default function Page() {
return (
-
Get status notifications
+
+ Get status notifications
+
We currently do not have the technical support to implement mailing
- lists in eeXiv. Check status frequently for updates.
- The best way to stay connected with the status of the eeXiv project is
- to watch it on GitHub.
+ lists in eeXiv. Check status frequently for
+ updates. The best way to stay connected with the status of the eeXiv
+ project is to watch it on{' '}
+ GitHub.
We currently do not have the technical support to implement mailing
lists in eeXiv. Check back later for updates. The best way to stay
diff --git a/src/app/topic/[slug]/page.tsx b/src/app/topic/[slug]/page.tsx
index 5cf7449..48a6b93 100644
--- a/src/app/topic/[slug]/page.tsx
+++ b/src/app/topic/[slug]/page.tsx
@@ -1,6 +1,7 @@
import { Zilla_Slab } from 'next/font/google'
import { topics } from '@/app/db/data'
import { notFound } from 'next/navigation'
+import string2hex from '@/app/utils/string2hex'
const zillaSlab = Zilla_Slab({ subsets: ['latin'], weight: ['500'] })
@@ -17,12 +18,17 @@ export default function Page({
const { name, description, wiki } = topic
return (
-