Add Alt Style support to outfit saving
Pretty straightforward, just add the field to the record, and wire it
all up! I'm glad this seemed to work out pretty well all-in-all 😅
This commit is contained in:
parent
b06149cf22
commit
c60e222faa
7 changed files with 38 additions and 13 deletions
|
@ -115,7 +115,7 @@ class OutfitsController < ApplicationController
|
||||||
|
|
||||||
def outfit_params
|
def outfit_params
|
||||||
params.require(:outfit).permit(
|
params.require(:outfit).permit(
|
||||||
:name, :starred, item_ids: {worn: [], closeted: []},
|
:name, :starred, :alt_style_id, item_ids: {worn: [], closeted: []},
|
||||||
biology: [:species_id, :color_id, :pose])
|
biology: [:species_id, :color_id, :pose])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ function useOutfitSaving(outfitState, dispatchToOutfit) {
|
||||||
speciesId: outfitState.speciesId,
|
speciesId: outfitState.speciesId,
|
||||||
colorId: outfitState.colorId,
|
colorId: outfitState.colorId,
|
||||||
pose: outfitState.pose,
|
pose: outfitState.pose,
|
||||||
|
altStyleId: outfitState.altStyleId,
|
||||||
wornItemIds: [...outfitState.wornItemIds],
|
wornItemIds: [...outfitState.wornItemIds],
|
||||||
closetedItemIds: [...outfitState.closetedItemIds],
|
closetedItemIds: [...outfitState.closetedItemIds],
|
||||||
})
|
})
|
||||||
|
|
|
@ -447,6 +447,7 @@ function getOutfitStateFromOutfitData(outfit) {
|
||||||
speciesId: outfit.speciesId,
|
speciesId: outfit.speciesId,
|
||||||
colorId: outfit.colorId,
|
colorId: outfit.colorId,
|
||||||
pose: outfit.pose,
|
pose: outfit.pose,
|
||||||
|
altStyleId: outfit.altStyleId,
|
||||||
wornItemIds: new Set(outfit.wornItemIds),
|
wornItemIds: new Set(outfit.wornItemIds),
|
||||||
closetedItemIds: new Set(outfit.closetedItemIds),
|
closetedItemIds: new Set(outfit.closetedItemIds),
|
||||||
};
|
};
|
||||||
|
|
|
@ -30,7 +30,9 @@ export function useDeleteOutfitMutation(options = {}) {
|
||||||
...options,
|
...options,
|
||||||
mutationFn: deleteOutfit,
|
mutationFn: deleteOutfit,
|
||||||
onSuccess: (emptyData, id, context) => {
|
onSuccess: (emptyData, id, context) => {
|
||||||
queryClient.invalidateQueries({ queryKey: ["outfits", String(id)] });
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: ["outfits", String(id)],
|
||||||
|
});
|
||||||
if (options.onSuccess) {
|
if (options.onSuccess) {
|
||||||
options.onSuccess(emptyData, id, context);
|
options.onSuccess(emptyData, id, context);
|
||||||
}
|
}
|
||||||
|
@ -42,7 +44,9 @@ async function loadSavedOutfit(id) {
|
||||||
const res = await fetch(`/outfits/${encodeURIComponent(id)}.json`);
|
const res = await fetch(`/outfits/${encodeURIComponent(id)}.json`);
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
throw new Error(`loading outfit failed: ${res.status} ${res.statusText}`);
|
throw new Error(
|
||||||
|
`loading outfit failed: ${res.status} ${res.statusText}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.json().then(normalizeOutfit);
|
return res.json().then(normalizeOutfit);
|
||||||
|
@ -54,6 +58,7 @@ async function saveOutfit({
|
||||||
speciesId,
|
speciesId,
|
||||||
colorId,
|
colorId,
|
||||||
pose,
|
pose,
|
||||||
|
altStyleId,
|
||||||
wornItemIds,
|
wornItemIds,
|
||||||
closetedItemIds,
|
closetedItemIds,
|
||||||
}) {
|
}) {
|
||||||
|
@ -65,6 +70,7 @@ async function saveOutfit({
|
||||||
color_id: colorId,
|
color_id: colorId,
|
||||||
pose: pose,
|
pose: pose,
|
||||||
},
|
},
|
||||||
|
alt_style_id: altStyleId,
|
||||||
item_ids: { worn: wornItemIds, closeted: closetedItemIds },
|
item_ids: { worn: wornItemIds, closeted: closetedItemIds },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -91,7 +97,9 @@ async function saveOutfit({
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
throw new Error(`saving outfit failed: ${res.status} ${res.statusText}`);
|
throw new Error(
|
||||||
|
`saving outfit failed: ${res.status} ${res.statusText}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.json().then(normalizeOutfit);
|
return res.json().then(normalizeOutfit);
|
||||||
|
@ -106,7 +114,9 @@ async function deleteOutfit(id) {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
throw new Error(`deleting outfit failed: ${res.status} ${res.statusText}`);
|
throw new Error(
|
||||||
|
`deleting outfit failed: ${res.status} ${res.statusText}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,8 +127,11 @@ function normalizeOutfit(outfit) {
|
||||||
speciesId: String(outfit.species_id),
|
speciesId: String(outfit.species_id),
|
||||||
colorId: String(outfit.color_id),
|
colorId: String(outfit.color_id),
|
||||||
pose: outfit.pose,
|
pose: outfit.pose,
|
||||||
|
altStyleId: outfit.alt_style_id ? String(outfit.alt_style_id) : null,
|
||||||
wornItemIds: (outfit.item_ids?.worn || []).map((id) => String(id)),
|
wornItemIds: (outfit.item_ids?.worn || []).map((id) => String(id)),
|
||||||
closetedItemIds: (outfit.item_ids?.closeted || []).map((id) => String(id)),
|
closetedItemIds: (outfit.item_ids?.closeted || []).map((id) =>
|
||||||
|
String(id),
|
||||||
|
),
|
||||||
creator: outfit.user ? { id: String(outfit.user.id) } : null,
|
creator: outfit.user ? { id: String(outfit.user.id) } : null,
|
||||||
createdAt: outfit.created_at,
|
createdAt: outfit.created_at,
|
||||||
updatedAt: outfit.updated_at,
|
updatedAt: outfit.updated_at,
|
||||||
|
|
|
@ -4,6 +4,7 @@ class Outfit < ApplicationRecord
|
||||||
class_name: 'ItemOutfitRelationship'
|
class_name: 'ItemOutfitRelationship'
|
||||||
has_many :worn_items, through: :worn_item_outfit_relationships, source: :item
|
has_many :worn_items, through: :worn_item_outfit_relationships, source: :item
|
||||||
|
|
||||||
|
belongs_to :alt_style, optional: true
|
||||||
belongs_to :pet_state, optional: true # We validate presence below!
|
belongs_to :pet_state, optional: true # We validate presence below!
|
||||||
belongs_to :user, optional: true
|
belongs_to :user, optional: true
|
||||||
|
|
||||||
|
@ -82,7 +83,8 @@ class Outfit < ApplicationRecord
|
||||||
|
|
||||||
def as_json(more_options={})
|
def as_json(more_options={})
|
||||||
serializable_hash(
|
serializable_hash(
|
||||||
only: [:id, :name, :pet_state_id, :starred, :created_at, :updated_at],
|
only: [:id, :name, :pet_state_id, :starred, :created_at, :updated_at,
|
||||||
|
:alt_style_id],
|
||||||
methods: [:color_id, :species_id, :pose, :item_ids, :user]
|
methods: [:color_id, :species_id, :pose, :item_ids, :user]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
5
db/migrate/20240201134440_add_alt_style_id_to_outfits.rb
Normal file
5
db/migrate/20240201134440_add_alt_style_id_to_outfits.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class AddAltStyleIdToOutfits < ActiveRecord::Migration[7.1]
|
||||||
|
def change
|
||||||
|
add_reference :outfits, :alt_style, null: true, foreign_key: true
|
||||||
|
end
|
||||||
|
end
|
15
db/schema.rb
15
db/schema.rb
|
@ -10,13 +10,13 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.1].define(version: 2024_01_29_114639) do
|
ActiveRecord::Schema[7.1].define(version: 2024_02_01_134440) do
|
||||||
create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
|
||||||
t.integer "species_id", null: false
|
t.integer "species_id", null: false
|
||||||
t.integer "color_id", null: false
|
t.integer "color_id", null: false
|
||||||
t.integer "body_id", null: false
|
t.integer "body_id", null: false
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", precision: nil, null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", precision: nil, null: false
|
||||||
t.index ["color_id"], name: "index_alt_styles_on_color_id"
|
t.index ["color_id"], name: "index_alt_styles_on_color_id"
|
||||||
t.index ["species_id"], name: "index_alt_styles_on_species_id"
|
t.index ["species_id"], name: "index_alt_styles_on_species_id"
|
||||||
end
|
end
|
||||||
|
@ -125,11 +125,11 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_29_114639) do
|
||||||
t.index ["outfit_id", "is_worn"], name: "index_item_outfit_relationships_on_outfit_id_and_is_worn"
|
t.index ["outfit_id", "is_worn"], name: "index_item_outfit_relationships_on_outfit_id_and_is_worn"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "item_translations", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
|
create_table "item_translations", id: :integer, charset: "latin1", collation: "latin1_swedish_ci", force: :cascade do |t|
|
||||||
t.integer "item_id"
|
t.integer "item_id"
|
||||||
t.string "locale"
|
t.string "locale"
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.text "description", size: :medium
|
t.text "description"
|
||||||
t.string "rarity"
|
t.string "rarity"
|
||||||
t.datetime "created_at", precision: nil
|
t.datetime "created_at", precision: nil
|
||||||
t.datetime "updated_at", precision: nil
|
t.datetime "updated_at", precision: nil
|
||||||
|
@ -191,6 +191,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_29_114639) do
|
||||||
t.string "image"
|
t.string "image"
|
||||||
t.string "image_layers_hash"
|
t.string "image_layers_hash"
|
||||||
t.boolean "image_enqueued", default: false, null: false
|
t.boolean "image_enqueued", default: false, null: false
|
||||||
|
t.bigint "alt_style_id"
|
||||||
|
t.index ["alt_style_id"], name: "index_outfits_on_alt_style_id"
|
||||||
t.index ["pet_state_id"], name: "index_outfits_on_pet_state_id"
|
t.index ["pet_state_id"], name: "index_outfits_on_pet_state_id"
|
||||||
t.index ["user_id"], name: "index_outfits_on_user_id"
|
t.index ["user_id"], name: "index_outfits_on_user_id"
|
||||||
end
|
end
|
||||||
|
@ -314,4 +316,5 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_29_114639) do
|
||||||
|
|
||||||
add_foreign_key "alt_styles", "colors"
|
add_foreign_key "alt_styles", "colors"
|
||||||
add_foreign_key "alt_styles", "species"
|
add_foreign_key "alt_styles", "species"
|
||||||
|
add_foreign_key "outfits", "alt_styles"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue