Giter Site home page Giter Site logo

bryanlundberg / nexustimer Goto Github PK

View Code? Open in Web Editor NEW
34.0 2.0 25.0 17.39 MB

Nexus Timer is a powerful unopinionated, minimalist training tool for SpeedCubing.

Home Page: https://www.nexustimer.pro

License: GNU General Public License v3.0

JavaScript 4.64% CSS 0.26% TypeScript 95.10%
rubiks-cube rubiks-cube-scrambler nextjs scramble-display rubiks rubiks-cube-solver rubiks-cube-timer timer nexustimer first-pull-request

nexustimer's Introduction

Overview

enter image description here

Track your Rubik's Cube times with user an interface inspired by Twisty Timer for a comparable desktop experience.

rainbow

About The Project

For those new to speedcubing, it's a challenge where cubers aim to solve the Rubik's Cube as quickly as possible. Achieving a fast solve time is the goal.

Speedcubing preview

rainbow

Preview

preview preview preview preview
Fast, unopinionated, minimalist web tool for SpeedCubing
JS badge TS badge TAILWIND badge REACT badge NEXT badge

What's new?

Metrics by cube

We have included what I called the "Category Aggregation Principle." To empower speedcubers to compute and analyze statistics not just for individual categories but also for each individual cube within the same category without affect or modify overall calculations.

Unique Cross and X-Cross trainer

We are the only tool online that offer cross and x-cross solutions.

Each scramble 3x3 offers: 4 cross and 4 x-cross solutions In this last case, each X-cross solution represents the slot where your first F2L pair would be placed.

  • 1st x-cross option => Front - Left
  • 2nd x-cross option => Back - Left
  • 3rd x-cross option => Back - Right
  • 4th x-cross option => Front - Right

At the moment only works for Yellow layer.

No more DNF

Who likes? We won't cover calculations using DNF, instead delete the solve or add you a +2 penalty.

Portability

We have an intelligent algorithm to detect, convert, and transfer all your previous data from timers such as csTimer, Twisty Timer, and CubeDesk!

This is what makes unique and versatile Nexus Timer 💪

Note

We are working to enable you to sync your data from any device online.

rainbow

Getting Started

Prerequisites

  • Node >21.5.0 & NPM Installed

Installation

  1. Clone the repo
    git clone https://github.com/bryanlundberg/NexusTimer.git
  2. Install NPM packages
    npm install
  3. Run a script available (npm run dev - npm run build - npm run start)
    npm run dev
    rainbow

Roadmap

  • WCA
    • Incorporate voice alerts for inspection.
  • Localization and Accessibility
    • Improve and extend translations.
    • Add Stackmat conection
    • Add bluetooth cubes
  • Animations
    • Enhance overall smoothness of transitions.
  • Cloud features
    • Integrate server storage for backups.

See the open issues for a full list of proposed features (and known issues). rainbow

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

Don't forget to give the project a star! Thanks again!

License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.

nexustimer's People

Contributors

abishek0057 avatar adimaniac31 avatar alagappan17 avatar anumessi10 avatar bryanlundberg avatar carloscrg19 avatar dependabot[bot] avatar diwash007 avatar ganesh107 avatar hpatricioh avatar idrak888 avatar kriteshtimsina avatar lucasfirmo62 avatar nums-half avatar shaurya5 avatar zluipaiva avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

nexustimer's Issues

Incorrect behavior with spacebar

Currently, there is an issue with the timer. When a user stop the time and continues pressing the spacebar, the timer sets ready unintentionally for the next solve.

The expected behavior should be release the spacebar before proceeding to the next solve.

Synchronize the selected cube after deleting it

If you've chosen the "X" cube and decide to delete it, it remains selected on the Timer page. It should be reset to a null state until you select a new cube just in case you deleted the selected cube.

Timer starts unintentionally in mobile version

Issue: The timer starts when you tap the buttons, contrary to the expected behavior.

To recreate the problem:

  • Open the mobile version in developer tools (allows you use touch event).

In timer settings:

  • Turn on "Show quick action buttons."
  • Turn off "Hold to start."
28d39f442888f7ac1216abc8f0f79103.mp4

A potential solution would be to assign an ID or reference to the quick action buttons component container. Then, in the timer logic, ensure that you are not tapping that element to avoid unintended timer activation.

Add cube inspection feature

Enhance the timer with an optional 15-second cube inspection countdown, along with a +2 penalty for exceeding the inspection time, offering users a more realistic and competitive practice environment.

Design a new user interface for the "deletion confirmation modal" for cubes.

This proposal is open to adjustments and improvements in various aspects such as sizes, colors, transitions, hover effects, section variations, and overall design to achieve the best possible results.

  • It's essential to ensure responsiveness.
  • If possible, consider isolating the "modal" into a new component.

current:
279187173-d565766d-a806-4a55-bca9-5f80855c6804

new:
279207076-cf8c1a19-7153-4f1d-af6e-fa636f0ed3b9

Hide navbar while is solving

We need to hide the navigation bar during the solving process, as it has been broken since the recent project restructuring.

ea4ee2c2647ff34bb04a6c189f754ea5.mp4

Feature Import / Export user data

We need to enhance the user experience by adding a feature in the menu settings that facilitates the export and import of user data. This feature will be especially valuable until we implement backend solutions for data management.

Add shortcut to cube selection

In case you click cube details redirect to timer page and also set the selected cube with the previously clicked, should not be trigger with the edit column.

image

image

Create a toast component for alerts

We are looking to design and create a toast component that integrates with our current style and enhances it.

Mobile position:

image

Tablet or desktop computer with reasonable width dimensions:

image

Here are the revised points:

  • The toast should automatically disappear after 5 seconds.
  • There should be an animation indicating the remaining time.
  • Note that implementing it in the UI is not required at this stage, as triggers have not been developed yet.
  • Need a close button X
  • This toast component will serve various purposes, including alerting users about the best time, best average, unlocking new titles, cube deletions, and solve deletions, etc (Think about it).

Best design wins, we have time until create the triggers.

Add Data Validation using the 'Import' feature

File: importDataFromFile.ts has everything needed to handle error using import feature.

Now, it is necessary to finish it, there is a function inside isValidCubesData(), which should return 'true' or 'false' based on whether all the data in the imported .txt file complies with our designated data structure.

image

Pending SQ1 & Megaminx scrambles

Need an algorithms to generate SQ-1 and Megaminx scrambles

Expected output:

SQ1 -> (-5,0)/ (0,3)/ (3,0)/ (2,-4)/ (-2,-5)/ (5,-1)/ (-2,0)/ (0,-3)/ (0,-2)/ (6,0)/ (0,-1)/ (0,-5)/ (2,-2)/

Megaminx ->
R++ D-- R-- D++ R-- D++ R++ D-- R-- D-- U'
R++ D-- R-- D-- R++ D-- R-- D-- R++ D++ U
R++ D-- R-- D-- R-- D-- R++ D-- R-- D++ U
R++ D++ R++ D++ R++ D++ R-- D-- R++ D-- U'
R-- D++ R++ D-- R++ D-- R++ D++ R++ D-- U'
R++ D++ R-- D-- R++ D-- R-- D-- R++ D-- U'
R-- D++ R++ D++ R++ D++ R++ D-- R-- D++ U

Improve navbar active icon

Currently icons are type outline. I would like get a better effect switching to type solid when we are in the current page.

Heroicons

I facilitate the searching of the icons, their names are:

  • clock
  • square-3
  • chart-bar
  • squares-plus

Improve times readability

Need a function to convert time and improve user readability for big cubes example 93.03s to 1:33.03

manual mode

Manual mode is an addition, allowing users the flexibility to run their sessions using external timers, such as a stackmat.

  1. Need an input component

  2. Logic saving times

Input Test Cases:

Entering "50" should convert to "0.50."
Entering "95" should convert to "0.95."
Entering "500" should convert to "5.00."
Entering "950" should convert to "9.50."
Entering "6138" should convert to "1:01.38."
Entering "5000" should convert to "50.00."
Entering "9500" should convert to "1:35.00."
Entering "135000" should convert to "1:35:00."
Entering "34292" should convert to "3:42.92."
Entering "69344" should convert to "7:33.44."

By implementing this change, we aim to ensure that users, including those with accessibility needs, can easily and accurately input times in the desired format.

modal before delete cube

Create a confirmation modal that informs users of the number of solves to be deleted when they confirm the cube deletion. This action could potentially impact their personal best times.

Not editable modal options

The Modal for editing a cube:

  • "Category" should not be editable, only the name.

Changing the category from, for example, a 2x2 cube to a 7x7 cube can lead to skewed statistics. It's important to note that solves on a 2x2 cube are typically faster than those on a 7x7 cube. Therefore, altering the category may result in inaccurate best times, averages, and other statistical data.

This is not a bug; it's a deliberate design choice to ensure the integrity of your solving data.

Close Settings by Clicking Anywhere Outside

On large screens, the settings can currently only be toggled using the dedicated button. How about enhancing user experience by allowing closure of the settings when clicking anywhere outside the settings interface

Organizing component overload

Our project contains too much spaghetti code, which hinders the full potential of Next.js and server components because we use the "use client" tag too early in pages due to the use of useState and useEffect. We need to improve organization and reduce components to its smallest size. Here's how to do it:

  • Make a new issue related to the component you want to tidy up. Explain what needs fixing.
  • When you are ready, create a pull request (PR) to implement the changes.

You can create a folder if you think can improve organization of the component.

If you are concerned about prop drilling, consider using Zustand to create a global state. It can help simplify data sharing across components. #72

Add error handler using "import"

Adding error handling for situations when the input file contains incorrect data. For now, a simple user alert should be sufficient and return the function before replace the localStorage.

Metrics become 0

If you search a cube in cubes section with 0 coincidences and the go to metrics page, state of cube is empty.

Nextjs v13.5.5 error

Since dependent bot updated from 13.4.19 to 13.5.5 throwing an error at dev mode and at build

 ✓ Compiled /stats/page in 2.9s (1957 modules)
 ⨯ TypeError: responseHeaders.getSetCookie is not a function
    at new ResponseCookies (webpack-internal:///(app-metadata-route)/./node_modules/next/dist/compiled/@edge-runtime/cookies/index.js:213:47)
    at new NextResponse (webpack-internal:///(app-metadata-route)/./node_modules/next/dist/server/web/spec-extension/response.js:40:22)
    at GET (webpack-internal:///(app-metadata-route)/./node_modules/next/dist/build/webpack/loaders/next-metadata-route-loader.js?page=%2Ffavicon.ico%2Froute&isDynamic=0!./src/app/favicon.ico?__next_metadata_route__:15:10)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:62505
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\lib\trace\tracer.js:121:36
    at NoopContextManager.with (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:7057)
    at ContextAPI.with (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:516)
    at NoopTracer.startActiveSpan (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:18086)
    at ProxyTracer.startActiveSpan (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:18847)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\lib\trace\tracer.js:110:107
    at NoopContextManager.with (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:7057)
    at ContextAPI.with (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\@opentelemetry\api\index.js:1:516)
    at NextTracerImpl.trace (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\lib\trace\tracer.js:110:32)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:56147
    at AsyncLocalStorage.run (node:async_hooks:330:14)
    at Object.wrap (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:37057)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:53934
    at AsyncLocalStorage.run (node:async_hooks:330:14)
    at Object.wrap (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:36635)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:53896
    at AsyncLocalStorage.run (node:async_hooks:330:14)
    at eD.execute (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:53870)
    at eD.handle (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:63748)
    at doRender (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:1217:56)
    at cacheEntry.responseCache.get.incrementalCache.incrementalCache (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:1446:34)      
    at ResponseCache.get (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\response-cache\index.js:53:26)
    at DevServer.renderToResponseWithComponentsImpl (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:1361:53)
    at C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:903:121
    at NextTracerImpl.trace (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\lib\trace\tracer.js:94:20)
    at DevServer.renderToResponseWithComponents (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:903:41)
    at DevServer.renderPageComponent (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:1600:35)
    at async DevServer.renderToResponseImpl (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:1638:32)
    at async DevServer.pipeImpl (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:826:25)
    at async DevServer.handleCatchallRenderRequest (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\next-server.js:623:13)
    at async DevServer.handleRequestImpl (C:\Users\bryan\Documents\workspace\NexusTimer\node_modules\next\dist\server\base-server.js:728:17)

Solution lower down nextjs to v13.5.1, there is not happening

Time Display Formatting

We got a new function for formatting time in a nice way. As a result, we need update all existing components to utilize this function before rendering.

  • Timer (desviation, mean, best, ao5 - ao100)
  • Solves (session / all, solve modal)
  • Metrics (Last activity, all category statistics...)

formatTime.ts

Improve current language translations

This issue is dedicated to improving language translations for our project. We need to either add new translations for missing languages or fix existing translations that may have errors or inconsistencies.

Its important for me reach a closer meaning but related to the thematic if that involve the use of other words

archive unique solves

Right now its not possible archive single solves, need an extra option. To move the solve from session-solves to all-time-solves.

image

Pending megaminx cube

The Megaminx option is not in the current category list and is an official WCA category

Inaccurate "best time" rendering

The "Best" statistic is not accurately reflecting the lowest time; it should consistently display the lowest recorded time.

8ea88f3e3a6a60e8179a233b1da21fcd.mp4

Multi theme support

Allows users to customize the look and feel of their digital experience by selecting from a variety of pre-designed themes or creating their own unique themes, enhancing personalization and user engagement.

Alert user to provide a cube name for saving

When a user attempts to edit a cube in the modal, and the cube name field is left empty, there should be a user-friendly alert to prompt them to provide a name before proceeding.

image

Creating a cube has one:

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.