. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; use FireflyIII\Support\Facades\Preferences; use Log; use Response; /** * Class IntroController. */ class IntroController { /** * Get the intro steps. There are currently no specific routes with an outro step. * * @param string $route * @param string $specificPage * * @return \Illuminate\Http\JsonResponse */ public function getIntroSteps(string $route, string $specificPage = '') { Log::debug(sprintf('getIntroSteps for route "%s" and page "%s"', $route, $specificPage)); $steps = $this->getBasicSteps($route); $specificSteps = $this->getSpecificSteps($route, $specificPage); if (0 === count($specificSteps)) { Log::debug(sprintf('No specific steps for route "%s" and page "%s"', $route, $specificPage)); return Response::json($steps); } if ($this->hasOutroStep($route)) { // @codeCoverageIgnoreStart // save last step: $lastStep = $steps[count($steps) - 1]; // remove last step: array_pop($steps); // merge arrays and add last step again $steps = array_merge($steps, $specificSteps); $steps[] = $lastStep; // @codeCoverageIgnoreEnd } if (!$this->hasOutroStep($route)) { $steps = array_merge($steps, $specificSteps); } return Response::json($steps); } /** * @param string $route * * @return bool */ public function hasOutroStep(string $route): bool { $routeKey = str_replace('.', '_', $route); Log::debug(sprintf('Has outro step for route %s', $routeKey)); $elements = config(sprintf('intro.%s', $routeKey)); if (!is_array($elements)) { return false; } Log::debug('Elements is array', $elements); Log::debug('Keys is', array_keys($elements)); Log::debug(sprintf('Keys has "outro": %s', var_export(in_array('outro', array_keys($elements)), true))); return in_array('outro', array_keys($elements)); } /** * @param string $route * @param string $specialPage * * @return \Illuminate\Http\JsonResponse */ public function postEnable(string $route, string $specialPage = '') { $route = str_replace('.', '_', $route); $key = 'shown_demo_' . $route; if ('' !== $specialPage) { $key .= '_' . $specialPage; } Log::debug(sprintf('Going to mark the following route as NOT done: %s with special "%s" (%s)', $route, $specialPage, $key)); Preferences::set($key, false); return Response::json(['message' => trans('firefly.intro_boxes_after_refresh')]); } /** * @param string $route * @param string $specialPage * * @return \Illuminate\Http\JsonResponse */ public function postFinished(string $route, string $specialPage = '') { $key = 'shown_demo_' . $route; if ('' !== $specialPage) { $key .= '_' . $specialPage; } Log::debug(sprintf('Going to mark the following route as done: %s with special "%s" (%s)', $route, $specialPage, $key)); Preferences::set($key, true); return Response::json(['result' => sprintf('Reported demo watched for route "%s".', $route)]); } /** * @param string $route * * @return array */ private function getBasicSteps(string $route): array { $routeKey = str_replace('.', '_', $route); $elements = config(sprintf('intro.%s', $routeKey)); $steps = []; if (is_array($elements) && count($elements) > 0) { foreach ($elements as $key => $options) { $currentStep = $options; // get the text: $currentStep['intro'] = trans('intro.' . $route . '_' . $key); // save in array: $steps[] = $currentStep; } } Log::debug(sprintf('Total basic steps for %s is %d', $routeKey, count($steps))); return $steps; } /** * @param string $route * @param string $specificPage * * @return array */ private function getSpecificSteps(string $route, string $specificPage): array { $steps = []; $routeKey = ''; // user is on page with specific instructions: if (strlen($specificPage) > 0) { $routeKey = str_replace('.', '_', $route); $elements = config(sprintf('intro.%s', $routeKey . '_' . $specificPage)); if (is_array($elements) && count($elements) > 0) { foreach ($elements as $key => $options) { $currentStep = $options; // get the text: $currentStep['intro'] = trans('intro.' . $route . '_' . $specificPage . '_' . $key); // save in array: $steps[] = $currentStep; } } } Log::debug(sprintf('Total specific steps for route "%s" and page "%s" (routeKey is "%s") is %d', $route, $specificPage, $routeKey, count($steps))); return $steps; } }