GithubHelp home page GithubHelp logo

samay-app / samay Goto Github PK

View Code? Open in Web Editor NEW
296.0 5.0 57.0 4.61 MB

Find a time which works for everyone

Home Page: https://samay.app

License: MIT License

JavaScript 1.54% TypeScript 72.82% SCSS 25.64%

samay's Introduction

Samay Logo

Samay — free and open source meeting poll tool

License Polls created: 2500+ Create a poll


Samay banner


Samay (previously known as Kukkee) is a free and open source meeting poll tool. Quickly find a time which works for everyone without the back-and-forth texts/emails!

Create a poll

Select the time slots (click and drag) based on your availability, and optionally enter the title, description and location. The default poll type is "group" — to find a common time which works for everyone. If you want to have one-on-one meetings (parent-teacher meetings for example), select the "one-on-one" poll type.

Share the poll

Copy and share the poll link with the participants to let them mark their availability. In group polls, participants can either vote [yes] by clicking once or [if need be] by clicking twice. In one-on-one polls, participants can select their one preferred time. No login required. No time zone confusion since Samay automatically shows participants times in their local time zone.

Book the meeting

In group polls, find the most popular times and see who's free with [yes] votes - or who can be - with [if need be] votes, book the meeting and share the final time with the participants! In one-on-one polls, find who has chosen which time slot for a one-on-one with you!

Create a poll now at Samay.app!

Motivation

After my GSoC '20 at LiberTEM, I wanted to have a video call with my mentors. They said yes, and since the next step was to find a suitable and common time, one of them sent me a link to a meeting poll created using a proprietary online service. It had surprisingly bad UX and was covered with advertisements. I searched for good, free and open source meeting poll tools, but didn't find any. So I decided to fix that problem.

Get in touch

If you have suggestions for how Samay could be improved, please add your thoughts on a relevant discussion here or start a new discussion. If you have any questions, I'd love to hear them too! If you want to report an issue, check if the issue is already opened here otherwise open a new one.

Self-hosting

Docker

Coming soon!

Vercel and MongoDB Atlas

Samay is built with MongoDB and Next.js, so for a quick and free setup, you can use a free MongoDB Atlas cluster and Vercel's hobby plan.

You can get started with MongoDB Atlas for free here. Make sure to add all IP addresses (0.0.0.0/0) to the IP access list of your Atlas cluster since it is not possible to determine the IP addresses of Vercel deployments.

You can get started with Vercel's hobby plan for free:

  1. Fork this repo to your own GitHub account
  2. Go to https://vercel.com/dashboard
  3. Create a new project
  4. Import your forked repository
  5. Set the environment variables (according to the instructions in .env.example)
  6. Deploy

Contributing

Development

First, make sure you have Node.js and MongoDB installed. Then, to develop locally:

  1. Fork this repo to your own GitHub account and then clone it.

    git clone https://github.com/<your-username>/samay.git
  2. Go to the project folder

    cd samay
  3. Create a new branch:

    git checkout -b MY_BRANCH_NAME
  4. Install the dependencies with:

    npm i
  5. Copy .env.example to .env

    cp .env.example .env
  6. Set the env variables according to the instructions in the .env file

  7. Start developing and watch for code changes:

    npm run dev
  8. Please make sure that you can make a full production build before opening a PR. You can build the project with:

    npm run build

Acknowledgements

Thanks to FOSS United for selecting Samay as one of the winning projects at FOSS Hack 3.0.

Thanks to these amazing projects which help power Samay:

  • React-big-calendar
  • React
  • Next.js
  • Day.js
  • Bootstrap
  • MongoDB
  • Mongoose
  • Inter
  • Cal Sans

License

Samay is distributed under the MIT License.

samay's People

Contributors

anandbaburajan avatar anastr0 avatar aryanbaburajan avatar athuljoshi avatar aysp-99 avatar ayushisood avatar breadgenie avatar dependabot[bot] avatar iamaravindks avatar jademaveric avatar mitanshikshatriya avatar piall avatar pushkardureja avatar ritucs avatar swsrkty avatar vipinvip avatar viveknathani 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  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  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  avatar  avatar  avatar

samay's Issues

Time slot Picker and UI

The slot picking UI while creating a poll will have check boxes to pick multiple time ranges and will look something like this (but much prettier)

Screenshot from 2020-12-21 19-56-10

The time slot poll for other users will look like this (but much prettier)

Screenshot from 2020-12-21 19-54-04

We also need to take care of timezone conversions and the proper incrementing of the time range while creating the poll

There can also be an interval picker while creating the poll

Better error handling needed

  • The app needs better error handling in some pages.
    For example, there was a network issue that broke the firebase signin popup. But I didn't get a feedback.
    Similar issues are seen in /poll/[poll-id] also.

Client

@VipinVIP and me have decided to go with nextjs for the client. It offers pre-rendering and code-splitting which are good for UX. Haven't decided whether to use bootstrap or styled components. Will decide soon and let you know before we're done with the basic layout and routing ready.

@twentyse7en I think it's best if we deploy the client in vercel, a platform built for next apps. Eventhough netlify has support for nextjs applications.

Send meet invites after poll is closed

  • Once the poll is closed, and author has selected the final available time for the meet event, there should be a component to invite participants to the final event.
  • #40 Already took care of the fetcher in MailerAPI
  • We could seperate and reuse the invite part from share-invite component

UI redesign

  • The webapp needs improvements in it's design.
  • It lacks a features section and an about page

According to Krug’s first law of usability, the web-page should be obvious and self-explanatory

  • Footer
  • Popovers on components for first use

Add schema validation

We need to have proper schema validation for cases like making sure the Poll choices are UNIX timestamps, the intervals are neither too small nor large, etc. Going with joi might be a good idea.

Sync final event to calendar

Once the poll creator chooses the final time, create a Google Calendar event and invite the voters as guests.

Update: we're going to support more than just Google's Calendar. Here's a better description:
Automatically add the event to your and participants' calendar when you finalise the meeting time.

Auth "auth/unauthorized-domain"

@iamAravindks
Upon trying to login, I get the following console error. Can you try doing as mentioned in the message.

This domain (rocket-meet-client-nant90sk3.vercel.app) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab."

When we get the custom domain, add that too

auth-unauthoriseddomain

Architecture

I've been looking into microservices, WebRTC, whatsapp's design etc. What do you think about making RocketMeet a P2P desktop/local-web application with a local DB? That would give us an edge over Doodle as users won't have to give 'us' their data. Then we also don't need to maintain a db, like how Whatsapp works on phone. webRTC is a bit quirky and is used in Google Meet, discord, etc for direct communication between clients (browsers). Sometimes the encrypted data would go through our server but it's immediately discarded after being relayed. One thing to note about UX would be that users would need to download our app and then use it like regular desktop software. What do you think? (from the perspective of both users and devs)

This video might be useful.
This P2P file-sharing app using WebRTC looks like something which could give us some ideas.

Email lists do not get cleared after sending emails

Currently, the list of emails aren't getting cleared after the user sends an email

It needs to be cleared every time the user presses the Invite button, so it would not lead to sending of multiple emails

Tests & CI

There should be necessary tests to check the mailer along with auth. GitHub Acttions can be used to setup CI.

Fix the Node.js CI workflow for PRs

Currently Pull Requests don't show the checks. Also the workflow needs to be triggered on every \test comment in the PR by an authorised person.

Add a proper README

Should contain badges, an intro, features, setup, contributing, link to the API documentation, etc.

Deployment and CI/CD

For CI/CD we can go with GitHub actions, which offers 20 concurrent jobs. The alternative pick is Azure, which offers only 10 concurrent jobs. I haven't figured out about the deployment, possible candidates are Heroku suggested by @anandbaburajan and for frontend, Vercel suggested by @anaswaratrajan.

Connect calendars

It would be helpful for the poll creator if we could show them which slots are already occupied (via their Google calendar). I'm not sure if we can modify react-available-times for this purpose. Might need to embed a calendar otherwise. Are there more solutions? Let us know!

Allow creators to input people's timezones to check availability

Before choosing candidates, the poll creator could be given an option to enter timezones of all participants. Then while choosing candidates, the app could help the creator know (maybe in a tooltip) what time the hovered candidate would be in others' timezones.

Unit tests

@VipinVIP @iamAravindks @BreadGenie
I've setup jest and enzyme. After discussion with @anandbaburajan, decided we need tests to check the following

  • Auth and private routing
  • Mock all fetches
  • Slot-ui component

We won't be testing all the components. I hope all of you will help us in writing tests and optimisations to the mvp. Feel free to suggest other core areas we need to test. Thanks for contributing! :D

User Authentication

After some researches, I found that using passport.js with Node is easy to implement the user Auth with google.
I Made a Prototype for this.

ezgif com-gif-maker (1)

it uses session and cookies to store the information throughout the App. For an actual app, we should configure this with an expiration time, better keys, proxy and secure with Google developer console.
And I think we should use the Database only for the Email-Password method. Let me know other's Suggestions.

Mailing system.

After some searches, I found that nodemailer can be used to send mails and that it is also used for production applications. Basically it stands in between an SMTP server and the reciever (gmail without using a dedicated SMTP server can be used temporarily during initial stage). We can send custom html messages as per the designs which would be suggested by the UI team.

I wrote a sample api while using ethereal as a mail provider which is used for tesing purposes and found that it works. Currently we set the recipients address but also can be passed as a list by extracting the mail id's of all participants of a particular poll from the database after final timing is fixed.

router.post('/mail', (req, res) => {
    "use strict";
    const nodemailer = require("nodemailer");
    
    // async..await is not allowed in global scope, must use a wrapper
    async function main() {
      // Generate test SMTP service account from ethereal.email
      // Only needed if you don't have a real mail account for testing
      let testAccount = await nodemailer.createTestAccount();
    
      // create reusable transporter object using the default SMTP transport
      let transporter = nodemailer.createTransport({
        host: "smtp.ethereal.email",
        port: 587,
        secure: false, // true for 465, false for other ports
        auth: {
          user: testAccount.user, // generated ethereal user
          pass: testAccount.pass, // generated ethereal password
        },
      });
    
      // send mail with defined transport object
      let info = await transporter.sendMail({
        from: '"Fred Foo 👻" <[email protected]>', // sender address
        to: "[email protected], [email protected]", // list of receivers
        subject: "Hello ✔", // Subject line
        text: "Hello world?", // plain text body
        html: "<b>Hello world?</b>", // html body
      });
    
      console.log("Message sent: %s", info.messageId);
         
      console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
      
    }
    
    main().catch(console.error);
})

This is an api which uses /mail as an endpoint. The script is already provided by nodemailer and the thing left to do is taking mails from the final database and customizing the message. I'm not sure of the difficulty, seems pretty easy and not much work is needed. (This is what I think right now).

Private, protected and public modes

I came up an issue that when a poll is created and shared .
A user(without even login) can give his/her selection any number of times with fake names. This might be a cautious security issue because any user can give many opinion on the poll which can even ruin the purpose of poll.

Please correct me if I am wrong. @anandbaburajan

A button to clear all selections in calendar

Currently, if we need to clear the selections we've made in the calendar, we should clear them one by one

A button like Clear All Selections the would come in handy in the Create Poll page

Use preview deployments

A staging server would make it easier to -

  1. Make frontend contribs by cloning and running only the Rocketmeet-client repo.
  2. Test new or revised API endpoints across machines before they are pushed to prod.

Shell script to run all the development servers locally

Have to manually run the 3 different servers and mongod at once

  • For development, developer needs to setup and start RocketMeet-server, RocketMeet-mailer and a mongod connection before starting Rocketmeet-client development server with npm run dev

Solution: shell script to start all 4 servers

  • Write a shell script to start all the 4 development servers at once. Possibly from project root.

An About page

It would be nice to have an about page on the site with details about our team, our vision, etc.

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.