/// <summary>
        /// Handle the submission of the modal.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <IActionResult> ProcessModalDataAsync(SlackUser user)
        {
            if (user is null)
            {
                return(BadRequest());
            }

            var payload            = Serializer.Deserialize <SlackViewSubmission>(HttpContext.Request.Form["payload"]);
            var payloadStart       = payload?.View?.State?.Values?.Starttime?.StartTime?.Value;
            var payloadEnd         = payload?.View?.State?.Values?.Endtime?.EndTime?.Value;
            var payloadDate        = payload?.View?.State?.Values?.Date?.Date?.Day;
            var payloadUserId      = payload?.User?.Id;
            var payloadDescription = payload?.View?.State?.Values?.Description?.Description?.Value;
            var payloadProjectName = payload?.View?.State?.Values?.Project?.Project?.SelectedOption?.Value;

            if (payloadEnd is null || payloadStart is null || payloadDate is null || payloadUserId is null || payloadDescription is null || payloadProjectName is null)
            {
                return(BadRequest());
            }

            //
            // Generate the error response (if there are any)
            //
            string errorMessage = "{ \"response_action\": \"errors\", \"errors\": {";

            if (!TimeSpan.TryParseExact(payloadStart, "h\\:mm", CultureInfo.InvariantCulture, out TimeSpan startTime))
            {
                errorMessage += "\"starttime\": \"Please use a valid time format! (eg. '08:00')\",";
            }
            if (!TimeSpan.TryParseExact(payloadEnd, "h\\:mm", CultureInfo.InvariantCulture, out TimeSpan endTime))
            {
                errorMessage += "\"endtime\": \"Please use a valid time format! (eg. '18:00')\",";
            }
            if (payload?.View?.State?.Values?.Project == null)
            {
                errorMessage += "\"project\": \"Please select a project!\",";
            }
            else if (endTime.CompareTo(startTime) != 1)
            {
                errorMessage += "\"endtime\": \"End Time has to be after Start Time!\",";
            }

            //
            // Check if there was an error and return it
            //
            if (errorMessage.EndsWith(",", StringComparison.CurrentCulture))
            {
                errorMessage = errorMessage.Remove(errorMessage.Length - 1) + "}}";

                return(Content(errorMessage, "application/json", Encoding.UTF8));
            }

            //
            // Request the access token
            //
            var accessToken = await _tokenManager.GetAccessTokenAsync(payloadUserId);

            if (accessToken == null)
            {
                return(BadRequest());
            }

            //
            // Set and save the values
            //
            user.IsWorking = false;
            user.Worktime  = new Duration(payloadDate + startTime, payloadDate + endTime);

            //
            // Send the request
            //

            // Get the project
            var project = await _tcDataManager.GetProjectAsync(accessToken, payloadProjectName);

            if (project == null)
            {
                return(BadRequest());
            }

            // Get the user details
            var userDetail = await _tcDataManager.GetCurrentUserDetailsAsync(accessToken);

            if (userDetail == null)
            {
                return(BadRequest());
            }

            // Send each session
            foreach (var session in user.GetWorkSessions())
            {
                var timesheet = new Timesheet
                {
                    BeginTime      = session.Start.GetValueOrDefault(),
                    EndTime        = session.End.GetValueOrDefault(),
                    UserDetailUuid = userDetail.UserDetailUuid,
                    ProjectUuid    = project.ProjectUuid,
                    Description    = payloadDescription
                };

                await _tcDataManager.CreateObjectAsync(accessToken, timesheet);
            }

            //
            // Reset the data
            //
            user.ResetWorktime();
            user.Breaks?.Clear();
            await _cosmosManager.ReplaceDocumentAsync(Collection.Users, user, user.UserId);

            //
            // Send the reply
            //
            //var channel = await CommandController.GetIMChannelFromUserAsync(_httpClient, payloadUserId);
            //if (channel is null)
            //{
            //    return BadRequest();
            //}

            var replyData = new Dictionary <string, string>
            {
                ["user"]    = payloadUserId,
                ["channel"] = await GetIMChannelFromUserAsync(_httpClient, user.UserId, payload?.Team.Id),
                ["text"]    = "Your time has been saved"
            };

            using var replyForm = new FormUrlEncodedContent(replyData);
            // _ = await _httpClient.PostAsync(new Uri(_httpClient.BaseAddress, "chat.postEphemeral"), replyForm);

            await SendReplyAsync(payload.Team.Id, replyData, true);

            return(Ok());
        }