diff --git a/cypress/e2e/adminNavLink.cy.js b/cypress/e2e/adminNavLink.cy.js
new file mode 100644
index 0000000..0b0ae36
--- /dev/null
+++ b/cypress/e2e/adminNavLink.cy.js
@@ -0,0 +1,70 @@
+describe('The admin nav link', () => {
+ beforeEach(() => {
+ cy.exec('npm run db:seed')
+ })
+ afterEach(() => {
+ cy.exec('npm run db:wipe')
+ })
+
+ describe('when logged in as an admin', () => {
+ beforeEach(() => {
+ cy.loginAsAdmin()
+ })
+
+ it('shows the admin link on the home page', () => {
+ cy.visit('/home')
+ cy.get('#admin-link')
+ .should('be.visible')
+ .and('have.attr', 'href', '/admin')
+ })
+
+ it('shows the admin link on the today page', () => {
+ cy.visit('/today')
+ cy.get('#admin-link')
+ .should('be.visible')
+ .and('have.attr', 'href', '/admin')
+ })
+
+ it('shows the admin link on the user texts page', () => {
+ cy.visit('/texts')
+ cy.get('#admin-link')
+ .should('be.visible')
+ .and('have.attr', 'href', '/admin')
+ })
+
+ it('navigates to the admin page when clicked', () => {
+ cy.visit('/home')
+ cy.get('#admin-link').click()
+ cy.url().should('include', '/admin')
+ cy.get('h1').should('contain', 'Admin')
+ })
+ })
+
+ describe('when logged in as a regular user', () => {
+ beforeEach(() => {
+ cy.loginAsUser()
+ })
+
+ it('does not show the admin link on the home page', () => {
+ cy.visit('/home')
+ cy.get('#admin-link').should('not.be.visible')
+ })
+
+ it('does not show the admin link on the today page', () => {
+ cy.visit('/today')
+ cy.get('#admin-link').should('not.be.visible')
+ })
+
+ it('does not show the admin link on the user texts page', () => {
+ cy.visit('/texts')
+ cy.get('#admin-link').should('not.be.visible')
+ })
+
+ it('does not show the admin link on a user text page', () => {
+ cy.intercept('GET', '/api/texts/0').as('getText')
+ cy.visit('/texts/0')
+ cy.wait('@getText')
+ cy.get('#admin-link').should('not.be.visible')
+ })
+ })
+})
diff --git a/public/js/nav.js b/public/js/nav.js
new file mode 100644
index 0000000..f0ac386
--- /dev/null
+++ b/public/js/nav.js
@@ -0,0 +1,18 @@
+document.addEventListener('DOMContentLoaded', async () => {
+ const adminLink = document.getElementById('admin-link');
+ if (adminLink === null) {
+ return;
+ }
+
+ const response = await fetch('/api/auth/me', {
+ credentials: 'same-origin',
+ });
+ if (!response.ok) {
+ return;
+ }
+
+ const body = await response.json();
+ if (body.user && body.user.isAdmin === true) {
+ adminLink.hidden = false;
+ }
+});
diff --git a/views/templates/home.php b/views/templates/home.php
index 63cfbfd..2a0e13c 100644
--- a/views/templates/home.php
+++ b/views/templates/home.php
@@ -17,6 +17,8 @@
Today's schedule
+ Admin
@@ -43,6 +45,7 @@
+