mirror of
https://github.com/modrinth/code.git
synced 2026-08-25 00:55:25 +00:00
feat: app onboarding and library (#6923)
* refactor: remove unused legacy onboarded flag * sqlx prepare * feat: add onboarding checklist app db and add vue provider * feat: add welcome page * feat: add onboarding checklist component * feat: move checklist visibility source of truth in app db * feat: split up import modpack button * feat-small: style tweak * feat: remove discover section from homepage and add library * refactor: move welcome screen to component * refactor: move grid display into /library * refactor: rename existing components * refactor: split up the current library page files * feat: add create group modal * feat: add instance group definitions * feat: update accordian for instance groups * feat: add delete group * feat: implement rename instance groups * refactor: move instance group api out * feat: add context menu for groups * feat: style instance items in library * feat: add selected instance item state * feat: implement action bar for selection * feat: drag and drop to move between groups * feat: show ungrouped with header * feat: improve edit group name * small fix * small style fixes * feat: improve selection behaviour * fix: dont toggle group when context menu open * feat: drag and drop multiple selected * small * feat: add remove from group in action bar * feat: add delay on icon hiding in inline input * feat: improve icon hiding delay * fix: bad routes.js * feat: implement sort and filter options * refactor: dont prefix filenames * feat: change open/collapse group target * feat: improve ungrouped behaviour * feat: add shift to select multiple instances * fix: icon disappear transition * feat: add esc while dragging to cancel * feat: update sorting and moved label * feat: update context menu * fix: multiple context menus can be opened * refactor: instance groups to be identified by ID instead of name, names become display data * feat: creating new group always adds instance * feat: create group button, fix instance selection, and increase group name max length * feat: strokes * fix: show getting started checklist in all sidebar * feat: set size on microsoft login screen * fix: use ButtonStyled in Chips component * feat: creating groups with selected instances and fix some moving selection and duplication bugs * pnpm prepr * feat: add tooltip for instance already in group * feat: create instance with content in creation flow modal - search modpack becomes search projects - creation flow modal context receives prepareProjectInstall and createProjectInstall callbacks, from content-install.ts (shared with ContentInstallModal) * feat: update instance card styles * refactor: separate out instance card content * update styles * refactor: instance card * fix: width of instance * feat: update empty state * feat: update sort and grouping dropdowns * feat: better context menu options * feat: add group action buttons * feat: add/remove favourites group * remove manual sort * feat: improve the "New group" jank * feat: add group by instance type and change group sorting * feat: welcome screen styles match figma * feat: not signed in skins demo * feat: new hosting empty state * feat: new instance card style * feat: add tooltip and spice up animation more * feat: improve the transitions for groups after dropping many instances * feat: set instance group membership for bulk moving * feat: remove fade out * fix: allow dragging from buttons inside instance card * fix: library page load in behaviour * small fix * feat: add group ordering and reordering * feat: add drag to reorder groups * fix: switching page not clearing selected instances * style fixes * style fix * fix spacing * feat: jump in changes * feat: add styled newly created instances * feat: improve jump in cards styles * fix: welcome screen style * fix: empty state styles * feat: max 5 jump in items * feat: max new instances to 3 * fix: search icon * feat: clear selection after move * feat: skins list use check icon styles * feat: list will be deleted instances and default sort last played * fix: stroke * remove: no more group settings in instance general settings * fix: resolving modpack server install * feat: icon editor * feat: add three hue shifted variants * fix: surprise me doesnt pick symbol * feat: add customize icon to create instance modal * feat: skins loading state style * fix: welcome logo * fix: copy * fix: left over usage of ButtonStyled from main's refactor * feat: some leaked merge stuff * feat: server empty state styles * remove: instance helper text * remove: auto link in set up stage * feat: auto focus on search when modal open * fix: delete instance modal style * remove: modpack meta repeating * fix: icon * fix: font weight * fix: dropdown filter preview heights * pnpm prepr * fix: sign into modrinth flashing change in position * feat: add avatar transparent corner gets padding * feat: drag and hold over group opens group * feat: add random icon for custom instance * feat: update loading icon * polish: empty state for search * polish: jump in cards * fix: avatar could skip checking for image if tauri loads it first * feat: add icon customize and randomizer in content install modal for add to new instances * fix: avatar cannot read image pixels due to cors * refactor: popup notifications toast type for instance sharing notifications * feat: apply random icons modal and add popup notification for it * polish: style * fix: set_webview_visible * QA * qa * feat: add inner white 15 opacity stroke around avatar * add to catalog * pnpm prepr * fix: app event import * feat: add new icons and backgrounds for icon editor * feat: recents list generate from randomized icons and save icon in editor + icon editor modal fixes * qa * refactor: recipe -> config * fix: event bus * polish * feat: add safe guard against randomizing empty icons * feat: navigate to instance after creation * fix: icon file names * i18n on welcome screen * i18n pass on PR * fix: inconsistent max group name length * refactor: use sqlx macro * feat: add instance icon background selection drag * feat: update catalog order * fix: remove gradient for welcome screen * remove: frog * fix: min width * feat: update corner size * fix: context menu styles * prepr * fix: instance name trimming * reorder * fix: instance card loading state stayed until hovering * feat: add icon randomizer blacklist * blog * prepr --------- Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
This commit is contained in:
@@ -140,6 +140,14 @@ fn main() {
|
||||
DefaultPermissionRule::AllowAllCommands,
|
||||
),
|
||||
)
|
||||
.plugin(
|
||||
"onboarding-checklist",
|
||||
InlinedPlugin::new()
|
||||
.commands(&["get_onboarding_checklist"])
|
||||
.default_permission(
|
||||
DefaultPermissionRule::AllowAllCommands,
|
||||
),
|
||||
)
|
||||
.plugin(
|
||||
"install",
|
||||
InlinedPlugin::new()
|
||||
@@ -208,6 +216,12 @@ fn main() {
|
||||
"instance_get_full_path",
|
||||
"instance_get_mod_full_path",
|
||||
"instance_list",
|
||||
"instance_list_groups",
|
||||
"instance_create_group",
|
||||
"instance_rename_group",
|
||||
"instance_delete_group",
|
||||
"instance_set_group_order",
|
||||
"instance_set_group_memberships",
|
||||
"instance_check_installed",
|
||||
"instance_update_all",
|
||||
"instance_update_project",
|
||||
@@ -225,6 +239,9 @@ fn main() {
|
||||
"instance_kill",
|
||||
"instance_edit",
|
||||
"instance_edit_icon",
|
||||
"instance_edit_generated_icon",
|
||||
"instance_cache_generated_icon",
|
||||
"instance_get_recent_icon_configs",
|
||||
"instance_share_can_current_user_use",
|
||||
"instance_share_get_users",
|
||||
"instance_share_invite_users",
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
"metadata:default",
|
||||
"minecraft-skins:default",
|
||||
"mr-auth:default",
|
||||
"onboarding-checklist:default",
|
||||
"instance:default",
|
||||
"install:default",
|
||||
"process:default",
|
||||
|
||||
@@ -52,6 +52,9 @@ pub async fn login<R: Runtime>(
|
||||
)
|
||||
.title("Sign into Modrinth")
|
||||
.always_on_top(true)
|
||||
.min_inner_size(500.0, 500.0)
|
||||
.inner_size(1000.0, 700.0)
|
||||
.focused(true)
|
||||
.center()
|
||||
.build()?;
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ pub struct InstallCreateInstanceRequest {
|
||||
pub loader: ModLoader,
|
||||
pub loader_version: Option<String>,
|
||||
pub icon_path: Option<String>,
|
||||
pub icon_config: Option<theseus::data::InstanceIconConfig>,
|
||||
pub link: Option<InstanceLink>,
|
||||
}
|
||||
|
||||
@@ -90,6 +91,7 @@ pub async fn install_create_instance(
|
||||
request.loader,
|
||||
request.loader_version,
|
||||
request.icon_path,
|
||||
request.icon_config,
|
||||
match request.link {
|
||||
Some(link) => link.into_core()?,
|
||||
None => theseus::data::InstanceLink::Unmanaged,
|
||||
|
||||
@@ -25,6 +25,12 @@ pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
|
||||
instance_get,
|
||||
instance_get_many,
|
||||
instance_list,
|
||||
instance_list_groups,
|
||||
instance_create_group,
|
||||
instance_rename_group,
|
||||
instance_delete_group,
|
||||
instance_set_group_order,
|
||||
instance_set_group_memberships,
|
||||
instance_get_projects,
|
||||
instance_get_installed_project_ids,
|
||||
instance_get_install_candidates,
|
||||
@@ -54,6 +60,9 @@ pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
|
||||
instance_kill,
|
||||
instance_edit,
|
||||
instance_edit_icon,
|
||||
instance_edit_generated_icon,
|
||||
instance_cache_generated_icon,
|
||||
instance_get_recent_icon_configs,
|
||||
instance_share_can_current_user_use,
|
||||
instance_share_get_users,
|
||||
instance_share_invite_users,
|
||||
@@ -79,11 +88,12 @@ pub struct Instance {
|
||||
pub launcher_feature_version: String,
|
||||
pub name: String,
|
||||
pub icon_path: Option<String>,
|
||||
pub icon_config: Option<theseus::data::InstanceIconConfig>,
|
||||
pub game_version: String,
|
||||
pub protocol_version: Option<u32>,
|
||||
pub loader: ModLoader,
|
||||
pub loader_version: Option<String>,
|
||||
pub groups: Vec<String>,
|
||||
pub group_ids: Vec<String>,
|
||||
pub link: Option<InstanceLink>,
|
||||
pub shared_instance: Option<SharedInstanceAttachment>,
|
||||
pub quarantined: bool,
|
||||
@@ -179,7 +189,7 @@ pub struct EditInstance {
|
||||
)]
|
||||
pub loader_version: Option<Option<String>>,
|
||||
|
||||
pub groups: Option<Vec<String>>,
|
||||
pub group_ids: Option<Vec<String>>,
|
||||
|
||||
#[serde(
|
||||
default,
|
||||
@@ -242,11 +252,12 @@ impl From<InstanceMetadata> for Instance {
|
||||
.to_string(),
|
||||
name: metadata.instance.name,
|
||||
icon_path: metadata.instance.icon_path,
|
||||
icon_config: metadata.icon_config,
|
||||
game_version: metadata.applied_content_set.game_version,
|
||||
protocol_version: metadata.applied_content_set.protocol_version,
|
||||
loader: metadata.applied_content_set.loader,
|
||||
loader_version: metadata.applied_content_set.loader_version,
|
||||
groups: metadata.groups,
|
||||
group_ids: metadata.group_ids,
|
||||
link: InstanceLink::from_core(metadata.link),
|
||||
shared_instance: metadata.shared_instance.map(Into::into),
|
||||
quarantined: metadata.quarantined,
|
||||
@@ -413,8 +424,9 @@ fn edit_to_core(edit_instance: EditInstance) -> Result<CoreEditInstance> {
|
||||
launcher_feature_version: None,
|
||||
name: edit_instance.name,
|
||||
icon_path: None,
|
||||
icon_config: None,
|
||||
update_channel: edit_instance.update_channel,
|
||||
groups: edit_instance.groups,
|
||||
group_ids: edit_instance.group_ids,
|
||||
link: edit_instance
|
||||
.link
|
||||
.map(|link| match link {
|
||||
@@ -478,6 +490,44 @@ pub async fn instance_list() -> Result<Vec<Instance>> {
|
||||
.collect())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_list_groups()
|
||||
-> Result<Vec<theseus::instance::InstanceGroup>> {
|
||||
Ok(theseus::instance::list_groups().await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_create_group(
|
||||
name: String,
|
||||
) -> Result<theseus::instance::InstanceGroup> {
|
||||
Ok(theseus::instance::create_group(name).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_rename_group(
|
||||
id: String,
|
||||
new_name: String,
|
||||
) -> Result<theseus::instance::InstanceGroup> {
|
||||
Ok(theseus::instance::rename_group(id, new_name).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_delete_group(id: String) -> Result<()> {
|
||||
Ok(theseus::instance::delete_group(id).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_set_group_order(group_ids: Vec<String>) -> Result<()> {
|
||||
Ok(theseus::instance::set_group_order(group_ids).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_set_group_memberships(
|
||||
updates: Vec<theseus::instance::InstanceGroupMembershipUpdate>,
|
||||
) -> Result<()> {
|
||||
Ok(theseus::instance::set_group_memberships(updates).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_get_projects(
|
||||
instance_id: &str,
|
||||
@@ -813,6 +863,52 @@ pub async fn instance_edit_icon(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_edit_generated_icon(
|
||||
instance_id: &str,
|
||||
config: theseus::data::InstanceIconConfig,
|
||||
symbol_bytes: Vec<u8>,
|
||||
only_if_empty: Option<bool>,
|
||||
) -> Result<Option<String>> {
|
||||
if only_if_empty.unwrap_or(false) {
|
||||
return Ok(theseus::instance::edit_generated_icon_if_empty(
|
||||
instance_id,
|
||||
config,
|
||||
symbol_bytes,
|
||||
)
|
||||
.await?);
|
||||
}
|
||||
|
||||
Ok(Some(
|
||||
theseus::instance::edit_generated_icon(
|
||||
instance_id,
|
||||
config,
|
||||
symbol_bytes,
|
||||
)
|
||||
.await?,
|
||||
))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_cache_generated_icon(
|
||||
config: theseus::data::InstanceIconConfig,
|
||||
symbol_bytes: Vec<u8>,
|
||||
add_to_recents: bool,
|
||||
) -> Result<String> {
|
||||
Ok(theseus::instance::cache_generated_icon(
|
||||
config,
|
||||
symbol_bytes,
|
||||
add_to_recents,
|
||||
)
|
||||
.await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_get_recent_icon_configs()
|
||||
-> Result<Vec<theseus::data::InstanceIconConfig>> {
|
||||
Ok(theseus::instance::get_recent_icon_configs().await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn instance_share_can_current_user_use() -> Result<bool> {
|
||||
Ok(theseus::instance::can_active_user_use_shared_instances().await?)
|
||||
|
||||
@@ -11,6 +11,7 @@ pub mod logs;
|
||||
pub mod metadata;
|
||||
pub mod minecraft_skins;
|
||||
pub mod mr_auth;
|
||||
pub mod onboarding_checklist;
|
||||
pub mod process;
|
||||
pub mod reports;
|
||||
pub mod settings;
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
use crate::api::Result;
|
||||
use tauri::plugin::TauriPlugin;
|
||||
use theseus::prelude::*;
|
||||
|
||||
pub fn init<R: tauri::Runtime>() -> TauriPlugin<R> {
|
||||
tauri::plugin::Builder::new("onboarding-checklist")
|
||||
.invoke_handler(tauri::generate_handler![get_onboarding_checklist])
|
||||
.build()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_onboarding_checklist() -> Result<OnboardingChecklist> {
|
||||
Ok(onboarding_checklist::get().await?)
|
||||
}
|
||||
@@ -182,6 +182,7 @@ fn main() {
|
||||
.plugin(
|
||||
tauri_plugin_window_state::Builder::default()
|
||||
.with_filename("app-window-state.json")
|
||||
.with_denylist(&["signin"])
|
||||
// Use *only* POSITION and SIZE state flags, because saving VISIBLE causes the `visible: false` to not take effect
|
||||
.with_state_flags(
|
||||
tauri_plugin_window_state::StateFlags::POSITION
|
||||
@@ -242,6 +243,7 @@ fn main() {
|
||||
builder = builder
|
||||
.plugin(api::auth::init())
|
||||
.plugin(api::mr_auth::init())
|
||||
.plugin(api::onboarding_checklist::init())
|
||||
.plugin(api::import::init())
|
||||
.plugin(api::install::init())
|
||||
.plugin(api::instance::init())
|
||||
|
||||
Reference in New Issue
Block a user