Full document, spreadsheet, slideshow, and diagram tooling
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: require sign-in — remove local-only skip option

Sign-in is now mandatory. The skip button and all references are
removed. The login modal is non-dismissible.

Closes #32

+2 -25
-1
src/index.html
··· 180 180 <p class="welcome-signin-label">Sign in with your Atmosphere account</p> 181 181 <input type="text" class="username-input" id="username-input" placeholder="you.bsky.social" maxlength="100" autofocus /> 182 182 <div class="username-modal-actions"> 183 - <button class="btn-secondary" id="username-skip">Use without an account</button> 184 183 <button class="btn-primary" id="username-confirm">Sign In</button> 185 184 </div> 186 185 </div>
-4
src/landing-events-identity.ts
··· 204 204 deps.usernameInput.setCustomValidity(''); 205 205 }); 206 206 207 - deps.usernameSkip.addEventListener('click', () => { 208 - deps.usernameModal.style.display = 'none'; 209 - }); 210 - 211 207 deps.userBadge.addEventListener('click', async () => { 212 208 const session = getSession(); 213 209 if (!session) return;
-1
src/landing-events.ts
··· 36 36 trashToggle: HTMLElement; 37 37 usernameModal: HTMLElement; 38 38 usernameInput: HTMLInputElement; 39 - usernameSkip: HTMLElement; 40 39 usernameConfirm: HTMLElement; 41 40 folderModal: HTMLElement; 42 41 folderModalTitle: HTMLElement;
+1 -2
src/landing.ts
··· 50 50 // Modals 51 51 const usernameModal = document.getElementById('username-modal') as HTMLElement; 52 52 const usernameInput = document.getElementById('username-input') as HTMLInputElement; 53 - const usernameSkip = document.getElementById('username-skip') as HTMLElement; 54 53 const usernameConfirm = document.getElementById('username-confirm') as HTMLElement; 55 54 const folderModal = document.getElementById('folder-modal') as HTMLElement; 56 55 const folderModalTitle = document.getElementById('folder-modal-title') as HTMLElement; ··· 110 109 searchInput, searchClear, 111 110 sortBtn, sortLabel, sortMenu, 112 111 newFolderBtn, viewToggleBtn, trashToggle, 113 - usernameModal, usernameInput, usernameSkip, usernameConfirm, 112 + usernameModal, usernameInput, usernameConfirm, 114 113 folderModal, folderModalTitle, folderNameInput, 115 114 folderCancel, folderConfirm: folderConfirmBtn, moveCancel, userBadge, 116 115 backupExportBtn, backupImportBtn, backupImportInput,
+1 -16
tests/access-gate.test.ts
··· 73 73 }); 74 74 75 75 describe('applyAccessGate', () => { 76 - beforeEach(() => { 77 - document.body.innerHTML = ` 78 - <div id="username-modal" style="display:none;"></div> 79 - <div id="waitlist-modal" style="display:none;"></div> 80 - <button id="username-skip"></button> 81 - `; 82 - }); 83 - 84 - it('keeps skip button visible regardless of access mode', async () => { 76 + it('resolves without error', async () => { 85 77 mockGetInstanceInfo.mockResolvedValue(makeInfo({ mode: 'allowlist', allowlist: [] })); 86 78 await applyAccessGate(); 87 - expect(document.getElementById('username-skip')!.style.display).not.toBe('none'); 88 - }); 89 - 90 - it('keeps skip button visible when no access control', async () => { 91 - mockGetInstanceInfo.mockResolvedValue(makeInfo()); 92 - await applyAccessGate(); 93 - expect(document.getElementById('username-skip')!.style.display).not.toBe('none'); 94 79 }); 95 80 });
-1
tests/setup-flow.test.ts
··· 52 52 <div class="modal-backdrop" id="username-modal" style="display:none;"> 53 53 <div class="modal username-modal"> 54 54 <input type="text" id="username-input" /> 55 - <button id="username-skip">Skip</button> 56 55 <button id="username-confirm">Sign In</button> 57 56 </div> 58 57 </div>